首页 > 解决方案 > 如何使用单个 cloudformation 模板创建多个 Elasticbeanstalk 环境

问题描述

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

我创建了一个 cloudformation 模板,它基本上通过配置必要的资源在 AWS 上创建了一个 CI/CD 管道。在使用模板在同一个弹性 beanstalk 应用程序下创建多个环境(例如,staging 和 prod)时,我遇到了问题。当我第一次部署模板时,比如说一个临时环境,它工作得很好,但是当我在这种情况下将它重新部署到生产环境时,它会失败,并出现应用程序名称已经存在的错误。我曾尝试使用 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

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

标签: amazon-web-servicesamazon-cloudformationamazon-elastic-beanstalk

解决方案


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

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

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

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

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


推荐阅读