在第二个云形成堆栈中重用在一个云形成堆栈中创建的 Elastic Beanstalk 资源

Reuse Elastic Beanstalk resource creating in one cloud formation stack in a second cloud formation stack

我有一个创建 Elastic Beanstalk 应用程序的现有云形成堆栈:

 Resources:
   EBApplication:
     Type: AWS::ElasticBeanstalk::Application
     Properties:
       ApplicationName: !Ref ApplicationName
       Description: "AWS Elastic Beanstalk Account Balance application"

我想在另一个堆栈中使用这个资源,所以我在同一个 yaml 文件的末尾导出它:

Outputs:
  EBApplicationName:
    Value: !Ref EBApplication
    Export:
      Name: card-balance-EBApplicationName

现在在我的第二个云形成堆栈中,我要使用弹性 beantalk 资源,我正在尝试:

Resources:
  EBApplication:
    Type: AWS::ElasticBeanstalk::Application
    Properties:
      ApplicationName: !ImportValue 
            'Fn::Sub': 'card-balance-EBApplicationName'

但我收到一条错误消息,指出应用程序名称已被使用,因为它正在尝试创建一个新的 Elastic Beanstalk 应用程序(相同)而不是重复使用第一个应用程序。我做错了什么?

编辑 This question here有类似的问题。本质上我想要 2 个独立的堆栈 - 每个环境一个 - 但它们在同一个 EB 应用程序下。看来这个人做到了这一点,请参阅他们在答案下的评论 How to create multiple Elasticbeanstalk environments using a single cloudformation template

What am I doing wrong?

你不能“重用第一个”第一个。必须使用第一个 CFN 堆栈执行对第一个 EB 环境的所有修改。

在第二个堆栈中,您只能在其他资源中引用 EB return values,一旦您在第一个堆栈中导出这些值。

EB 应用程序资源必须在一个且唯一的堆栈中:

EBApplication:
  Type: AWS::ElasticBeanstalk::Application
  Properties:
     ApplicationName: !Ref EBApplicationName
     Description: "Application Description"

在此堆栈中,您可以在环境中引用应用程序:

EBApplicationEnvironment1:
  Type: AWS::ElasticBeanstalk::Environment
  Properties:
    ApplicationName: !Ref EBApplication
    EnvironmentName: !Ref EBnvironmentName1

这是因为,根据 documentation Ref returns 资源名称。

在另一个堆栈中,您不能按资源引用,但可以按名称引用:

EBApplicationEnvironment2:
  Type: AWS::ElasticBeanstalk::Environment
  Properties:
    ApplicationName: !Ref EBApplicationName
    EnvironmentName: !Ref EBnvironmentName2

使用 Ref,您可以同时引用另一个资源(仅在同一堆栈中)和一个参数。因此,对于您的情况,您可以在两个堆栈中传递相同的应用程序名称作为参数。您不一定需要输出名称。 (CloudFormation 并非总是如此。它在这里起作用,因为您可以定义名称,并且可以按名称引用环境中的资源。在其他情况下需要 ARN 或 ID。输出将在那里起作用) .

另请注意,第一个堆栈拥有应用程序和环境 1。您需要先删除(需要时)第二个堆栈,然后是第一个。