Amazon cloudformation 解析错误:无法使用资源';x';以跨环境的方式,资源';的物理名称必须显式设置

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 }

我正在尝试将ecs群集从一个堆栈传递到另一个堆栈

我得到这个错误:
错误:解析错误:解析错误:解析错误:无法以跨环境方式使用资源'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”下载数据