Terraform-provider-aws: Aplicação de regras de ciclo de vida S3 desnecessariamente em cada Terraform

Criado em 13 jun. 2017  ·  3Comentários  ·  Fonte: hashicorp/terraform-provider-aws

_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.

Versão Terraform

Terraform v0.7.4

Recurso (s) afetado (s)

  • aws_s3_bucket

    Arquivos de configuração do 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
    }
  }
}

Saída de depuração

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

Saída de pânico

N / D

Comportamento esperado

Após a aplicação inicial, terraform apply ou terraform plan subsequentes não devem resultar em alterações.

Comportamento Real

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"

Passos para reproduzir

  1. terraform apply
  2. terraform plan

    Factoids importantes

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.

bug servics3

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

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

  expiration {
    expired_object_delete_marker = true
  }
}

Todos 3 comentários

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
  }
}
Esta página foi útil?
0 / 5 - 0 avaliações