Amazon web services Terraform中的弹性Beanstalk应用程序版本

Amazon web services Terraform中的弹性Beanstalk应用程序版本,amazon-web-services,amazon-elastic-beanstalk,terraform,Amazon Web Services,Amazon Elastic Beanstalk,Terraform,我试图通过参数化名称来管理terraform模板中的应用程序版本。这是一种尝试,每当应用程序的内容发生更改时,我们的CI流程都会创建一个新的应用程序版本。通过这种方式,在elasticbeanstalk中,我可以保留一个历史应用程序版本的列表,以便回滚等。这不起作用,因为同一个应用程序版本不断更新,实际上我丢失了所有应用程序版本的历史 resource "aws_elastic_beanstalk_application_version" "default" { name =

我试图通过参数化名称来管理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存储桶和权限需要担心


我遗漏了什么吗?

就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}"
}
然后,如果您有一个
版本列表
,它应该为每个版本创建一个新的应用程序版本


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

我的理解是,
var.build-number
是唯一的,对吗?因此名称
name=“${var.eb-app-name}-${var.build-number}”
也将是唯一的。您可以将其作为输入变量进行更新和更改。然后您可以使用它控制EB应用程序版本。那么,真正的问题是什么?如我所述,我的目标是在每次
${var.eb-app-name}-${var.build-number}
更改时创建一个新的应用程序版本。i、 e.我们CI流程中的每个新构建。这不会发生。我们只是不断地使用新名称和捆绑包更新单个应用程序版本。这意味着我们不能回滚到以前的版本。您将如何使用S3 bucket数据源来执行此操作?所有版本包都在一个S3存储桶中。使用该bucket作为数据源的语法是什么?您需要动态获取S3 bucket中的对象列表。不幸的是,您不能直接使用Terraform来实现这一点,但可以使用外部数据源来实现。不过,这可能值得在另一个问题中提出,并在其中提及这个问题