如何使用单个 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 模板