间歇性 Terraform 尝试将对象放入桶中失败
Intermittent Terraform failures trying to put object into a bucket
我看到间歇性的 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 处创建了一个桶,然后说它不能将对象放入该桶中,因为它在 [=] 处不存在24=].
上述错误背后的代码:
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
或更好的方法来正确定义 2 个资源之间的依赖关系,但在对象资源中引用存储桶资源的输出,如下所示:
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 存储桶,然后 return 才能尝试在存储桶中创建 S3 对象。
我看到间歇性的 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 处创建了一个桶,然后说它不能将对象放入该桶中,因为它在 [=] 处不存在24=].
上述错误背后的代码:
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
或更好的方法来正确定义 2 个资源之间的依赖关系,但在对象资源中引用存储桶资源的输出,如下所示:
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 存储桶,然后 return 才能尝试在存储桶中创建 S3 对象。