【问题标题】:Intermittent Terraform failures trying to put object into a bucket尝试将对象放入存储桶的间歇性 Terraform 失败
【发布时间】:2019-05-17 16:34:06
【问题描述】:

我看到间歇性的 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 明确定义的依赖不会为已经存在的隐式依赖提供任何价值。

【问题讨论】:

    标签: amazon-web-services amazon-s3 terraform terraform-provider-aws


    【解决方案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}") 并不意味着依赖?
    • 否,因为 Terraform 无法知道您如何使用该变量。因此它看不到它们之间的依赖链,只是决定它们可以并行完成(除非其他东西创建了依赖链),因此将同时应用它们(除非它碰巧受到允许的并发性的限制)。
    • 谢谢,现在说得通了。我会在接受答案之前测试解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2017-07-05
    • 2021-05-01
    • 1970-01-01
    • 2019-04-18
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多