Exercice 05 : Configurer un backend pour le state distant
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Configurer un backend
localavec un chemin custom - ✅ Configurer un backend
s3avec DynamoDB pour le locking - ✅ Migrer un state existant avec
terraform init -migrate-state - ✅ Comprendre pourquoi le state distant est indispensable en équipe
Durée estimée : 25 minutes
Difficulté : ⭐⭐⭐⭐☆ (Intermédiaire+)
Prérequis : Terraform installé, exercice 04 terminé, compte AWS (optionnel pour la partie S3)
📖 Contexte
Par défaut, Terraform stocke le state localement dans terraform.tfstate. En équipe, cela pose deux problèmes : impossible de partager le state, et deux apply simultanés peuvent le corrompre. La solution est un backend distant avec locking : S3 + DynamoDB sur AWS, ou Terraform Cloud.
📋 Énoncé
Vous allez d'abord configurer un backend local avec un chemin personnalisé, puis simuler la configuration d'un backend S3 (avec les commandes nécessaires pour l'infrastructure AWS prérequise).
Résultat attendu :
- Compréhension de la configuration du backend
- Configuration S3 + DynamoDB prête à déployer
🧭 Déroulement de l'exercice
Tâche 1 : Configurer un backend local avec chemin custom
Modifiez le backend pour stocker le state dans ./state/terraform.tfstate au lieu du chemin par défaut.
Indice : Le bloc
backend "local"dansterraform {}accepte un paramètrepath.
Vérification : Après terraform init -migrate-state, le state se trouve dans ./state/terraform.tfstate.
Tâche 2 : Comprendre la structure du backend S3
Analysez la configuration S3 fournie en solution et identifiez : le bucket, la clé, la région, et le paramètre DynamoDB.
Indice :
dynamodb_tableest le nom de la table DynamoDB utilisée pour le locking. La clé de partition doit êtreLockIDde typeString.
Vérification : Vous expliquez le rôle de chaque paramètre du bloc backend "s3".
Tâche 3 : Préparer l'infrastructure du backend S3
Créez un projet Terraform SÉPARÉ (bootstrap/) qui crée le bucket S3 et la table DynamoDB pour le backend.
Indice : Le projet bootstrap ne peut PAS utiliser le backend S3 qu'il crée (boucle). Il utilise le backend local.
Vérification : Le bucket S3 et la table DynamoDB sont créés dans AWS (ou simulés avec LocalStack).
Tâche 4 : Migrer le state vers S3
Ajoutez le bloc backend "s3" dans versions.tf et lancez terraform init -migrate-state.
Indice : Terraform demande confirmation avant de copier le state local vers S3.
Vérification : aws s3 ls s3://mon-bucket-tfstate/ montre le fichier terraform.tfstate.
Tâche 5 : Simuler le travail en équipe
Expliquez et démontrez ce qui se passe quand deux développeurs lancent terraform apply simultanément avec le backend S3 + DynamoDB.
Indice : Le premier
applyverrouille la table DynamoDB (cléLockID). Le deuxième reçoit un message d'erreur avec l'ID du lock et l'info du détenteur.
Vérification : La table DynamoDB montre un enregistrement pendant l'apply du premier développeur.
🗂️ Mini-Projet : Bootstrap complet du backend AWS
bootstrap/ # projet Terraform pour créer le backend
├── main.tf
├── outputs.tf
└── versions.tf
mon-projet/ # projet principal utilisant le backend S3
├── main.tf
├── variables.tf
├── outputs.tf
└── versions.tf # contient le bloc backend "s3"Infrastructure bootstrap à créer :
# bootstrap/main.tf
provider "aws" {
region = "eu-west-3"
}
resource "aws_s3_bucket" "tfstate" {
bucket = "mon-projet-tfstate-${random_id.suffix.hex}"
}
resource "aws_s3_bucket_versioning" "tfstate" {
bucket = aws_s3_bucket.tfstate.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_dynamodb_table" "tfstate_lock" {
name = "terraform-state-lock"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}Checkpoints :
- Backend local custom :
./state/terraform.tfstatecontient le state après migration terraform init -migrate-statecopie le state sans perte de données- La configuration S3 pointe vers le bon bucket, la bonne clé et la bonne table DynamoDB
- Le versioning S3 est activé (protection contre la corruption accidentelle)
terraform applyconcurrent : le deuxième afficheError acquiring the state lock