Периодические сбои Terraform при попытке поместить объект в ведро

Я наблюдаю периодические сбои Terraform, которые кажутся мне внутренним состоянием гонки Terraform:

21:31:37 aws_s3_bucket.jar: Creation complete after 1s 
(ID: automatictester.co.uk-my-bucket)
...
21:31:38 * aws_s3_bucket_object.jar: Error putting object in S3 bucket
(automatictester.co.uk-my-bucket): NoSuchBucket: The specified bucket 
does not exist

Как видно из приведенных выше журналов, TF сначала заявляет, что он создал корзину в 21:31:37, а затем заявляет, что не может поместить объект в эту корзину, потому что этого не существует в 21:31:38.

Код, стоящий за указанной выше ошибкой:

resource "aws_s3_bucket" "jar" {
  bucket               = "${var.s3_bucket_jar}"
  acl                  = "private"
}
...
resource "aws_s3_bucket_object" "jar" {
  bucket               = "${var.s3_bucket_jar}"
  key                  = "my.jar"
  source               = "${path.module}/../target/my.jar"
  etag                 = "${md5(file("${path.module}/../target/my.jar"))}"
}

Между этими двумя явно существует неявная зависимость, поэтому единственная причина этой неудачи, которая приходит мне в голову, - это в конечном итоге согласованная природа Amazon S3.

Как справиться с такими ошибками? Я считаю, что явно определенная зависимость с depends-on не даст никакого значения по сравнению с уже существующей неявной зависимостью.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 096
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

resource "aws_s3_bucket" "jar" {
  bucket = "${var.s3_bucket_jar}"
  acl    = "private"
}

resource "aws_s3_bucket_object" "jar" {
  bucket = "${aws_s3_bucket.jar.bucket}"
  key    = "my.jar"
  source = "${path.module}/../target/my.jar"
  etag   = "${md5(file("${path.module}/../target/my.jar"))}"
}

Теперь Terraform знает, что ему нужно дождаться создания корзины S3 и вернуться, прежде чем она попытается создать объект S3 в корзине.

Вы хотите сказать, что использование одного и того же var ("${var.s3_bucket_jar}") для обоих не подразумевает зависимости?

automatictester 17.12.2018 12:57

Нет, потому что Terraform не знает, как вы используете эту переменную. И поэтому он не видит цепочки зависимостей между ними и просто решает, что они могут выполняться параллельно (если что-то еще не создает цепочку зависимостей), и поэтому будет применять их оба одновременно (если только это не будет ограничено разрешенным параллелизмом).

ydaetskcoR 17.12.2018 13:15

Спасибо, теперь это имеет смысл. Я протестирую решение, прежде чем принять ответ.

automatictester 17.12.2018 13:19

Другие вопросы по теме