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.