#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")
для зашифрованных файлов.