Amazon cloudformation 解析错误:无法使用资源';x';以跨环境的方式,资源';的物理名称必须显式设置
我正在尝试将ecs群集从一个堆栈传递到另一个堆栈 我得到这个错误:Amazon cloudformation 解析错误:无法使用资源';x';以跨环境的方式,资源';的物理名称必须显式设置,amazon-cloudformation,aws-cdk,Amazon Cloudformation,Aws Cdk,我正在尝试将ecs群集从一个堆栈传递到另一个堆栈 我得到这个错误: 错误:解析错误:解析错误:解析错误:无法以跨环境方式使用资源'BackendAPIStack/BackendAPICluster',资源的物理名称必须显式设置或使用'PhysicalName.GENERATE'(如果需要)。 集群在BackendAPIStack中定义如下: this.cluster = new ecs.Cluster(this, 'BackendAPICluster', { vpc: this.vpc }
错误:解析错误:解析错误:解析错误:无法以跨环境方式使用资源'BackendAPIStack/BackendAPICluster',资源的物理名称必须显式设置或使用'PhysicalName.GENERATE'(如果需要)。
集群在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,
...
我找不到有关如何执行我尝试执行的操作的文档。您正在使用
BackendAPIStack
创建特定于区域/帐户的堆栈,因为您正在通过env
属性值将堆栈绑定到特定的帐户和区域
然后通过创建不带任何env
prop值的MetabaseStack
来创建一个区域/帐户-不可知的堆栈
一般来说,像这样拥有两个独立的堆栈是可以的,但是在这里,您通过将引用从后端apistack
传递到元数据库堆栈
来将它们链接在一起,这是行不通的
这是一个问题,因为CDK通常通过执行堆栈导出和值导入将堆栈链接在一起,但不支持CloudFormation
因此,您可能的解决方案是:
- (A) 设置您的
MetabaseStack
以使用与BackendAPIStack
- 在引擎盖下,这将把集群的ARN设置为从
BackendAPICluster
导出堆栈,然后MetabaseStack
将能够导入它
- (B1)使用您选择的创建
BackendAPICluster
。
- i、 e.
newcluster(…,{vpc:this.vpc,clusterName:'backendCluster'})
- 通过不提供名称,您使用了默认的“CloudFormation-generated-name”,这是CDK报告的问题的基础,尽管以一种令人困惑的方式
- 如果您确实提供了一个名称,那么集群的ARN是确定性的(在部署时不是由CloudFormation选择的),因此CDK在构建时有足够的信息来确定集群的ARN是什么,并且可以将其提供给您的
元数据库堆栈
- (B2)使用
clusterName创建BackendAPICluster
,以及
- 这是通过将
clusterName
设置为PhysicalName来实现的。如果需要,生成
- i、 e.
newcluster(…,{clusterName:PhysicalName.GENERATE_如果需要})
- PhysicalName.GENERATE_IF_NEEDED是一个标记,指示只有在跨环境引用需要物理(名称)时,才由CDK生成。否则,它将由CloudFormation分配
- 这就是错误想要告诉你的,但我也不明白
如果可能的话,我会选择A。我怀疑这只是一个疏忽,您没有将相同的env
值传递给MetabaseStack
,您可能希望这两个堆栈位于同一区域以减少延迟等等
如果不是,那么我个人接下来会使用(B2),因为我尽量不给我的任何资源明确的名称,除非它们是与另一个组签订的合同的一部分。即,在帐户XYZ中担任名为“ServiceWorker”的角色,或从Bucket“ABC”下载数据