问题描述
我们有 ECS farget 服务堆栈,我们想在其中导出 serviceName,例如:
In stack1:
new cdk.CfnOutput(this,'EcsServiceExportName',{
value: this.service.serviceName,exportName: "EcsExportName"
});
this.service.serviceName 是 CDK 创建的物理名称。
Fn.importValue(ECS_PROD_SERVICE_EXPORT_NAME)
我们的管道先部署 stack2,然后部署 stack1。
如何在单个部署中部署此代码更改?
CDK 会更改物理名称吗?如果它正在更改物理名称,我们将在部署 Stack2 时遇到问题,因为 Stack1 使用“EcsExportName”。
[注意:我们总是更新我们的服务]
解决方法
当单个 CDK 项目有多个堆栈,我们需要跨堆栈引用资源时,
我们可以直接引用对象,而不是在另一个堆栈中手动导出和导入,如文档化here
const stack1 = new StackThatProvidesABucket(app,'Stack1',{ env: prod });
// stack2 will take a property { bucket: IBucket }
const stack2 = new StackThatExpectsABucket(app,'Stack2',{
bucket: stack1.bucket,env: prod
});
cdk deploy
将根据这些引用自动对堆栈进行排序,并按必要的顺序执行它们。
如果我们用CfnOutput
手动导出和导入,需要手动将栈分别作为cdk deploy Stack1
和cdk deploy Stack2