jez*_*nag 3 aws-cloudformation aws-cdk
我正在尝试将 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
});
Run Code Online (Sandbox Code Playgroud)
堆栈定义如下:
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);
Run Code Online (Sandbox Code Playgroud)
这是 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()
}
Run Code Online (Sandbox Code Playgroud)
然后我在这里使用集群:
const metabaseService = new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'Metabase', {
assignPublicIp: false,
cluster: this.cluster,
...
Run Code Online (Sandbox Code Playgroud)
我找不到有关如何做我正在尝试做的事情的文档。
Mat*_*ein 10
您正在创建特定Stack于区域/帐户的with,BackendAPIStack因为您通过envprop 值将堆栈绑定到特定帐户和区域。
然后,您通过创建不带任何prop 值的值来创建区域/帐户不可知堆栈。MetabaseStackenv
在一般情况下,有两个独立的像这样的栈是好的,但在这里,你通过传递从参考他们连接起来BackendAPIStack的MetabaseStack,这是行不通的。
这是一个问题,因为 CDK 通常通过执行值的堆栈导出和导入将堆栈链接在一起,但 CloudFormation不支持跨区域或跨账户堆栈引用
因此,您可能的解决方案是:
MetabaseStack使用与您相同的帐户/地区BackendAPIStack
BackendAPICluster,然后MetabaseStack将能够导入它。BackendAPICluster使用您选择的clusterName创建。
new Cluster(..., {vpc: this.vpc, clusterName: 'backendCluster' })MetabaseStack.BackendAPICluster用 a创建clusterName并让 CDK 选择
clusterName为 PhysicalName.GENERATE_IF_NEEDED
new Cluster(..., {clusterName: PhysicalName.GENERATE_IF_NEEDED })如果可能的话,我会选择(A)。我怀疑无论如何这只是一个疏忽,您没有将相同的env值传递给MetabaseStack并且您可能希望同一区域中的这两个堆栈都减少延迟等等。
如果没有,那么我个人接下来会选择 (B2),因为我尽量不给我的任何资源提供明确的名称,除非它们是与另一组合同的一部分。即在帐户 XYZ 中承担名为“ServiceWorker”的角色或从 Bucket 'ABC' 下载数据。
| 归档时间: |
|
| 查看次数: |
2493 次 |
| 最近记录: |