AWS Lambda 为 SQS、SNS 和 Invoke API 引入递归循环检测

AWS Lambda 推出递归控制功能

AWS 最近在 AWS Lambda 中宣布了一项递归控制功能,用于检测并停止运行在递归或无限循环中的 Lambda 函数。该功能适用于与 Amazon Simple Queue Service (Amazon SQS)、Amazon Simple Notification Service (Amazon SNS) 集成的 Lambda 函数,或通过 Lambda 调用 API 直接调用的函数。

递归检测机制

Lambda 内部实现了一种检测机制,用于识别陷入递归循环的函数。当一个函数被同一个事件触发超过 16 次时,Lambda 将停止后续调用,并将该事件路由到死信队列 (DLQ) 或配置的失败目标。此外,如果用户配置了相关选项,他们将收到 AWS Health Dashboard 通知,其中包含故障排除步骤、电子邮件或 Amazon CloudWatch 告警。

技术支持与工作原理

该功能仅在函数使用支持的 AWS SDK 版本或更高版本时有效。Lambda 使用 AWS X-Ray 的 "Lineage" 跟踪头来记录函数被事件触发的次数。当函数代码使用支持的 AWS SDK 版本发送事件时,Lambda 会增加 Lineage 头中的计数器。如果同一事件触发的函数调用超过 16 次,Lambda 将停止该事件的下一次调用。此功能无需配置主动的 X-Ray 跟踪即可生效。

示例与处理建议

AWS 提供了一个 GitHub 示例,解释了在第 16 次调用后,Lambda 将向 ECMAScript (ES) 模块抛出 RecursiveInvocationException,从而停止调用 Lambda 函数,因为超过了 maxReceiveCount。SQS 会将消息移动到配置的 DLQ。

如果检测到递归调用并停止 Lambda 函数,AWS 建议修复底层问题,并通过 Lambda 控制台中的 "Throttle" 按钮或使用 PutFunctionConcurrency API 将并发设置为 0。此外,用户可以禁用或删除 Lambda 函数的事件源映射或触发器。

社区反应与扩展需求

Datadog 的工程师 AJ Stuyvenberg 和 Wiz 的解决方案架构师 Marek Kuczyński 对该功能表示赞赏,认为它可以防止因意外导致的无限循环和高昂成本。Fiserv 的 VP 架构师 Michael Brewer 则建议为开发者账户添加硬性支出上限,以防止账户被冻结。

Classmethod 的云工程师 Jatin Mehrotra 指出,该功能目前不支持 DynamoDB 和 S3 事件,只能通过 CloudWatch 告警来检测递归循环。

关闭功能与进一步信息

要关闭该功能,用户需要联系 AWS 支持。对于使用递归调用模式的用户,AWS Lambda 操作指南中提供了详细信息和最佳实践。

阅读 25
0 条评论