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

Terraform 如何使用aws_s3_bucket_对象数据源获取s3对象列表?,terraform,Terraform,我的具体问题与相同,但我发现他的答案不够详细,而且terraform现在有了新的功能,可能可以更好地解决这个问题 问题是我正在使用aws_elastic_beanstalk_application_版本来注册beanstalk版本,但是terraform在注册新版本之前会删除旧版本。这是因为每次都会更换aws_elastic_beanstalk_应用程序_版本,我需要做的是生成一个新版本 我试图用“count”和aws_s3_bucket_对象数据源来实现这一点,但我不知道如何将s3对象作为列表

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

问题是我正在使用aws_elastic_beanstalk_application_版本来注册beanstalk版本,但是terraform在注册新版本之前会删除旧版本。这是因为每次都会更换aws_elastic_beanstalk_应用程序_版本,我需要做的是生成一个新版本

我试图用“count”和aws_s3_bucket_对象数据源来实现这一点,但我不知道如何将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)}"
}
当前仅返回单个项。您可以遍历项目列表,但这会让您回到最初的问题,即首先需要找到项目列表

除了为返回对象列表的
aws_s3_bucket_objects
数据源创建拉取请求(如和)之外,您可以通过使用和调用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]'
它列出bucket中的对象,只获取filename元素,使用将它们拆分为JSON数组,然后从JSON数组中删除尾随的换行符元素,因为
外部
数据源需要返回有效的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]"
}

此数据源有一个拉取请求,
aws\u s3\u bucket\u对象


但这不是很好移植,如果有人在未安装aws cli的地方运行该怎么办?数据源是否会返回空,tf是否会注销所有版本?从内存中,我认为它会导致数据源出错,然后中止计划/应用,但如果您想尝试,很容易进行测试。这是一个功能请求: