如何使用单个 cloudformation 模板创建多个 Elasticbeanstalk 环境

Posted

技术标签:

【中文标题】如何使用单个 cloudformation 模板创建多个 Elasticbeanstalk 环境【英文标题】:How to create multiple Elasticbeanstalk environments using a single cloudformation template 【发布时间】:2019-06-21 15:21:34 【问题描述】:

如何使用 cloudformation 在单个 Elasticbeanstalk 应用程序下创建多个环境。

我创建了一个 cloudformation 模板,它基本上通过配置必要的资源在 AWS 上创建了一个 CI/CD 管道。在使用模板在同一个弹性 beanstalk 应用程序下创建多个环境(例如登台和生产)时,我遇到了问题。当我第一次部署模板时,比如说一个临时环境,它工作得很好,但是当我在这种情况下将它重新部署到生产环境时,它会失败,并显示应用程序名称已经存在的错误。我曾尝试使用 cloudformation 条件但没有成功。我想知道是否有一种方法可以检查是否存在类似的ApplicationName,它会跳过应用程序名称的创建并在该名称下创建一个环境。

    WebApplication:
        Type: AWS::ElasticBeanstalk::Application
        Properties:
          ApplicationName: !Sub "$GithubRepo"
          Description: "Application Description"

      WebApplicationEnvironment:
        Type: AWS::ElasticBeanstalk::Environment
        Properties:
          ApplicationName: !Ref WebApplication
          EnvironmentName: !Sub "$GithubRepo-$Stage"
          TemplateName: !Ref WebApplicationTemplate

我希望当我第二次运行模板时,应该在指定的应用程序中创建一个新环境。

【问题讨论】:

【参考方案1】:

我想知道是否有一种方法可以检查是否存在类似的 ApplicationName,它会跳过应用程序名称的创建并在该名称下创建一个环境。

简短的回答是肯定的,如果您愿意构建一个自定义资源,该资源可以检查并返回可用于 Web 应用程序中的条件的值。但这是一个糟糕的想法,原因如下:您的阶段堆栈的资源也将用于 prod,但由于您在堆栈之间隐式耦合它们,cloudformation 将不知道如何处理更新。

如果您想在 WebApplication 和 WebApplicationEnvironment 之间建立一对多的关系,最好在不同的堆栈中创建它们。您可以使用堆栈导出将一个堆栈的数据公开给另一个堆栈。堆栈导出将保护您免于对其他堆栈所依赖的资源进行意外更改。

但对您来说更好的方法可能是为每个环境创建两个完全不同的堆栈。否则,您将无法测试 prod 升级过程(在升级阶段,您将升级 prod)。

如果您真的想降低成本,请将所有环境放在同一个堆栈中。如果您无论如何都不能使用它们来保持不同的环境不同,那么共享堆栈比在堆栈之间隐式共享资源更好。

【讨论】:

我最终创建了两个独立的不同堆栈并使用堆栈导出来公开 EB 应用程序名称。竖起大拇指!

以上是关于如何使用单个 cloudformation 模板创建多个 Elasticbeanstalk 环境的主要内容,如果未能解决你的问题,请参考以下文章

CloudFormation 模板设置 S3 存储桶默认加密 [重复]

是否可以在从 CloudFormation 模板创建时触发 lambda

如何为我的 Lambda 函数创建可重复使用的 CloudFormation 模板?

需要使用一个 AWS CloudFormation 模板为不同的环境启动多个实例

如何使用 cloudformation 模板创建 cloudwatch 事件?

如何修复与 AWS::CloudFormation::Init 一起创建 EC2 的 cloudformation 模板