如何通过Serverless Framework复用S3已有构件更新AWS CloudFormation栈
复用S3已有构件,仅更新CloudFormation栈的可行方案
如果只是修改了自定义资源、Lambda代码包完全没变化,想要复用S3中已上传的构件,只更新CloudFormation模板和栈配置,这里有几个实用的方法:
方法1:用--no-package参数直接部署
这是最省心的方式——Serverless Framework会跳过重新打包Lambda代码的步骤,直接读取之前部署后保留在.serverless目录里的状态文件(里面记录了已上传到S3的构件路径),然后仅生成更新后的CloudFormation模板,完成栈的更新。
执行命令:
serverless deploy --no-package
注意:要确保
.serverless目录还保留着上次部署的状态文件(比如serverless-state.json、cloudformation-template-update-stack.json),这些文件是Serverless定位S3已有构件的关键。
方法2:在serverless.yml中指定S3构件路径
手动在配置文件里为Lambda函数指定已有的S3构件URI,这样Serverless会直接复用该构件,不会重新打包上传。
全局配置(所有函数共用同一个S3构件)
package: artifact: s3://your-bucket-name/path/to/existing-package.zip functions: yourMainFunction: handler: handler.main yourSideFunction: handler: handler.sideTask
单个函数单独指定
如果不同函数有各自的构件,也可以在函数级别单独配置:
functions: yourMainFunction: handler: handler.main package: artifact: s3://your-bucket-name/path/to/main-function-package.zip
配置完成后,直接运行常规部署命令即可:
serverless deploy
方法3:用--no-upload参数跳过上传
如果你本地还保留着之前打包好的文件(比如.serverless/your-service.zip),且这个文件和S3上的构件完全一致,可以用--no-upload参数让Serverless跳过上传步骤,直接复用S3中已有的构件。
执行命令:
serverless deploy --no-upload
额外注意点
- 要是你修改了Lambda的配置项(比如内存大小、超时时间、环境变量)但没改代码,以上方法同样适用——这些配置属于CloudFormation模板的一部分,会被正常更新。
- 确保你的AWS账号权限足够:能读取指定的S3构件,同时有权执行CloudFormation栈的更新操作。
内容的提问来源于stack exchange,提问作者Mike Hogan
相关产品推荐
相关产品推荐

