You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让CloudFormation生成变更集以更新已存在的Lambda函数?

解决CloudFormation变更集无法识别Lambda代码更新的问题

你遇到的核心问题是:CloudFormation只会对比模板中CodeUri的字符串值,不会主动检查S3桶里对应文件的内容是否更新。所以即使你上传了新的代码到同一个S3路径,只要模板里的CodeUri没变化,CloudFormation就会认为没有资源需要更新,生成空变更集。

结合你的SAM模板和部署流程,这里有几个可行的解决方案:

方案1:使用S3版本控制并在模板中指定版本ID

这个方法利用S3的版本特性,让每次上传的代码都有唯一的版本ID,通过更新模板中CodeUri的版本参数来触发CloudFormation变更:

  1. 首先开启你的S3桶mybucket的版本控制(可在S3控制台操作,或执行命令:aws s3api put-bucket-versioning --bucket mybucket --versioning-configuration Status=Enabled)
  2. 在Solano CI的构建阶段,上传完代码zip到S3后,用AWS CLI获取该文件的版本ID:
    VERSION_ID=$(aws s3api head-object --bucket mybucket --key mydirectory/mylambdacode.zip --query VersionId --output text)
    
  3. 动态修改你的samTemplate.yml中的CodeUri,添加版本ID参数:
    CodeUri: s3://mybucket/mydirectory/mylambdacode.zip?versionId=${VERSION_ID}
    
  4. 将更新后的模板传递给CodePipeline的部署阶段,这样每次版本ID变化,CloudFormation就能识别到变更,生成包含Lambda更新的变更集。

方案2:生成带唯一标识的代码包文件名

每次构建时给zip文件添加唯一后缀(比如Git提交哈希、时间戳),通过改变CodeUri的路径来触发更新:

  1. 在Solano CI的构建阶段,获取当前Git提交的短哈希值:
    GIT_HASH=$(git rev-parse --short HEAD)
    
  2. 将代码打包为带哈希后缀的文件,比如mylambdacode-${GIT_HASH}.zip
  3. 上传这个新文件到S3的mydirectory/路径下
  4. 更新samTemplate.yml中的CodeUri为:
    CodeUri: s3://mybucket/mydirectory/mylambdacode-${GIT_HASH}.zip
    
  5. 用更新后的模板执行CloudFormation变更集操作,因为路径每次都不同,CloudFormation会触发Lambda函数的代码更新,同时你的AutoPublishAlias: Staging会自动将新版本发布到Staging别名。

额外说明

你手动用aws lambda update-function-code能成功,是因为这个命令直接向Lambda服务推送新代码,不需要依赖CloudFormation的模板属性对比逻辑。而CloudFormation的变更检测严格基于模板中定义的属性值,所以必须让CodeUri的属性值发生变化才能触发更新。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:12:44