CloudFormation中如何回滚AWS Lambda通过SDK做出的资源变更
关于AWS Lambda动态创建资源的回滚问题解答
核心问题解答
原生CloudFormation的堆栈回滚能力无法自动同步回滚Lambda运行时通过AWS SDK创建的资源。
原因是CloudFormation仅会跟踪自身模板中显式定义的资源,Lambda在运行过程中动态调用API创建的S3桶、IAM策略等资源,不在CloudFormation的堆栈资源清单内,因此执行stack rollback操作时,CloudFormation无法感知这些动态资源的存在,自然不会自动处理。
自定义回滚方案实现步骤
你可以通过「资源记录+CloudFormation自定义资源」的方式实现需求,具体操作如下:
- 提前在你的CloudFormation模板中创建一个DynamoDB表,作为动态资源的元数据存储库。每次Lambda通过SDK创建资源后,立即将资源的ARN、所属区域、创建时间、关联堆栈ID等信息写入该表,确保所有动态创建的资源都有可追溯的记录。
- 将该Lambda配置为CloudFormation**自定义资源(Custom Resource)**的处理函数。配置完成后,CloudFormation在执行堆栈创建、更新、删除/回滚操作时,都会主动向该Lambda发送对应事件类型的触发请求,删除/回滚场景下发送的事件类型为
Delete。 - 在Lambda代码中新增
Delete事件的处理逻辑:- 收到
Delete事件时,首先从DynamoDB表中筛选出所有关联当前堆栈ID的资源记录 - 按照「创建顺序倒序」的规则调用对应AWS SDK删除资源,存在依赖关系的资源要优先清理依赖(比如删除S3桶前要先清空桶内所有对象、版本文件)
- 每成功删除一个资源就删除DynamoDB中对应的记录,所有资源清理完成后向CloudFormation回传操作成功的信号,堆栈回滚/删除流程即可正常完成
- 收到
- 额外注意:删除逻辑中要加入重试和错误捕获机制,遇到资源被占用、权限不足等异常时要记录错误日志并发送告警,避免直接返回失败导致整个CloudFormation堆栈卡住。
内容的提问来源于stack exchange,提问作者Dean
相关产品推荐
相关产品推荐

