aw -cdk从堆栈中删除另一个堆栈中使用的资源



试着理解CDK的一个奇怪行为:

我有2个堆栈

StackA→定义资源outA

StackB→定义资源outB -它依赖于资源outA

第一个'CDK部署'运行没有任何问题。

现在我通过删除'outA'资源并创建一个新的资源调用' outnew '来改变StackA并更新StackB以使用这个新值

此时我无法部署任何堆栈!如果我尝试部署StackA得到错误:

导出outA不能删除,因为它正在被StackB和StackC使用

,如果尝试部署StackB,它首先尝试部署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",
});
} 
}

StackB:

export class CdkDependenciesStackB extends cdk.Stack {
public out_b: cdk.CfnOutput;
constructor(
scope: cdk.Construct,
id: string,
outputValue: cdk.CfnOutput,
props?: cdk.StackProps
) {
super(scope, id, props);
this.out_b = new cdk.CfnOutput(this, "out_b", {
value: `outB_${outputValue.importValue}`,
exportName: "outB",
});
}
}

应用程序:

const app = new cdk.App();
const stack_a = new stacks.CdkDependenciesStackA(
app,
"CdkDependenciesStack",
{}
);
const stack_b =new stacks.CdkDependenciesStackB(
app,
"CdkDependenciesStackB",
stack_a.out_a_new,
{}
);
stack_b.addDependency(stack_a)

这似乎是CDK用户群中常见的问题。帮助我的解决方案描述在https://aws-blog.de/2020/09/deployment-issues-with-cross-stack-dependencies-and-the-cdk.html

由于首先部署了导出值的堆栈,因此您仍然需要保留原始导出,以便

  • 可以部署导出堆栈以导出新值
  • 可以部署导入堆栈来导入新值并停止导入旧值

之后可以停止导出旧值。

这是栈依赖,它可以是一个真正的大熊处理。你必须把你的堆栈放回原来的值。然后在第二个堆栈中添加一个虚拟值(这取决于原始资源)并推入它。然后将它从原始堆栈中移除并替换它,然后在第二个堆栈中替换它。

但是,如果这两个堆栈总是相互依赖,那么更好的方法是将它们都设置为nestedstack,并将它们放在同一个公共堆栈中,以便同时部署。仍然在代码中保持分离,但所有内容都部署在一起。

如果这是一个问题(全部部署在一起),您可以通过使用以from开始的各种方法从另一个堆栈导入资源,而不是依赖于它作为传递的参数来破解它。由于许多from方法无法获取所有信息,这很容易导致许多其他问题(黑客通常会这样做),此外,除非您自己设置某种自动命名方案,否则很难部署多个环境。(CDK的一个关键奖励)

最新更新