如何手动回滚Lambda函数的CloudFormation部署?
咱们先把这两个问题拆开来聊,你提到的点其实挺关键的,很多人刚接触的时候都会有类似疑惑:
关于CloudFormation ChangeSet的保存与回滚认知
你的认知并没有错。CloudFormation 默认不会自动长期保存已执行的旧 ChangeSet——当你执行完一个 ChangeSet 后,它会进入 EXECUTED 状态,通常在7天后会被自动清理。而且更重要的是,ChangeSet 本身的设计是用来预览和执行单次变更的,它并不是为回滚而存在的。你没法直接通过“恢复旧 ChangeSet”来回到之前的栈状态,因为每个 ChangeSet 都是针对当前栈的特定变更请求生成的,旧的 ChangeSet 无法直接复用在已经变更后的栈上。
如何手动回滚有bug的Lambda部署
如果你的Lambda部署后发现有bug,想要手动回滚,有两种更可靠的方式:
方式一:利用CloudFormation栈的变更历史回滚
CloudFormation会完整记录栈的每一次成功变更,你可以直接回滚到之前的稳定状态:
- 控制台操作:找到你的CloudFormation栈,进入「变更历史」标签页,定位到最后一次成功的、没有bug的变更记录,点击右侧的「回滚」按钮,按照提示确认即可。
- CLI操作:使用命令
如果需要回滚到特定的历史版本,可以加上aws cloudformation rollback-stack --stack-name <你的栈名>--to-stack-version-id <目标版本ID>参数。
这种方式会让整个栈回到之前的状态,包括Lambda函数的代码、配置以及关联的其他资源。
方式二:利用Lambda的版本与别名管理(更灵活)
Lambda本身自带版本化能力,你可以在部署阶段就做好版本管控,回滚操作会更快捷,甚至不需要动整个CloudFormation栈:
- 在CloudFormation模板中,为Lambda函数配置
AWS::Lambda::Version资源,每次更新代码时,CloudFormation会自动生成一个新的Lambda版本(带有唯一的版本号)。 - 同时配置
AWS::Lambda::Alias资源,让业务流量指向这个别名(比如PROD)。当发现bug时,只需要修改别名的FunctionVersion属性,让它指向之前的稳定版本即可——这个操作可以直接在Lambda控制台完成,也可以通过CloudFormation提交一个小变更来实现。 - 这种方式的优势是,你可以快速切换Lambda版本,不会影响栈中的其他资源,适合只需要调整Lambda代码的场景。
另外补充一点:你提到的IAM权限问题导致的自动回滚,是CloudFormation的失败自动回滚机制——当变更执行过程中遇到错误(比如权限不足),栈会自动回退到变更前的状态。但这种机制只针对执行失败的场景,而你遇到的是变更成功但代码存在bug的情况,所以需要用上面的手动回滚方法来处理。
内容的提问来源于stack exchange,提问作者nuclear
相关产品推荐
相关产品推荐

