Terraform-provider-aws: La règle de cycle de vie S3 se met à jour inutilement sur chaque Terraform s'applique

Créé le 13 juin 2017  ·  3Commentaires  ·  Source: hashicorp/terraform-provider-aws

_Ce problème a été initialement ouvert par @josh-padnick sous le nom hashicorp/terraform#9119. Il a été migré ici dans le cadre de la division du


J'ai rencontré un problème où l'ajout d'une configuration de cycle de vie à un compartiment S3 oblige terraform à continuer à détruire et à rajouter le même cycle de vie à chaque terraform apply .

Version Terraform

Terraform v0.7.4

Ressource(s) affectée(s)

  • aws_s3_bucket

    Fichiers de configuration 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
    }
  }
}

Sortie de débogage

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

Sortie panique

N / A

Comportement attendu

Après la demande initiale, les terraform apply ou terraform plan ne devraient entraîner aucun changement.

Comportement réel

Le compartiment S3 est créé avec succès et sans erreur sur le terraform apply initial. Mais sans aucune modification du modèle, l'exécution de terraform plan immédiatement après montre ce changement inutile :

~ 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"

Étapes pour reproduire

  1. terraform apply
  2. terraform plan

    Faits importants

Fait intéressant, j'ai également découvert ce qui est probablement une condition de concurrence en préparant ce numéro. Dans environ 25 % des cas, faire un simple terraform apply entraînerait l'erreur suivante :

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

Ceci n'est pas lié à ce problème, mais justifie probablement un problème distinct s'il n'existe pas déjà.

bug servics3

Commentaire le plus utile

J'ai rencontré ce même problème en essayant de définir expired_object_delete_marker = true dans la même règle de cycle de vie que je définissais l'expiration de la version actuelle et noncurrent_version_expiration. Terraform s'exécuterait sans erreur mais le plan afficherait la définition de expired_object_delete_marker = false (voir ci-dessous)

expiration {
expiré_object_delete_marker = vrai
}

lifecycle_rule.1.expiration.3591068768.expired_object_delete_marker: "true" => "false"

La solution consiste à créer une deuxième règle de cycle de vie qui définit expired_object_delete_marker = true

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

  expiration {
    expired_object_delete_marker = true
  }
}

Tous les 3 commentaires

Ce problème est-il toujours ouvert ?

C'est toujours un problème. La cause du problème est qu'AWS ne prend pas en charge expired_object_delete_marker lorsque l'expiration a déjà été configurée.
Voir https://github.com/hashicorp/terraform/issues/9119#issuecomment-299182143 pour plus de détails

J'ai rencontré ce même problème en essayant de définir expired_object_delete_marker = true dans la même règle de cycle de vie que je définissais l'expiration de la version actuelle et noncurrent_version_expiration. Terraform s'exécuterait sans erreur mais le plan afficherait la définition de expired_object_delete_marker = false (voir ci-dessous)

expiration {
expiré_object_delete_marker = vrai
}

lifecycle_rule.1.expiration.3591068768.expired_object_delete_marker: "true" => "false"

La solution consiste à créer une deuxième règle de cycle de vie qui définit expired_object_delete_marker = true

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

  expiration {
    expired_object_delete_marker = true
  }
}
Cette page vous a été utile?
0 / 5 - 0 notes