Terraform 中的 Elastic Beanstalk 应用程序版本

Posted

技术标签:

【中文标题】Terraform 中的 Elastic Beanstalk 应用程序版本【英文标题】:Elastic Beanstalk Application Version in Terraform 【发布时间】:2017-11-28 05:10:49 【问题描述】:

我尝试通过参数化名称来管理我的 terraform 模板中的应用程序版本。这是一种尝试,只要应用程序的内容发生变化,我们的 CI 流程就会创建一个新的应用程序版本。这样,在 elasticbeanstalk 中,我可以保留历史应用程序版本的列表,以便我可以回滚等。这不起作用,因为同一应用程序版本不断更新,实际上我丢失了所有应用程序版本的历史记录。

resource "aws_elastic_beanstalk_application_version" "default" 
   name        = "$var.eb-app-name-$var.build-number"
   application = "$var.eb-app-name"
   description = "application version created by terraform"
   bucket      = "$aws_s3_bucket.default.id"
   key         = "$aws_s3_bucket_object.default.id"

然后我尝试参数化逻辑资源引用名称,但 terraform 不支持。

resource "aws_elastic_beanstalk_application_version" "$var.build-number" 
   name        = "$var.eb-app-name-$var.build-number"
   application = "$var.eb-app-name"
   description = "application version created by terraform"
   bucket      = "$aws_s3_bucket.default.id"
   key         = "$aws_s3_bucket_object.default.id"

目前我的解决方案是在 terraform 之外管理我的应用程序版本,这令人失望,因为还有其他相关资源,例如 S3 存储桶和权限需要担心。

我错过了什么吗?

【问题讨论】:

我的理解是,var.build-number 是独一无二的,对吧?所以名称name = "$var.eb-app-name-$var.build-number" 也将是唯一的。您可以将其更新和更改为输入变量。然后你可以用它控制EB应用程序版本。那么真正的问题是什么?请提供任何详细信息。 正如我所描述的,我的目标是在每次$var.eb-app-name-$var.build-number 更改时创建一个新的应用程序版本。即我们 CI 流程中的每个新构建。这不会发生。我们只是不断地拥有一个使用新名称和捆绑包更新的应用程序版本。这意味着我们不能回滚到以前的版本 【参考方案1】:

就 Terraform 而言,您只是在那里更新单个 EB 应用程序版本资源。如果您想保留以前的版本,那么您可能需要尝试增加 Terraform 管理的资源数量。

在我的脑海中,你可以尝试这样的事情:

variable "builds" = 
  type = list


resource "aws_elastic_beanstalk_application_version" "default" 
   count       = "$length(var.builds)"
   name        = "$var.eb-app-name-$element(builds, count.index)"
   application = "$var.eb-app-name"
   description = "application version created by terraform"
   bucket      = "$aws_s3_bucket.default.id"
   key         = "$aws_s3_bucket_object.default.id"

如果你有一个builds 列表,它应该为每个构建创建一个新的应用程序版本。

当然,这可能是动态的,因为变量可以是返回所有构建列表的数据源。如果数据源不存在,您可以编写一个小脚本用作external data source。

【讨论】:

您将如何使用 S3 存储桶数据源来执行此操作?所有版本包都在一个 S3 存储桶中。使用该存储桶作为数据源的语法是什么? 您需要动态获取 S3 存储桶中的对象列表。不幸的是,您不能直接使用 Terraform 执行此操作,但您可以使用外部数据源进行处理。不过,可能值得在一个单独的问题中提出并在其中提及这个问题

以上是关于Terraform 中的 Elastic Beanstalk 应用程序版本的主要内容,如果未能解决你的问题,请参考以下文章

在 terraform 中分离 Elastic IP

使用 terraform 为 Elastic Beanstalk 启用托管更新

AWS Elastic Beanstalk 部署的 ActionType 在哪里?

如何使用 Terraform 为 Elastic Beanstalk 环境定义条件(每个环境)设置?

使用 Terraform 关闭/打开 Elastic Beanstalk 负载均衡器?

无法使用 Terraform 在自定义 VPC 中创建 Elastic Beanstalk 应用程序