遍历映射以获取文件功能



我有一个使用 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一起使用,如其自述文件中所示。

最新更新