手动删除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
相关产品推荐
相关产品推荐

