【问题标题】:How do I get a list of s3 objects with the aws_s3_bucket_object data source?如何使用 aws_s3_bucket_object 数据源获取 s3 对象列表?
【发布时间】:2018-05-24 12:49:27
【问题描述】:

我的具体问题和this guys一样,但是我发现他的回答不够详细,而且terraform现在有了新功能,也许可以更好地解决这个问题。

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

我正在尝试使用“count”和 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)}"
}

【问题讨论】:

标签: terraform


【解决方案1】:

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

只需为返回对象列表的aws_s3_bucket_objects 数据源创建拉取请求(如aws_availability_zoneaws_availability_zones 之类的东西),您可以通过使用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]"
}

【讨论】:

  • 虽然不是很便携,但如果有人在没有安装 aws cli 的地方运行它怎么办?数据源是否会返回空并且 tf 会注销所有版本?
  • 从记忆中我认为它错误的数据源,然后中止计划/应用,但它很容易测试如果你想尝试。
【解决方案2】:

此数据源有一个 Pull Request,aws_s3_bucket_objects

https://github.com/terraform-providers/terraform-provider-aws/pull/6968

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 2021-11-16
    • 1970-01-01
    • 2017-01-09
    • 2015-04-24
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多