在使用 AWS CloudFormation 实施由 AWS Lambda 支持的自定义资源时,我想遵循最佳实践。
解决方法
当您使用 CloudFormation 实施由 Lambda 支持的自定义资源时,请使用以下最佳实践。
构建您的自定义资源以报告、记录和处理故障
异常可能会导致您的函数代码在不发送响应的情况下退出。CloudFormation 需要 HTTPS 响应以确认操作是成功还是失败。未报告的异常会导致 CloudFormation 等到操作超时后才开始堆栈回滚。如果在回滚期间再次出现异常,则 CloudFormation 会再次等待超时,然后以回滚失败结束。在此期间,您不能使用您的堆栈。
为避免超时问题,请在为 Lambda 函数创建的代码中包含以下元素:
- 处理异常的逻辑
- 能够对故障排除场景记录故障
- 能够通过 HTTPS 响应对 CloudFormation 作出响应以确认操作失败
- 允许您捕获和处理未完成的运行的死信队列
- 用于向 CloudFormation 发送响应的 cfn-response 模块
设置合理的超时期限,并在即将超过期限时进行报告
如果操作未在其定义的超时期限内运行,则该函数会引发异常,并且不会向 CloudFormation 发送响应。
要解决此错误,请执行以下操作:
- 将 Lambda 函数的超时值设置得足够高,以应对处理时间和网络条件的变化。
- 在函数中设置计时器,以便在函数即将超时时对 CloudFormation 作出响应并显示错误。
围绕创建、更新和删除事件进行构建
根据堆栈操作,CloudFormation 会向您的函数发送创建、更新或删除事件。由于每个事件的处理方式不同,因此请确保您的函数接收三种事件类型之一时没有意外行为。
有关详细信息,请参阅自定义资源请求类型。
了解 CloudFormation 如何识别和替换资源
当更新取代物理资源时,CloudFormation 会将您的 Lambda 函数返回的 PhysicalResourceId 与之前的 PhysicalResourceId 进行比较。如果 ID 不同,则 CloudFormation 假定该资源替换为新的物理资源。
但是,为了允许潜在的回滚,CloudFormation 不会移除旧资源。堆栈更新完成后,CloudFormation 会发送以旧物理 ID 作为标识符的删除事件请求。如果堆栈更新失败并发生回滚,则 CloudFront 会在删除事件中发送新的物理 ID。
使用 PhysicalResourceId 唯一标识资源,以便当您的函数收到删除事件时,该函数在替换期间仅删除正确的资源。
使用幂等性设计函数
您可以用相同的输入多次重复](https://repost.aws/zh-Hans/knowledge-center/lambda-function-idempotent)幂等函数[,结果与只做一次相同。幂等性可确保重试、更新和回滚不会创建重复资源或引入错误。
例如,CloudFormation 调用您的函数以创建资源,但不会收到资源已成功创建的响应。CloudFormation 可能会再次调用该函数,然后创建第二个资源。然后,第一个资源可能会变得孤立。
实施您的处理程序以正确处理回滚
当堆栈操作失败时,CloudFormation 会尝试将所有资源恢复到以前的状态。此操作会导致不同的行为,具体取决于更新是否导致资源替换。
为确保 CloudFront 能够完成回滚,请执行以下操作:
相关信息
自定义资源