Terraform-provider-aws: S3 生命周期规则在每个 Terraform Apply 上不必要地更新

创建于 2017-06-13  ·  3评论  ·  资料来源: hashicorp/terraform-provider-aws

_这个问题最初是由@josh-padnick 作为 hashicorp/terraform#9119 打开的。 它作为提供商拆分的一部分迁移到这里。 问题的原始正文如下。_


我遇到了一个问题,即向 S3 Bucket 添加生命周期配置会导致 terraform 在每个后续terraform apply上不断销毁并重新添加相同的生命周期。

地形版

地形 v0.7.4

受影响的资源

  • aws_s3_bucket

    Terraform 配置文件

resource "aws_s3_bucket" "cloudtrail" {
  bucket = "gruntwork-josh-test-1"
  force_destroy = true

  versioning {
    enabled = true
  }

  # Automatically delete a log file after X days.
  lifecycle_rule {
    id = "auto-delete-after-x-days"
    prefix = ""
    enabled = true
    abort_incomplete_multipart_upload_days = 5

    expiration {
      days = 5
      expired_object_delete_marker = true
    }

    noncurrent_version_expiration {
      days = 5
    }
  }
}

调试输出

https://gist.github.com/josh-padnick/aea607bd08cc771344e5c9063f30a495

恐慌输出

不适用

预期行为

初始应用后,后续的terraform applyterraform plan不应导致任何更改。

实际行为

S3 存储桶已成功创建,初始terraform apply没有错误。 但是没有对模板进行任何更改,在显示此毫无意义的更改后立即运行terraform plan

~ aws_s3_bucket.cloudtrail
    lifecycle_rule.0.expiration.2217964487.date:                         "" => ""
    lifecycle_rule.0.expiration.2217964487.days:                         "" => "5"
    lifecycle_rule.0.expiration.2217964487.expired_object_delete_marker: "" => "true"
    lifecycle_rule.0.expiration.4129135488.date:                         "" => ""
    lifecycle_rule.0.expiration.4129135488.days:                         "5" => "0"
    lifecycle_rule.0.expiration.4129135488.expired_object_delete_marker: "false" => "false"

重现步骤

  1. terraform apply
  2. terraform plan

    重要事实

有趣的是,我在准备这个问题时还发现了可能是竞争条件。 在大约 25% 的情况下,执行简单的terraform apply会出现以下错误:

1 error(s) occurred:

* aws_s3_bucket.cloudtrail: Error putting S3 lifecycle: NoSuchBucket: The specified bucket does not exist
    status code: 404, request id: 7B9E0FD8D09EAFDC

这与此问题无关,但如果尚不存在,则可能需要一个单独的问题。

bug servics3

最有用的评论

当我尝试在设置当前版本到期和非当前版本到期的同一生命周期规则中设置 expired_object_delete_marker = true 时遇到了同样的问题。 Terraform 运行时不会出错,但计划会显示设置 expired_object_delete_marker = false (见下文)

到期{
expired_object_delete_marker = true
}

Lifecycle_rule.1.expiration.3591068768.expired_object_delete_marker:“真”=>“假”

解决方案是创建第二个生命周期规则,设置 expired_object_delete_marker = true

lifecycle_rule {
  id      = "ExpireDeleteMarkers"
  prefix  = ""
  enabled = true

  expiration {
    expired_object_delete_marker = true
  }
}

所有3条评论

这个问题还开放吗?

这仍然是一个问题。 问题的原因是当已配置到期时,AWS 不支持expired_object_delete_marker
有关更多详细信息,请参阅https://github.com/hashicorp/terraform/issues/9119#issuecomment -299182143

当我尝试在设置当前版本到期和非当前版本到期的同一生命周期规则中设置 expired_object_delete_marker = true 时遇到了同样的问题。 Terraform 运行时不会出错,但计划会显示设置 expired_object_delete_marker = false (见下文)

到期{
expired_object_delete_marker = true
}

Lifecycle_rule.1.expiration.3591068768.expired_object_delete_marker:“真”=>“假”

解决方案是创建第二个生命周期规则,设置 expired_object_delete_marker = true

lifecycle_rule {
  id      = "ExpireDeleteMarkers"
  prefix  = ""
  enabled = true

  expiration {
    expired_object_delete_marker = true
  }
}
此页面是否有帮助?
0 / 5 - 0 等级