_Este problema foi originalmente aberto por @ josh-padnick como hashicorp / terraform # 9119. Ele foi migrado aqui como parte da divisão do
Eu encontrei um problema em que adicionar uma configuração de ciclo de vida a um Bucket S3 faz com que o terraform continue destruindo e readicionando o mesmo ciclo de vida a cada terraform apply
subsequente.
Terraform 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
N / D
Após a aplicação inicial, terraform apply
ou terraform plan
subsequentes não devem resultar em alterações.
O depósito S3 é criado com sucesso e sem erros no terraform apply
. Mas sem nenhuma mudança no modelo, executar terraform plan
imediatamente após mostra esta mudança inútil:
~ 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
Curiosamente, também descobri o que provavelmente é uma condição de corrida enquanto preparava esta edição. Em cerca de 25% dos casos, fazer um simples terraform apply
resultaria em erro com o seguinte:
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
Isso não está relacionado a esse problema, mas provavelmente justifica um problema separado, se ainda não houver um.
Este problema ainda está aberto?
Isso ainda é um problema. A causa do problema é que a AWS não oferece suporte a expired_object_delete_marker
quando a expiração já foi configurada.
Consulte https://github.com/hashicorp/terraform/issues/9119#issuecomment -299182143 para obter mais detalhes
Encontrei o mesmo problema ao tentar definir expired_object_delete_marker = true na mesma regra de ciclo de vida em que estava definindo a expiração da versão atual e noncurrent_version_expiration. O Terraform seria executado sem erros, mas o plano mostraria a configuração de expired_object_delete_marker = false (veja abaixo)
expiration {
expired_object_delete_marker = true
}
lifecycle_rule.1.expiration.3591068768.expired_object_delete_marker: "true" => "false"
A solução é criar uma segunda regra de ciclo de vida que define o expired_object_delete_marker = true
lifecycle_rule {
id = "ExpireDeleteMarkers"
prefix = ""
enabled = true
expiration {
expired_object_delete_marker = true
}
}
Comentários muito úteis
Encontrei o mesmo problema ao tentar definir expired_object_delete_marker = true na mesma regra de ciclo de vida em que estava definindo a expiração da versão atual e noncurrent_version_expiration. O Terraform seria executado sem erros, mas o plano mostraria a configuração de expired_object_delete_marker = false (veja abaixo)
expiration {
expired_object_delete_marker = true
}
lifecycle_rule.1.expiration.3591068768.expired_object_delete_marker: "true" => "false"
A solução é criar uma segunda regra de ciclo de vida que define o expired_object_delete_marker = true