如何使用aws_s3_bucket_object数据源获取s3对象列表?

时间:2017-12-11 01:50:02

标签: terraform

我的具体问题与this guys相同,但我发现他的答案不够详细,而且terraform现在有了新功能,可以更好地解决这个问题。

问题是我使用aws_elastic_beanstalk_application_version来注册beanstalk版本,但terraform在注册新版本之前删除了旧版本。这是因为每次都会替换aws_elastic_beanstalk_application_version,我需要做的是生成一个新的。

我试图用"计数"和aws_s3_bucket_object数据源,但我无法弄清楚如何将s3对象作为列表。我尝试过通配符,但这不起作用:

data "aws_s3_bucket_object" "eb-bucket-data" {
  bucket = "mybucket"
  key = "*"
}

resource "aws_elastic_beanstalk_application_version" "default" {
  count       = "${length(data.aws_s3_bucket_object.eb-bucket-data.id)}"
  name        = "${element(data.aws_s3_bucket_object.eb-bucket-data.key, count.index)}"
  application = "myapp"
  bucket      = "mybucket"
  key        = "${element(data.aws_s3_bucket_object.eb-bucket-data.key, count.index)}"
}

2 个答案:

答案 0 :(得分:2)

aws_s3_bucket_object data source目前只返回一个项目。您可以遍历项目列表,但这会让您回到最初需要查找项目列表的问题。

如果没有为返回对象列表的aws_s3_bucket_objects数据源创建拉取请求(如aws_availability_zoneaws_availability_zones之类),您可以通过使用shell来实现此目的external data source并调用AWS CLI。

(未经测试的)示例可能如下所示:

data "external" "bucket_objects" {
  program = ["aws", "s3", "ls", "mybucket", "|", "awk", "'{print", "$4}'", "|", "jq", "-R", "-s", "-c", "'split(\"\n\")'", "|", "jq", "'.[:-1]'"]
}

运行

aws s3 ls mybucket | awk '{print $4}' | jq -R -s -c 'split("\n")' | jq '.[:-1]'

列出了存储桶中的对象,仅使用文件名元素,使用jq将它们拆分为JSON数组,然后从JSON数组中删除尾随换行元素,因为external数据源需要

。要返回的有效JSON对象。

然后您应该可以使用以下内容访问它:

resource "aws_elastic_beanstalk_application_version" "default" {
  count       = "${length(data.external.bucket_objects.result)}"
  name        = "${data.external.bucket_objects.result[count.index]}"
  application = "myapp"
  bucket      = "mybucket"
  key         = "${data.external.bucket_objects.result[count.index]"
}

答案 1 :(得分:0)