我有一个使用 terraform 将多个文件上传到 s3 的用例。我想使用 count 函数上传多个对象。在执行此操作时,需要使用file("${path.module}/path/to/file"(遍历源代码。
有没有办法使文件函数成为利用 count.index 的映射变量?
Terraform 0.12.8引入了一个新函数fileset
该函数可以返回一组与特定基目录中的特定模式匹配的文件路径。
我们可以将其与资源for_each
(而不是count
(结合使用,将匹配的文件上传到 S3,如下所示:
resource "aws_s3_object" "example" {
for_each = fileset("${path.module}/files", "*") # could use ** instead for a recursive search
bucket = "example"
key = each.value
source = "${path.module}/${each.value}"
# Unless the bucket has encryption enabled, the ETag of each object is an
# MD5 hash of that object.
etag = filemd5("${path.module}/${each.value}")
}
在此处使用for_each
而不是count
意味着 Terraform 将通过其 S3 路径而不是其在列表中的位置来标识资源的每个实例,因此您可以在不干扰其他文件的情况下添加和删除文件。例如,如果您有一个名为example.txt
的文件,那么 Terraform 会将其实例跟踪为aws_s3_object.example["example.txt"]
,而不是像aws_s3_object.example[3]
这样的地址,其中 3 是它在文件列表中的位置。
我编写了一个基于fileset
构建的 Terraform 模块,还支持模板渲染和基于文件名后缀的文件类型检测,这可能会使某些更复杂的情况下更轻松:apparentlymart/dir/template
.您可以以与上述类似的方式将其结果与aws_s3_object
一起使用,如其自述文件中所示。