Comment gérer l’état de Terraform dans un Bucket S3 d’AWS

Dans cet article, nous allons voir ce qu’est un état Terraform et comment le gérer sur un Bucket S3. Nous verrons également ce qu’est un « verrou » dans Terraform et comment le mettre en œuvre. Pour mettre cela en œuvre, nous devons créer un Bucket S3 et une Table DynamoDB sur AWS.

Avant de poursuivre, comprenons les bases de Terraform state et Lock.

  • État Terraform (fichier terraform.tstate) :
    Le fichier d’état contient des informations sur les ressources existantes définies dans les fichiers de configuration terraform. Par exemple, si tu as créé une Instance EC2 à l’aide de terraform config, alors le fichier state contient des informations sur la ressource réelle qui a été créée sur AWS.
  • S3 comme backend pour stocker le fichier d’état:
    Si nous travaillons en équipe, alors il est bon de stocker le fichier d’état terraform à distance pour que les personnes de l’équipe puissent y accéder. Pour stocker l’état à distance, nous avons besoin de deux choses : un seau s3 pour stocker le fichier d’état et une ressource s3 backend terraform.
  • Verrouillage:
    Si nous stockons le fichier d’état à distance pour que de nombreuses personnes puissent y accéder, alors nous risquons que plusieurs personnes tentent d’apporter des modifications au même fichier exactement au même moment. Nous devons donc disposer d’un mécanisme qui « verrouillera » l’état s’il est actuellement utilisé par d’autres utilisateurs. Nous pouvons y parvenir en créant une table dynamoDB que terraform pourra utiliser.

Ici, nous verrons toutes les étapes, depuis la création manuelle d’un Bucket S3, l’ajout de la politique requise, la création d’une table DynamoDB à l’aide de Terraform et la configuration de Terraform pour utiliser S3 comme Backend et DynamoDB pour stocker le verrouillage.

Pré-requis

  1. Compréhension de base de Terraform.
  2. Compréhension de base du Bucket S3.
  3. Terraform installé sur ton système.
  4. Compte AWS (crée-le si tu n’en as pas).
  5. Clé_accès  » et  » clé_secrète  » d’un utilisateur IAM AWS. (Clique ici pour apprendre à créer un utilisateur IAM avec ‘access_key’ et ‘secret_key’ sur AWS).

Ce que nous allons faire

  1. Crée un Bucket S3 et attache une Politique à celui-ci.
  2. Créer une table DynamoDB à l’aide de Terraform
  3. Créer une EC2 à l’aide des fichiers de configuration Terraform.
  4. Supprime l’instance EC2 créée à l’aide de Terraform.

Crée un Bucket S3 et attache une Politique à celui-ci.

Clique ici pour apprendre à créer un Bucket S3 sur un compte AWS. Une fois que tu as créé un Bucket, attache la Politique suivante à celui-ci.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1560164441598",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:PutObject*",
                "s3:List*",
                "s3:Get*",
                "s3:Delete*"
            ],
            "Resource": [
                "arn:aws:s3:::state-lock-rahul",
                "arn:aws:s3:::state-lock-rahul/*"
            ]
        }
    ]
}

Configure « AWS_ACCESS_KEY_ID » et « AWS_SECRET_ACCESS_KEY » pour que tu puisses accéder à ton compte depuis la CLI.

Utilise la commande suivante pour exporter les valeurs de « AWS_ACCESS_KEY_ID » et « AWS_SECRET_ACCESS_KEY ».

export AWS_ACCESS_KEY_ID=AKIAQ6GAIA5XC2XMMM7W
export AWS_SECRET_ACCESS_KEY=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
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY

Une fois que tu as configuré tes informations d’identification, tu peux simplement les tester en listant les buckets à l’aide de la commande suivante.

aws s3 ls

Créer une table DynamoDB à l’aide de Terraform

Crée ‘variables.tf’ qui contient les variables requises pour la déclaration.

vim variables.tf

variable "region" {
     description = "Region of AWS VPC"
}

Crée ‘main.tf’ qui est responsable de la création d’une table DynamoDB. ce main.tf lira les valeurs des variables de variables.tf. Cette table sera utilisée pour stocker le verrou.

provider "aws" {
      region     = "${var.region}"
}
resource "aws_dynamodb_table" "terraform_locks" {
name = "rahul-test-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}

La première commande à utiliser est ‘terraform init’. Cette commande télécharge et installe les plugins pour les fournisseurs utilisés dans la configuration. Dans notre cas, il s’agit d’AWS.

terraform init

La deuxième commande à utiliser est ‘terraform plan’. Cette commande est utilisée pour voir les changements qui auront lieu sur l’infrastructure.

terraform plan

La commande ‘terraform apply’ créera les ressources sur l’AWS mentionnées dans le fichier main.tf. Tu seras invité à fournir tes données pour créer les ressources.

terraform apply

Maintenant, tu peux aller dans le tableau de bord DynamoDB sur la console pour vérifier si la Table a été créée ou non.

Jusqu’à présent, nous avons créé un Bucket S3 manuellement à partir de la Console S3 et une Table DynamoDB à l’aide de Terraform. Nous n’avons pas configuré le Bucket S3 comme Backend pour stocker l’état et la Table DynamoDB pour stocker le verrou.

Pour atteindre notre objectif, nous devons modifier notre fichier Terraform main.tf. Après avoir modifié le code et l’avoir exécuté, notre état local préexistant sera copié dans le Backend S3.

Mets à jour notre main.tf existant avec le code suivant.

vim main.tf

provider "aws" {
      region     = "${var.region}"
}
 
 
terraform {
  backend "s3" {
    bucket         = "state-lock-rahul"
    key            = "test/terraform.tfstate"
    region         = "eu-west-3"
    dynamodb_table = "rahul-test-dynamodb-table"
  }
}
 
 
resource "aws_dynamodb_table" "terraform_locks" {
  name         = "rahul-test-dynamodb-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}

Maintenant, si tu essaies la commande « terraform plan » pour voir quelle nouvelle ressource sera créée, la commande échouera avec l’erreur suivante.

Il te sera demandé de réinitialiser le backend.

Pour réinitialiser le backend, utilise la commande « terraform init ». À cette étape, ton fichier d’état local sera copié dans le seau S3.

terraform init

Tu peux observer la sortie comme indiqué dans la capture d’écran ci-dessous après avoir exécuté la commande « terraform init », Terraform a été activé pour utiliser DynamoDb Table pour acquérir le verrouillage. Une fois le verrouillage activé, il est impossible d’effectuer deux opérations identiques sur la même ressource en parallèle.

Tu peux te rendre dans le tableau de bord S3 depuis la console AWS pour voir si le terraform.tfstate a été copié ou non.

Maintenant, tu peux à nouveau créer une nouvelle ressource et voir que l’état sera stocké sur S3 Bucket. Pour créer une nouvelle table DynamoDB Test, mets à jour le fichier main.tf avec le code suivant.

vim main.tf

variable "region" {
     description = "Region of AWS VPC"
}

Rahuls-MacBook-Pro:terraform rahul$ cat main.tf 
provider "aws" {
      region     = "${var.region}"
}


terraform {
  backend "s3" {
    bucket         = "state-lock-rahul"
    key            = "test/terraform.tfstate"
    region         = "eu-west-3"
    dynamodb_table = "rahul-test-dynamodb-table"
  }
}

resource "aws_dynamodb_table" "terraform_locks" {
  name         = "rahul-test-dynamodb-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}


resource "aws_dynamodb_table" "test-table" {
  name         = "rahul-test-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}

Cette fois, il n’est pas nécessaire d’exécuter « terraform init » puisqu’il n’y a pas de changement dans le Backend du Provider.

Tu peux simplement utiliser la commande « terraform plan » pour voir quelles nouvelles ressources seront créées.

terraform plan

Maintenant, exécute la commande suivante pour créer une nouvelle table de test DynamoDb.

terraform apply

Dans la capture d’écran ci-dessus, tu peux voir que le verrouillage a été activé, le fichier .tfstate est en train d’être copié sur S3.

Maintenant, dans la console, tu peux voir que la nouvelle table a été créée.

Maintenant, si tu n’as plus besoin de la ressource que tu as créée à l’aide de Terraform, utilise la commande suivante pour supprimer les ressources.

terraform destroy

Dès que tu as supprimé les ressources, tu peux voir que la table qui était utilisée pour le verrouillage a également été supprimée. Si tu n’as pas non plus besoin du Bucket S3, tu peux le supprimer depuis la console.

Conclusion

Dans cet article, nous avons appris la nécessité d’utiliser un état distant et un verrouillage dans Terraform. Nous avons vu les étapes pour utiliser le Bucket S3 comme backend pour stocker l’état Terraform et la table DynamoDb pour activer le verrouillage.

Vous aimerez aussi...