遍历映射以实现文件功能

时间:2019-09-20 17:48:09

标签: terraform

我有一个用例,可使用terraform将多个文件上传到s3。我想使用count函数上传多个对象。为此,需要使用file(“ $ {path.module} / path / to / file”)遍历源代码。

有没有利用count.index使文件功能成为映射变量?

1 个答案:

答案 0 :(得分:1)

Terraform 0.12.8引入了一个新函数fileset,该函数可以返回与特定基本目录中的特定模式匹配的一组文件路径。

我们可以将其与资源for_each(而不是count)结合起来,将匹配的文件上传到S3,如下所示:

resource "aws_s3_bucket_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.source_path}"

  # Unless the bucket has encryption enabled, the ETag of each object is an
  # MD5 hash of that object.
  etag = filemd5("${path.module}/${each.value.source_path}")
}

在这里使用for_each而不是count意味着Terraform将通过资源的S3路径而不是其在列表中的位置来标识资源的每个实例,因此您可以添加和删除文件而不会打扰其它文件。例如,如果您有一个名为example.txt的文件,那么Terraform会将其实例跟踪为aws_s3_bucket_object.example["example.txt"],而不是像aws_s3_bucket_object.example[3]这样的地址,其中3在文件列表中的位置。


我写了一个基于fileset构建的Terraform模块,它还支持模板渲染和基于文件名后缀的文件类型检测,这在某些更复杂的情况下可能会简化工作:apparentlymart/dir/template。您可以按照与上述类似的方式将其结果与aws_s3_bucket_object一起使用,如其自述文件所示。