我正在尝试将ecs集群从一个堆栈传递到另一个堆栈。
我收到此错误:
Error: Resolution error: Resolution error: Resolution error: Cannot use resource 'BackendAPIStack/BackendAPICluster' in a cross-environment fashion, the resource's physical name must be explicit set or use `PhysicalName.GENERATE_IF_NEEDED`.
集群在BackendAPIStack中的定义如下:
this.cluster = new ecs.Cluster(this, 'BackendAPICluster', {
vpc: this.vpc
});
堆栈定义如下:
const backendAPIStack = new BackendAPIStack(app, `BackendAPIStack${settingsForThisEnv.stackVersion}`, {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION
},
digicallPolicyQueue: digicallPolicyQueue,
environmentName,
...settingsForThisEnv
});
const metabaseStack = new MetabaseStack(app, 'MetabaseStack', backendAPIStack.vpc, backendAPIStack.cluster, {
vpc: backendAPIStack.vpc,
cluster: backendAPIStack.cluster
});
metabaseStack.addDependency(backendAPIStack);
这是metabaseStack的构造函数:
constructor(scope: cdk.Construct, id: string, vpc: ec2.Vpc, cluster: ecs.Cluster, props: MetabaseStackProps) {
super(scope, id, props);
console.log('cluster', cluster)
this.vpc = vpc;
this.cluster = cluster;
this.setupMetabase()
}
然后我在这里使用集群:
const metabaseService = new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'Metabase', {
assignPublicIp: false,
cluster: this.cluster,
...
我找不到有关如何做自己想做的事情的文件。
答案 0 :(得分:3)
您正在使用Stack
创建特定于地区/帐户的BackendAPIStack
,因为您是通过env
属性值将堆栈绑定到特定帐户和地区的。
然后,您通过创建没有任何MetabaseStack
道具价值的env
来创建地区/帐户-不可知堆栈。
通常,有两个这样的独立堆栈很好,但是在这里,您可以通过将引用从BackendAPIStack
传递到MetabaseStack
来将它们链接在一起无法正常工作。
这是一个问题,因为CDK通常通过执行值的堆栈导出和导入来将堆栈链接在一起,但是CloudFormation does not support cross-region or cross-account Stack references
因此,您可能的解决方案是:
MetabaseStack
设置为使用与BackendAPIStack
相同的帐户/区域
BackendAPICluster
的堆栈导出,然后MetabaseStack
将能够导入它。BackendAPICluster
。
new Cluster(..., {vpc: this.vpc, clusterName: 'backendCluster' })
MetabaseStack
。BackendAPICluster
和let CDK pick创建clusterName
clusterName
设置为 PhysicalName.GENERATE_IF_NEEDED
来完成的
new Cluster(..., {clusterName: PhysicalName.GENERATE_IF_NEEDED })
如果可能的话,我会选择(A)。我怀疑这只是一个疏忽,您没有将相同的env
值传递给MetabaseStack
,并且您可能希望这两个堆栈在同一区域中以减少延迟以及所有这些。>
如果不是,那么我个人将接下来使用(B2),因为我尝试不给我的任何资源明确的名称,除非它们是与另一组的某些合同的一部分。即假设帐户XYZ中名为“ ServiceWorker”的角色或从存储区“ ABC”中下载数据。