Terraform - загружать файл в S3 при каждом применении - PullRequest
1 голос
/ 13 мая 2019

Мне нужно загрузить папку в S3 Bucket.Но когда я подаю заявку впервые.Это просто загружает.Но у меня есть две проблемы:

  1. загруженная версия выводит как ноль.Я ожидал бы некоторый version_id, например 1, 2, 3
  2. При повторном запуске terraform apply он говорит Apply complete! Resources: 0 added, 0 changed, 0 destroyed.Я ожидаю загрузки все время, когда я запускаю terraform apply и создаю новую версию.

Что я делаю не так?Вот мой конфиг Terraform:

resource "aws_s3_bucket" "my_bucket" {
  bucket = "my_bucket_name"

  versioning {
    enabled = true
  }
}

resource "aws_s3_bucket_object" "file_upload" {
  bucket = "my_bucket"
  key    = "my_bucket_key"
  source = "my_files.zip"
}

output "my_bucket_file_version" {
  value = "${aws_s3_bucket_object.file_upload.version_id}"
}

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Terraform вносит изменения в удаленные объекты только тогда, когда обнаруживает разницу между конфигурацией и атрибутами удаленного объекта. В конфигурации, как вы ее написали, конфигурация включает только имя файла. Он не содержит ничего о содержимом файла, поэтому Terraform не может реагировать на изменение файла.

Для внесения последующих изменений есть несколько вариантов:

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

Финал из них кажется наиболее близким к тому, что вы хотите в этом случае. Для этого добавьте аргумент etag и установите его в качестве хеша MD5 файла:

resource "aws_s3_bucket_object" "file_upload" {
  bucket = "my_bucket"
  key    = "my_bucket_key"
  source = "${path.module}/my_files.zip"
  etag   = "${filemd5("${path.module}/my_files.zip")}"
}

С этим дополнительным аргументом Terraform обнаружит, когда хэш MD5 файла на диске отличается от того, который удаленно хранится в S3, и планирует соответственно обновить объект.


(Я не уверен, что происходит с version_id. Он должен работать, пока в корзине включено управление версиями.)

1 голос
/ 13 мая 2019

Вы не должны использовать Terraform для этого.Предполагается, что Terraform организует и обеспечивает вашу инфраструктуру и ее конфигурацию, а не файлы.Тем не менее, terraform не знает об изменениях в ваших файлах.Пока вы не измените их имена, terraform не будет обновлять состояние.

Кроме того, лучше использовать local-exec для этого.Что-то вроде:

resource "aws_s3_bucket" "my-bucket" {
# ...

  provisioner "local-exec" {
     command = "aws c3 cp path_to_my file ${aws_s3_bucket.my-bucket.bucket}"
  }
}
...