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

手动删除Lambda版本后CDK/CloudFormation堆栈部署失败的解决办法

解决CloudFormation引用已删除Lambda版本导致的部署报错问题

问题背景

我有一个通过CDK部署的Lambda堆栈,部署流程为:创建Lambda函数→生成函数版本→创建别名指向该版本。此前因Lambda存储限制,手动删除了早期的版本7,但CloudFormation堆栈仍保留着对版本7物理ID的引用。当前Lambda已更新至版本22,部署CDK代码时因找不到版本7报错,需在不删除重建Lambda函数的前提下解决该问题。

解决方案步骤

1. 调整CDK代码,避免绑定旧版本引用

首先修正版本与别名的创建逻辑,确保CDK不再依赖已删除的旧版本,同时保证每次部署都生成新版本并自动更新别名:

final Function function = Function.Builder.create(construct, InfraConstants.WEBHOOK_RECEIVER_LAMBDA)
        .runtime(Runtime.JAVA_11)
        .handler("com.org.test")
        .memorySize(1024)
        .timeout(Duration.seconds(100))
        .functionName(InfraConstants.WEBHOOK_RECEIVER_LAMBDA)
        .code(Code.fromAsset("src/main/resources/sample-java.jar"))
        .tracing(Tracing.PASS_THROUGH)
        .layers(layers)
        .environment(LambdaUtils.getEnvVariablesWebhookReceiver())
        .build();
LambdaUtils.enableSnapStart(function);

// 动态生成新版本,CDK会自动管理版本标识,避免固定绑定旧版本
Version newVersion = Version.Builder.create(construct, "WebhookReceiverLambdaVersion")
        .lambda(function)
        .build();

// 更新别名指向最新生成的版本
Alias alias = Alias.Builder.create(construct, "WebhookReceiverLambdaAlias")
        .aliasName("PROD") // 替换为你的实际别名名称
        .version(newVersion)
        .build();

2. 手动修正CloudFormation堆栈的无效引用

由于CloudFormation当前仍引用已删除的版本7,直接部署会失败,需手动更新堆栈资源引用:

  • 登录AWS控制台,进入CloudFormation服务,找到目标堆栈
  • 进入资源标签,定位到对应的Lambda Version资源(逻辑ID为你之前定义的versionId)
  • 通过变更集功能,将该版本资源的物理ID替换为当前存在的版本22的ARN(可从Lambda控制台的版本列表中获取完整ARN)
  • 或者使用AWS CLI执行变更集命令:
aws cloudformation create-change-set --stack-name YOUR_STACK_NAME --change-set-name UpdateLambdaVersion --template-body file://cdk.out/YOUR_STACK_TEMPLATE.json --parameters ParameterKey=LambdaVersionArn,ParameterValue=arn:aws:lambda:REGION:ACCOUNT_ID:function:WEBHOOK_RECEIVER_LAMBDA:22

替换命令中的YOUR_STACK_NAME、REGION、ACCOUNT_ID、WEBHOOK_RECEIVER_LAMBDA为实际值,模板文件路径以本地CDK输出为准

3. 重新部署CDK代码

完成上述修正后,执行CDK部署命令:

cdk deploy

此时CDK会生成新版本(如版本23)并更新别名指向该版本,CloudFormation堆栈的引用也会同步更新为有效版本,部署即可成功。

4. 后续预防措施

  • 禁止手动删除Lambda版本,通过CDK自动管理版本生命周期,或设置Lambda的版本保留策略
  • 确保版本的CDK逻辑ID为动态命名,避免固定名称导致堆栈绑定特定版本
  • 可使用CDK的自动版本化功能,让框架自动处理版本生成与别名更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:25:09