AWS-CDK:在 AWS-CDK 中的多区域(跨区域)堆栈之间传递跨堆栈引用属性

Mas*_*use 11 amazon-web-services aws-cloudformation amazon-kms aws-cdk

我必须部署一个堆栈,我们将其称为一个区域中的父堆栈。需要在另一个区域中部署第二个堆栈(子堆栈)。第二个堆栈(子堆栈)的区域不能包含部署父堆栈的区域。第二个堆栈可以部署在多个区域。

然而,第二个堆栈需要来自第一个堆栈的道具。具体来说,它需要一个 ARN 值。默认区域是us-east-1. 这就是部署父堆栈的地方。

为了解决这个问题我尝试了以下方法

1-第一次尝试:使用 cfnOutput

  • 在父级和子级中创建了一个cfnOutput 我捕获的值cdk.Fn.ImportValue()
  • 结果:出现错误,因为 cfnOutput 无法在不同区域的堆栈之间使用,如CloudFormation 用户指南中所述

2-第二次尝试:使用 StackProps

  • 在父堆栈中创建一个继承自 StackProps 的接口,设置公共属性并将 ARN 值放在那里

来自 lib/mystack 文件

export interface myStackProps extends cdk.StackProps {
 principalKeyArn: string
}
Run Code Online (Sandbox Code Playgroud)
  • 将值作为 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  } )

}
Run Code Online (Sandbox Code Playgroud)

结果:仅支持部署到同一环境或嵌套堆栈与其父堆栈之间的堆栈的跨堆栈引用

问题

  • 如何解决在 CDK 中使用不同区域的堆栈之间传递跨堆栈引用的问题?

[已编辑] 此问题的一种解决方案是使用 SSM,如下所述。

提前致谢

fed*_*nev 8

将 Parameter Store 值与CustomResource结合使用。

这个答案有一个跨区域参考的完整 Typescript CDK 示例。

(我最初将其作为评论发布,因为我认为这个问题可能是重复的。但经过反思,我发现链接的问题标签提到了 CloudFormation,而不是 CDK。似乎社区从保留这个问题中获得了最大的利益)。


com*_*day 8

CDK 现在具有替代功能,允许同一应用程序中的堆栈之间进行跨区域引用。

在两个堆栈中将参数crossRegionReferences设置为 true。

例如,具有全局 CloudFront WAF 的堆栈 1:

new WafStack(app, 'waf', {
  env: { region: 'us-east-1'},
  crossRegionReferences: true // <-- Enable cross region references
})
Run Code Online (Sandbox Code Playgroud)

对其他堆栈执行相同操作。

本期有一个示例: https ://github.com/aws/aws-cdk/issues/22820