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





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 в корзине.
Нет, потому что Terraform не знает, как вы используете эту переменную. И поэтому он не видит цепочки зависимостей между ними и просто решает, что они могут выполняться параллельно (если что-то еще не создает цепочку зависимостей), и поэтому будет применять их оба одновременно (если только это не будет ограничено разрешенным параллелизмом).
Спасибо, теперь это имеет смысл. Я протестирую решение, прежде чем принять ответ.
Вы хотите сказать, что использование одного и того же var (
"${var.s3_bucket_jar}") для обоих не подразумевает зависимости?