6 votes

Comment ajouter une règle de cycle de vie à un seau AWS S3 existant avec Terraform ?

J'ai un seau S3 existant et je souhaite y ajouter des "dossiers" et des règles de cycle de vie.

(Je dis "dossiers" car c'est ainsi qu'ils sont représentés du côté client, car on y accède via une passerelle de stockage).

Je peux créer les dossiers, par exemple sur pour contenir les sauvegardes trimestrielles, comme :

resource "aws_s3_bucket_object" "quarterly" {
    bucket  = "${var.bucket_id}"
    acl     = "private"
    key     = "quarterly"
    source  = "/dev/null"
}

Mais si j'essaie et ajoute ensuite une règle de cycle de vie, comme suit

resource "aws_s3_bucket" "quarterly" {
    bucket  = "${var.bucket_id}"
    acl     = "private"

    lifecycle_rule {
        id      = "quarterly_retention"
        prefix  = "quarterly/"
        enabled = true
        tags {
            "rule"  = "quarterly"
        }

        expiration {
            days = 92
        }
    }
}

J'ai une erreur quand je fais terraformer appliquer.

* aws_s3_bucket.quarterly: Error creating S3 bucket: BucketAlreadyOwnedByYou: Your previous request to create the named bucket succeeded and you already own it.
    status code: 409, request id: 702396A7D2FA28BA, host id: IJDA+vszRBYl4zmvW56dSnC2va2qpQXlfgeEL7X1QQHHv8eEaYKvSUCL0ZIj/VsdvQ2hkBLGjAY=

Je veux d'abord créer le seau, puis ajouter les dossiers et les règles de cycle de vie par la suite, plutôt que d'intégrer les règles de cycle de vie lors de la création.

Est-ce que j'ai manqué quelque chose, est-ce que je me suis trompé ?

Merci pour votre aide !

2voto

bodgit Points 4551

Le résultat net est que si vous supprimez le seau par d'autres moyens, Terraform le recréera avec toutes les règles en place.

On dirait que vous avez perdu votre terraform.tfstate afin que Terraform ne sache pas qu'il a déjà créé votre godet, ou que vous avez créé le godet en dehors de Terraform en premier lieu, donc il essaie de le créer et échoue. Terraform doit " posséder " le godet pour pouvoir mettre à jour sa configuration, c'est-à-dire les règles du cycle de vie.

Vous devriez être en mesure d'importer le seau existant dans votre fichier d'état avec quelque chose comme

terraform import aws_s3_bucket.quarterly <your bucket ID>

Voir le bas de https://www.terraform.io/docs/providers/aws/r/s3_bucket.html

L'exécution de Terraform devrait alors montrer qu'il ne fait que mettre à jour les règles du cycle de vie.

1voto

prowla Points 71

Selon @bodgit, la méthode consiste à intégrer les règles du cycle de vie dans la ressource "aws_s3_bucket" et à réexécuter "terraform apply".

Des clauses lifecycle_rule peuvent être ajoutées (ou supprimées) à la ressource et elles sont appliquées au bucket.

Je cherchais à séparer les règles de la création de seaux, afin qu'elles puissent être traitées séparément, mais cela fera l'affaire.

Donc, je définis le seau avec :

resource "aws_s3_bucket" "bucket" {
    bucket      = "${replace(var.tags["Name"],"/_/","-")}"
    region      = "${var.aws_region}"

    tags        = "${merge(var.tags, map("Name", "${replace(var.tags["Name"],"/_/","-")}"))}"

    lifecycle_rule {
        id      = "quarterly_retention"
        prefix  = "quarterly/"
        enabled = true

        expiration {
            days = 92
        }
    }

}

Lorsque j'exécute "terraform apply", le seau est créé avec 1 règle.

Je modifie ensuite mon fichier .tf et ajoute une deuxième règle de cycle de vie.

resource "aws_s3_bucket" "bucket" {
    bucket      = "${replace(var.tags["Name"],"/_/","-")}"
    region      = "${var.aws_region}"

    tags        = "${merge(var.tags, map("Name", "${replace(var.tags["Name"],"/_/","-")}"))}"

    lifecycle_rule {
        id      = "quarterly_retention"
        prefix  = "quarterly/"
        enabled = true

        expiration {
            days = 92
        }
    }

    lifecycle_rule {
        id      = "permanent_retention"
        enabled = true
        prefix  = "permanent/"

        transition {
            days            = 1
            storage_class   = "GLACIER"
        }
    }

}

Lorsque j'exécute à nouveau "terraform apply", le seau a la 2ème règle ajoutée.

Si je modifie à nouveau la règle, que je supprime les règles et que j'exécute à nouveau un "apply", les règles disparaissent.

Si je modifie ensuite le texte, que j'ajoute à nouveau une règle et que j'exécute à nouveau l'application, cette règle est présente.

Merci pour votre aide !

0voto

À l'heure actuelle, AWS Provider v3.27 ne prend pas en charge l'externalisation des configurations de seaux pour les S3 gérés par AWS, mais il le permet pour les S3 Outposts en utilisant les éléments suivants s3control_bucket_lifecycle_configuration

Pour l'instant, tout ce que je peux faire est

  lifecycle {
    ignore_changes = [lifecycle_rule]
  }

Pour ignorer les changements qui ont été appliqués après coup. J'utilise cette technique assez souvent ; par exemple, je ne veux pas que mon instance EC2 soit recréée si l'image AMI est mise à jour.

Cependant, si je ne fais qu'un petit sous-ensemble de règles, par exemple pour fixer l'expiration par préfixe, je peux utiliser la méthode suivante dynamic blocs.

Par exemple

variable "cache_expiration_rules" {
  description = "Expiration rules for S3 cache"
  default     = []
  type        = list(object({ prefix = string, days = number }))
}

resource "aws_s3_bucket" "cache" {
  bucket        = local.cache_bucket_name
  acl           = "private"
  force_destroy = false

  lifecycle_rule {
    id                                     = "Common lifecycle rule"
    abort_incomplete_multipart_upload_days = 1
    enabled                                = true
    transition {
      days          = 1
      storage_class = "INTELLIGENT_TIERING"
    }
  }

  dynamic "lifecycle_rule" {
    for_each = var.cache_expiration_rules
    content {
      id      = "${lifecycle_rule.value["prefix"]} expiration in ${lifecycle_rule.value["days"]} days"
      enabled = true
      prefix  = lifecycle_rule.value["prefix"]
      expiration {
        days = lifecycle_rule.value["days"]
      }
    }
  }

}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X