Terraform 如何使用aws_s3_bucket_对象数据源获取s3对象列表?
我的具体问题与相同,但我发现他的答案不够详细,而且terraform现在有了新的功能,可能可以更好地解决这个问题 问题是我正在使用aws_elastic_beanstalk_application_版本来注册beanstalk版本,但是terraform在注册新版本之前会删除旧版本。这是因为每次都会更换aws_elastic_beanstalk_应用程序_版本,我需要做的是生成一个新版本 我试图用“count”和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对象作为列表
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是否会注销所有版本?从内存中,我认为它会导致数据源出错,然后中止计划/应用,但如果您想尝试,很容易进行测试。这是一个功能请求: