我必须部署一个堆栈,让我们将其称为一个区域中的父堆栈他们需要在另一个区域部署第二个堆栈(子堆栈(。第二个堆栈(子堆栈(的区域不能包括部署父堆栈的区域。第二个堆栈可以部署在多个区域中。
然而,第二个堆栈需要来自第一个堆栈的道具。具体来说,它需要一个ARN值。默认区域为us-east-1
。这就是父堆栈的部署位置。
为了解决这个问题,我尝试了以下
1-第一次尝试:使用cfnOutput
- 在父级和子级中创建
cfnOutput
,我用cdk.Fn.ImportValue()
捕获值 - 结果:如《CloudFormation用户指南》中所述,由于cfnOutput无法在不同区域的堆栈之间使用,因此出现错误
2-第二次尝试:使用StackProps
- 在继承自StackProps的父堆栈中创建一个接口,设置一个公共属性并将ARN值放在那里
来自lib/mystack文件
export interface myStackProps extends cdk.StackProps {
principalKeyArn: string
}
- 将值作为props与包含区域的env键一起传递到第二个堆栈,如下所示:
来自bin/myapp文件
const app = new cdk.App();
const regions = ["us-east-2"]
const primaryMRKey = new KmsMultiregionPrincipalKey(app, 'KmsMultiregionKeyStack')
for (let region of regions){
const envToDeploy = {region: region, account: "123456789123"}
new KmsReplicaKey(app, 'KmsReplicaKey-' + region, {env: envToDeploy, principalKeyArn: primaryMRKey.principalKeyArn } )
}
RESULT:只有部署到同一环境或嵌套堆栈与其父堆栈之间的堆栈才支持跨堆栈引用
问题:
- 如何解决在CDK中使用不同区域的堆栈之间传递跨堆栈引用的问题
[已编辑]这个问题的一个解决方案是使用SSM,如下所述。
提前感谢
将参数存储值与CustomResource一起使用。
这个答案有一个完整的跨区域引用的Typescript CDK示例。
(我最初是作为评论发布的,因为我认为这个问题可能是重复的。但经过思考,我发现链接的问题和标签只提到CloudFormation,而不是CDK。似乎社区从保持这个问题的存在中获得了最大的好处(。
CDK现在有了一个覆盖,允许在同一应用程序中的堆栈之间进行跨区域引用。
在两个堆栈中,将参数crossRegionReferences设置为true。
例如,具有全局CloudFront WAF:的堆栈1
new WafStack(app, 'waf', {
env: { region: 'us-east-1'},
crossRegionReferences: true // <-- Enable cross region references
})
对其他堆栈执行相同操作。
本期有一个例子:https://github.com/aws/aws-cdk/issues/22820