AWS CDK跨栈依赖旧资源删除后无法部署问题如何解决?
解决方案
这是CloudFormation跨栈导出的固有约束:只要某个导出值被其他栈导入引用,就不允许直接删除导出值,同步修改两个栈的代码后会触发部署顺序死锁,以下是官方推荐的无中断迁移方案:
迁移步骤
- 第一步:临时恢复StackA的旧导出
outA配置,同时保留新增的outAnew导出,StackB暂时保持对旧outA的引用
StackA调整后代码:
执行命令部署StackA:export class CdkDependenciesStackA extends cdk.Stack { public out_a: cdk.CfnOutput; public out_a_new: cdk.CfnOutput; constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); this.out_a = new cdk.CfnOutput(this, "out_a", { value: "outA", exportName: "outA", }); this.out_a_new = new cdk.CfnOutput(this, "out_a_new", { value: "outAnew", exportName: "outAnew", }); } }
此时新旧导出同时存在,不会触发删除冲突。cdk deploy CdkDependenciesStack - 第二步:修改StackB和App入口配置,将依赖从
outA切换为outAnew(即你当前已修改的StackB和App代码),执行命令部署StackB:
部署完成后StackB不再引用旧的cdk deploy CdkDependenciesStackBoutA导出。 - 注意:如果报错中提到的StackC也引用了
outA,需要同步完成StackC的导出切换和部署。 - 第三步:删除StackA中旧
outA的相关代码,仅保留outAnew,执行命令再次部署StackA:
此时旧导出已无任何栈引用,可安全删除,迁移完成。cdk deploy CdkDependenciesStack
内容的提问来源于stack exchange,提问作者y. bs
相关产品推荐
相关产品推荐

