файл загрузки terraform resource s3 не обновлен

#terraform

#terraform

Вопрос:

Я использую terraform для загрузки файла с содержимым в s3.Однако, когда содержимое изменяется, мне также нужно обновить файл s3. Но поскольку в файле состояния хранится, что загрузка s3 была завершена, он не загружает новый файл.

 resource "local_file" "timestamp" {
  filename = "timestamp"
  content = "${timestamp()}"
}


resource "aws_s3_bucket_object" "upload" {
 bucket = "bucket"
 key = "date"
 source = "timestamp"
}



  

ожидается:

обнаружено изменение aws_s3_bucket_object aws_s3_bucket_object.создается временная метка…

Результат:

состояние обновления aws_s3_bucket_object…

Комментарии:

1. Я вообще не могу воспроизвести это. Это все, что вы пытаетесь сделать? Я вижу изменение id и content , которое вызывает forces new resource обновление замены.

2. это приводит к созданию нового файла, но не к загрузке s3

Ответ №1:

Когда вы указываете Terraform путь к файлу, а не непосредственно содержимое для загрузки, именно имя файла определяет, нужно ли обновлять ресурс, а не содержимое файла.

Для короткой части данных, как показано в вашем примере, самым простым решением является указание данных непосредственно в конфигурации ресурса:

 resource "aws_s3_bucket_object" "upload" {
 bucket  = "bucket"
 key     = "date"
 content = "${timestamp()}"
}
  

Если ваш файл на самом деле слишком велик для разумной загрузки в строковую переменную или если он содержит необработанные двоичные данные, которые не могут быть загружены в строку, вы можете установить для etag объекта значение MD5 хэша содержимого, чтобы поставщик мог видеть, когда содержимое изменилось:

 resource "aws_s3_bucket_object" "upload" {
 bucket  = "bucket"
 key     = "date"
 source  = "${path.module}/timestamp"
 etag    = "${filemd5("${path.module}/timestamp")}"
}
  

При установке etag любое изменение содержимого файла приведет к изменению этого результата хэша и, таким образом, позволит поставщику определить, что объект нуждается в обновлении.

Комментарии:

1. К сожалению, это не работает для пакетов с шифрованием kms

2. Я полагаю, вы могли бы использовать content = file(FILENAME) вместо source .

3. Замените etag = "${filemd5("${path.module}/timestamp")}" на etag = filemd5("${path.module}/timestamp") , поскольку выражения, предназначенные только для интерполяции, устарели

4. Я думаю, что вы можете использовать source_hash = filemd5("path/to/source") для зашифрованных файлов.