AWS Lambda 引入递归循环检测 API 计算博客
AWS Lambda 新增递归循环检测 API
关键要点
AWS Lambda 现在提供递归循环检测 API,允许在单个 Lambda 函数上设置递归循环检测配置。用户可以关闭递归循环检测以支持故意使用递归模式的函数,从而避免干扰这些工作负载。此功能是出于对意外使用和费用产生的保护,即使 AWS 也建议用户在使用递归模式时须谨慎。今天,AWS Lambda 宣布推出新的递归循环检测 API,这使得用户可以为单个 Lambda 函数设定递归循环检测的配置。这意味着用户能够为那些故意使用递归模式的函数关闭递归循环检测,避免对这些工作负载造成干扰。随着 Lambda 对其它 AWS 服务扩展递归循环检测的支持,用户可以使用这些 API 来维持工作流的稳定。
概述
AWS Lambda 函数会响应各种 AWS 服务生成的事件而触发。这些 Lambda 函数可能会调用其他 AWS 服务的 API。通常,产生触发事件的服务和资源与 Lambda 函数所调用的服务和资源是不同的。然而,由于代码错误或配置问题,这两个资源可能意外地相同,导致无限递归循环。这种配置错误可能会导致过度使用,从而使您产生意外的费用。例如,一个 Lambda 函数处理来自 Amazon Simple Notification Service (SNS) 的消息,然后将结果通知重新发送到相同的 SNS 主题,这样便会导致无限循环。
Lambda 提供了一种内置的防护机制,会检测并阻止在 Lambda、Amazon Simple Queue Service (SQS) 和 SNS 之间运行的递归或无限循环。这一名为递归循环检测的功能,对所有 Lambda 函数默认启用,有效避免因运行过度而产生的意外使用和费用。
Lambda 通过 AWS XRay 的追踪头部来跟踪函数被调用的次数。当函数代码使用支持的 AWS SDK 版本发送事件时,Lambda 会在追踪信息中递增计数器。如果在同一次触发事件中,函数被调用次数超过16次,Lambda 将停止下次调用,并生成 CloudWatch 的 RecursiveInvocationsDropped 计量指标。如果函数是同步调用,Lambda 会将 RecursiveInvocationException 返回给调用者;对于异步调用,Lambda 会将事件发送到配置的死信队列或失败目标。
您无需配置活动的 XRay 追踪,便能使用此功能。如需更多信息及示例场景,请参考 检测和停止AWS Lambda函数中的递归循环。
尽管 AWS 一般不建议使用递归模式以避免潜在的过度使用,但部分客户故意在其工作流中采用递归模式。此前,客户如需关闭递归循环检测,仅能通过联系 AWS 支持进行账户级别的操作。现在,通过这些新的 API,客户可以选择在特定函数上关闭递归循环检测,同时对账户中其他不使用递归代码的函数保持该防护机制。
今天,AWS 推出了两个与递归循环检测相关的新 API 操作:
GetFunctionRecursionConfig:返回有关函数递归循环检测配置的详细信息。PutFunctionRecursionConfig:设置函数的递归循环检测配置。默认情况下,所有函数的递归循环检测均为开启状态。如何使用新递归循环检测 API
您可以通过 Lambda 控制台、AWS CLI 或基础设施即代码工具如 AWS CloudFormation、AWS Serverless Application ModelAWS SAM或 AWS Cloud Development KitCDK来配置 Lambda 函数的递归循环检测。此新配置选项在 AWS SAM CLI 版本 11230 和 CDK v21530 中均受支持。
若您为某一函数关闭递归循环检测,那么 RecursiveInvocationsDropped 的计量指标将不再为该函数生成。
关闭函数的递归循环检测意味着 Lambda 将不再防止由于配置错误造成的递归调用。这可能导致意外的使用和费用增加。您应探索其他架构方式以避免使用递归模式。AWS 建议在关闭此防护机制时保持谨慎。
在 Lambda 控制台上设置递归循环检测配置
您可按照以下步骤在 AWS Lambda 控制台中获取递归循环检测配置:
在 AWS Lambda 控制台,导航到 函数 页面,选择您故意使用递归模式的函数。选择 配置,递归循环检测控制在 并发和递归检测 部分中。默认情况下,所有函数的递归循环检测均已启用。您可以选择 编辑 来更改函数的配置。若要关闭函数的递归循环检测,请选择 允许递归循环,然后选择 保存。鲨鱼机场
使用 AWS CLI 设置递归循环检测配置
您可以通过以下 CLI 命令获取 Lambda 函数当前的递归循环检测配置:
bashaws lambda getfunctionrecursionconfig region AWSREGION functionname FUNCTIONNAME
通过以下 CLI 命令更新 Lambda 函数的递归循环检测配置:
bashaws lambda putfunctionrecursionconfig region AWSREGION functionname FUNCTIONNAME recursiveloop AllowTerminate
请确保在上述命令中为 AWSREGION 和 FUNCTIONNAME 设置适当的值。将 putfunctionrecursionconfig 参数设置为 Allow 将关闭默认的递归循环检测行为。设置为 Terminate 则恢复默认行为。
使用 AWS CloudFormation 设置递归循环检测配置
您可以通过在 CloudFormation 中设置 RecursiveLoop 资源属性来控制 Lambda 函数的递归循环检测配置。将此属性的值设置为 Allow 将关闭默认的递归循环检测行为。如果您希望恢复默认行为,请将此属性设置为 Terminate。以下是将 RecursiveLoop 设置为 Allow 的 CloudFormation 示例片段:
yamlLambdaFunction Type AWSLambdaFunction Properties Code S3Bucket S3BUCKET S3Key S3KEY Handler comexampleApphandleRequest MemorySize 1024 Role FnGetAtt LambdaFunctionRole Arn Runtime java17 RecursiveLoop Allow Timeout 20 TracingConfig Mode Active
将递归循环检测扩展到其他 AWS 服务
目前,递归循环检测能够在大约 16 次调用后检测并停止 Lambda、SQS 和 SNS 之间的循环。Lambda 计划将递归循环检测扩展到其他 AWS 服务。通过这些 API,您可以在特定使用递归模式的函数上关闭递归循环检测,以确保它们在未来其他 AWS 服务扩展此功能时不受影响。
您可以借助 CloudWatch 指标 RecursiveInvocationsDropped 来识别使用递归模式的函数:
为所有 Lambda 函数在 CloudWatch 指标 RecursiveInvocationsDropped 上设置 CloudWatch 警报。配置警报以在指标大于零的阈值时触发。有关设置警报的更多信息,请参考 CloudWatch 文档。您可以使用以下 CLI 命令设置此警报:bashaws cloudwatch putmetricalarm alarmname lambdarecursivealarm metricname RecursiveInvocationsDropped namespace AWS/Lambda statistic Sum period 60 threshold 0 comparisonoperator GreaterThanOrEqualToThreshold evaluationperiods 1 alarmactions arnofsnsnotificationtopic
当 Lambda 检测到递归调用时,将生成 RecursiveInvocationsDropped 指标,这将触发警报。请注意,Lambda 仅在循环中的所有服务都支持递归循环检测时才能检测并停止递归调用。访问 CloudWatch 控制台,确定哪些函数生成了 RecursiveInvocationsDropped 指标。在 浏览 选项卡中,在指标下选择按函数名查看,搜索 RecursiveInvocationsDropped。这将列出所有生成该指标的函数。确定该函数是否为意图采用递归策略的函数。如果是,请使用递归循环检测 API 关闭该函数的递归循环检测。结论
Lambda 递归循环检测能够自动检测并停止 Lambda 与受支持服务之间的递归调用,防止过度使用。在大多数情况下,您应构建工作负载以避免任何递归循环。在少数特殊情况下,您可能希望逐一关闭默认行为。递归循环检测 API 允许您为个别函数设置递归循环检测配置。
该功能在 AWS Lambda 支持递归循环检测的所有区域均可用。
如需了解更多有关这些 API 的信息,请参考 AWS Lambda API 参考。
欲获取更多无服务架构学习资源,请访问 Serverless Land
标签: 合作、无服务架构
发表评论