此功能适用于 Lambda 与Amazon Simple Queue Service (Amazon SQS)、Amazon Simple Notification Service (Amazon SNS) 集成,或者直接通过 Lambda invoke API调用函数时。在 Lambda 中,实现了一种检测机制来识别似乎陷入递归循环的函数。当同一事件触发某个函数超过 16 次时,Lambda 将停止后续调用,并将事件路由到死信队列 (DLQ) 或故障目的地。此外,如果配置,用户将收到AWS Health Dashboard通知,其中包含故障排除步骤、电子邮件或Amazon CloudWatch警报。
显示 Lambda 可以检测到的一些循环示例的图表(来源:AWS Lambda 开发人员指南)
关于该功能的 AWS 计算博客文章的作者解释说,该功能仅在函数使用受支持的 AWS 开发工具包版本之一或更高版本时才有效:
Lambda 使用名为“Lineage”的AWS X-Ray跟踪标头原语来跟踪通过事件调用函数的次数。当您的函数代码使用支持的 AWS 开发工具包版本发送事件时,Lambda 会递增沿袭标头中的计数器。如果随后使用同一触发事件调用您的函数超过 16 次,Lambda 将停止该事件的下一次调用。您无需配置主动 X 射线跟踪即可使用此功能。
在同一篇博客文章中,作者提供了一个可在 GitHub 上获取的示例,其中解释了在第 16 次调用后,Lambda 将向 ECMAScript (ES) 模块 (ESM) 抛出 RecursiveInvocableException,由于超过 maxReceiveCount,该模块将停止调用 Lambda函数。SQS 将消息移动到配置了 DLQ 的源队列。
假设发生递归检测并且 Lambda 函数停止。在这种情况下,该公司建议修复根本问题,并通过选择 Lambda 控制台中的“Throttle”按钮或使用PutFunctionConcurrency API将并发设置为 0 。此外,用户可以禁用或删除 Lambda 函数的事件源映射或触发器。
Datadog 和 AWS Serverless Hero 的高级工程师AJ Stuyvenberg发推文:新功能:Lambda 具有递归循环检测功能!现在,如果您不小心导致无限循环,您的函数将不会超出最大并发限制。
Wiz 的解决方案架构师Marek Kuczyński回应道:哇——这太大了!看到太多退款案例,因为人们创建了一个调用循环。当由于配置错误或编写 Lambda 代码时出现错误而发生递归循环时,Lambda 函数的早期成本可能会很高。现在可以防止这种情况发生,因为 Lambda 函数默认启用递归循环检测,Fiserv 平台工程副总裁架构师研究员Michael Brewer在推文中补充道:现在请添加硬性支出上限。至少对于开发者帐户来说是这样。一旦达到支出限额,账户就应该被冻结。要么是那个帐户,要么是沙箱帐户。
最后, Classmethod 的云工程师Jatin Mehrotra在博客文章的末尾表示:目前,Dynamodb 和 S3 事件等其他服务不支持此功能。对于 Dynamodb 和 S3,检测递归循环的唯一方法是使用 Cloudwatch 警报。请记下这一点。
最后,要关闭该功能,用户必须联系AWS Support。此外,有关使用递归调用模式的详细信息,请参阅AWS Lambda 操作员指南中导致 Lambda 函数失控的递归模式。