Terraform中的Elastic Beanstalk应用程序版本

时间:2017-06-24 22:20:38

标签: amazon-web-services elastic-beanstalk terraform amazon-elastic-beanstalk

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

就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的小脚本。