如何用单CloudFormation模板部署S3/ECR源Lambda函数
答案
可以通过单个原生CloudFormation模板实现需求,不需要引入CDK、Serverless框架等额外工具,也不需要拆分多个栈手动前置创建S3、ECR资源。
实现方式
所有资源直接在同一个模板内定义,通过资源依赖关系控制创建顺序即可:
- 针对存放在S3的Function A:
直接在模板中定义S3存储桶、Lambda Layer、Lambda函数、IAM执行角色资源,给Lambda、Layer资源配置DependsOn属性指向同模板内的S3桶,确保S3桶创建完成后再启动Lambda相关资源的部署。Lambda的代码配置项直接引用模板内S3桶的资源返回值,不需要硬编码提前创建的桶名。 - 针对存放在ECR的容器化Function B:
同样在模板内直接定义ECR镜像仓库资源,配置仓库权限允许Lambda服务拉取镜像,给Lambda函数配置DependsOn属性指向ECR仓库,确保仓库创建完成后再创建Lambda资源。
简化后的部署流程
原来4个栈的逻辑全部合并到单模板后,部署流程可以压缩到单脚本内完成,不需要单独维护S3、ECR的独立模板:
- 首次部署时,先执行CloudFormation部署命令,只创建S3桶、ECR仓库、IAM角色、Lambda Layer这类不依赖代码/镜像的基础资源,部署完成后可以直接从栈输出值拿到S3桶名、ECR仓库地址
- 本地构建Function A的代码包、Layer包,上传到对应S3路径;构建Function B的容器镜像,打标签后推送到对应ECR仓库
- 再次执行CloudFormation部署命令,传入S3代码版本、ECR镜像Tag参数,完成两个Lambda函数的创建/更新
后续迭代代码时,只需要重复步骤2、3即可,不需要再调整基础资源配置。
关键注意点
- 不要把S3、ECR拆分为独立栈或者嵌套栈,直接作为主模板的普通资源定义即可,多环境部署时只需要给栈名、资源名加上环境标识后缀,就能自动为每个环境生成独立的存储桶和镜像仓库,完全符合IaC规范
- 如果Function A的代码包体积小于4MB,可以直接把Zip包以内联形式写在模板的
Code.ZipFile字段里,连手动上传S3的步骤都可以省掉,部署时CloudFormation会自动完成代码上传 - 如果需要在删除栈时保留S3内的代码包、ECR内的镜像,记得给对应资源配置
DeletionPolicy: Retain,避免误删
这种实现方式最终只会生成1个CloudFormation栈,所有资源生命周期统一由CloudFormation管理,不需要额外维护多套模板和部署逻辑,比拆分4个栈的模式维护成本低很多。
内容的提问来源于stack exchange,提问作者marius
相关产品推荐
相关产品推荐

