使用aws cloudformation package上传Lambda时如何自动删除旧版本?
方案1:配置S3生命周期规则(最简便,无需修改现有工作流)
这是无侵入的原生方案,不需要调整你现有的打包部署流程:
- 进入存放Lambda部署包的S3存储桶配置页,找到「生命周期规则」选项
- 新增规则,应用到你存放Lambda包的特定前缀(比如统一存
lambda-packages/前缀下就指定该前缀) - 按你的需求配置过期策略:
- 未开启存储桶版本控制:设置对象创建后N天自动删除,根据回滚需求一般设7~30天即可
- 已开启存储桶版本控制:额外添加非当前版本在变为非当前后N天自动删除规则,还可以配置最多保留N个最新版本,自动淘汰更早的版本
- 规则生效后S3会在后台自动清理符合条件的旧对象,无需手动操作。
方案2:在CI/CD工作流中增加清理步骤
如果你需要更精准的控制(比如只删除特定Lambda的旧版本,保留其他部署包),可以在部署流程中插入清理脚本:
- 执行
aws cloudformation package命令时,捕获输出中生成的新S3对象地址 - 用
aws s3 ls s3://<你的桶名>/<对应Lambda的前缀>/命令列出该路径下所有历史部署包 - 过滤掉本次新上传的包,以及你想要保留的最近N个版本的包
- 对剩下的旧包执行
aws s3 rm批量删除 - 简化的脚本参考示例(保留最近3个版本):
aws s3 ls s3://my-bucket/lambda/my-function/ | sort -r | awk 'NR>3 {print $4}' | xargs -I {} aws s3 rm s3://my-bucket/lambda/my-function/{}
注意事项
- 不要删除过新的部署包:CloudFormation栈回滚时需要用到对应版本的部署包,提前删除会导致回滚失败,建议至少保留最近5个版本或者7天内的所有版本
aws cloudformation package默认会用部署包内容的SHA256作为S3对象名,相同内容的包不会重复上传,所以重复打包相同代码不会产生冗余对象
内容的提问来源于stack exchange,提问作者Grodriguez
相关产品推荐
相关产品推荐

