如何从SAM项目生成CloudFormation模板以调用createStack接口
正确上传CloudFormation模板及解决S3文件体积过大问题操作步骤
1 前置优化:减少打包文件体积(解决S3体积报错核心)
- 先清理SAM项目的冗余文件:构建前删除本地测试数据、依赖缓存、Node.js项目
node_modules目录下的开发依赖、Python项目的__pycache__目录、.git目录等非运行必需文件 - 分层打包依赖:运行时依赖单独打包为Lambda层,不要和业务代码一起打入SAM部署包,可减少90%以上的单包体积
- 开启sam build的优化参数:执行
sam build --cached --parallel,启用构建缓存和并行构建,避免重复打包冗余内容 - 如果是带二进制依赖的项目(比如Python依赖Pillow、Numpy),使用
sam build --use-container在AWS Lambda兼容的容器环境中构建,剔除宿主环境无关的冗余二进制文件
2 SAM转CloudFormation模板并正确上传的完整流程
- 第一步:完成项目构建,执行
sam build,确认构建产物在.aws-sam/build目录下无冗余文件 - 第二步:执行package命令时指定S3前缀、开启去重上传,命令参考:
sam package \ --s3-bucket <你的S3桶名> \ --s3-prefix <自定义路径前缀,比如sam-app/deployments> \ --output-template-file packaged-template.yaml \ --force-upload false
--force-upload false会跳过已经上传过的相同哈希的文件,避免重复上传占用空间;如果单模板文件超过CloudFormation的512KB限制,可添加--use-json输出压缩后的JSON格式模板,或使用嵌套模板拆分大模板为多个子模板
注意:CloudFormation直接支持SAM模板部署,不需要额外手动转换格式,sam package生成的模板已经是兼容CloudFormation API的标准格式,可直接调用
- 第三步:验证生成的
packaged-template.yaml文件完整性,将该模板上传后的S3路径传入Lambda中cloudformation.createStack()接口的TemplateURL参数即可 - 第四步:如果需要创建多个栈,在Lambda逻辑中复用同一个打包后模板的S3地址,每次调用
createStack时传入不同的栈名和参数即可,不需要重复打包上传模板
3 额外注意事项
- 如果单打包文件还是超过S3上传限制,检查是否误打包了大体积静态资源,静态资源单独上传到S3其他路径,不要打入部署包
- 确保S3桶和你要部署CloudFormation栈的区域属于同一区域,跨区域调用会增加传输体积校验失败的概率
内容的提问来源于stack exchange,提问作者Fernando Santiago
相关产品推荐
相关产品推荐

