Итерация по карте для файловой функции - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть сценарий для загрузки нескольких файлов в s3 с помощью terraform.Я хотел бы загрузить несколько объектов с помощью функции подсчета.При этом нужно перебирать исходный код с помощью файла ("$ {path.module} / path / to / file").

В любом случае можно ли сделать файловую функцию сопоставленной переменной, используя count.index?

1 Ответ

1 голос
/ 21 сентября 2019

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 - его позиция в списке файлов.


Я написал модуль Terraform, основанный на fileset, который также поддерживает рендеринг шаблонов и обнаружение типов файлов на основе суффиксов имен файлов, что может упростить жизнь в некоторых более сложных ситуациях: apparentlymart/dir/template.Вы можете использовать его результат с aws_s3_bucket_object аналогично описанному выше, как показано в README.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...