我的具体问题与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)}"
}
答案 0 :(得分:2)
aws_s3_bucket_object
data source目前只返回一个项目。您可以遍历项目列表,但这会让您回到最初需要查找项目列表的问题。
如果没有为返回对象列表的aws_s3_bucket_objects
数据源创建拉取请求(如aws_availability_zone
和aws_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
数据源需要
然后您应该可以使用以下内容访问它:
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)
此数据源store
有一个拉取请求:
https://github.com/terraform-providers/terraform-provider-aws/pull/6968