_这个问题最初是由@josh-padnick 作为 hashicorp/terraform#9119 打开的。 它作为提供商拆分的一部分迁移到这里。 问题的原始正文如下。_
我遇到了一个问题,即向 S3 Bucket 添加生命周期配置会导致 terraform 在每个后续terraform apply
上不断销毁并重新添加相同的生命周期。
地形 v0.7.4
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 apply
或terraform 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"
terraform apply
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
这与此问题无关,但如果尚不存在,则可能需要一个单独的问题。
这个问题还开放吗?
这仍然是一个问题。 问题的原因是当已配置到期时,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
}
}
最有用的评论
当我尝试在设置当前版本到期和非当前版本到期的同一生命周期规则中设置 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