Прерывистые сбои Terraform при попытке положить объект в ведро - PullRequest
0 голосов
/ 17 декабря 2018

Я наблюдаю периодические сбои 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 не даст никакого значения по сравнению с неявной зависимостью, которая уже существует.

1 Ответ

0 голосов
/ 17 декабря 2018

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 в блоке.

...