能否在 Cloudformation 中更新 Elastic Beanstalk 环境而不影响部署到其中的版本?

sne*_*tch 5 amazon-web-services aws-cloudformation amazon-elastic-beanstalk

我正在使用 Cloudformation 创建一个 Elastic Beanstalk 环境。我必须创建一个 ApplicationVersion 才能启动它并将其提供给环境的定义。我创建了其他 ApplicationVersion 并以其他方式 (CodePipeline) 将它们部署到集群。

现在,每次我需要更新 Cloudformation 堆栈以更改其他一些基础架构时,即使它没有将其列为潜在的资源更改,它也会将 ApplicationVersion 回滚到初始版本,并且我必须手动更新环境再次更新到最新版本。

我知道发生了什么 - Cloudformation 只是试图按照模板描述的方式保留堆栈。我只定义了初始 ApplicationVersion 因为它是 Beanstalk 环境的要求。有没有其他办法?

Mat*_*ser 5

CloudFormation 希望掌控一切。根据您执行的堆栈更新,CloudFormation 将根据模板中定义的内容重新创建版本。

不要将您的版本从 Code Pipeline 直接部署到 Elastic Beanstalk,而是执行以下操作:

  1. 不要将初始版本硬编码到您的 CloudFormation 模板中。
  2. 将正在部署的版本连接到 CloudFormation 堆栈的输入参数。例如,让输入参数为版本内部版本号,并在模板中构造一个 URL 作为版本源。
  3. 部署时,指示 Code Pipeline 使用更新的内部版本号更新您的堆栈。CloudFormation 应通过构建新 URL 并部署版本来接管。

一个例子:

假设您有一个参数ZipBucket并且ZipObject在堆栈中,您可以对AWS::ElasticBeanstalk::ApplicationVersion资源执行以下操作:

"SourceBundle"    : {
    "S3Bucket" : {
        "Ref" : "ZipBucket"
    },
    "S3Key"    : {
        "Ref" : "ZipObject"
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用一个BuildNumber参数,然后Fn::JoinS3Key属性中使用该参数根据内部版本号构建 URL。