Bonnes pratiques Terraform
Les bonnes pratiques Terraform évitent les incidents de production les plus courants : state corrompu, destroy accidentel, configuration drift, modules non maintenables. Ce qui suit est tiré de l'expérience opérationnelle réelle.
prevent_destroy sur les ressources critiques
resource "aws_db_instance" "main" {
# ...
lifecycle {
prevent_destroy = true
}
}
resource "aws_s3_bucket" "data" {
# ...
lifecycle {
prevent_destroy = true
}
}Avec prevent_destroy = true, terraform destroy et tout plan qui détruirait cette ressource échouera avec une erreur explicite. Indispensable sur les bases de données, les buckets de données, et les ressources stateful.
Versionner les providers de façon stricte
# Mauvais : aucune contrainte
required_providers {
aws = { source = "hashicorp/aws" }
}
# Bon : plage explicite
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.0.0, < 6.0.0"
}
}Commiter le .terraform.lock.hcl garantit que tout le monde utilise exactement la même version de provider.
Tagging systématique
locals {
mandatory_tags = {
ManagedBy = "terraform"
Environment = var.environment
Project = var.project_name
CostCenter = var.cost_center
Owner = var.owner_team
}
}
# Avec le provider AWS, appliquer les tags par défaut
provider "aws" {
default_tags {
tags = local.mandatory_tags
}
}ignore_changes avec précaution
resource "aws_autoscaling_group" "web" {
# ...
lifecycle {
# Ignorer les changements de taille (gérés par l'autoscaling)
ignore_changes = [desired_capacity]
# Ne jamais ignorer tout
# ignore_changes = all # MAUVAISE PRATIQUE
}
}Plan avant apply, toujours
# Workflow recommandé
terraform plan -out=tfplan
# Review du plan
terraform apply tfplan
# Jamais en production
terraform apply -auto-approve # MAUVAISE PRATIQUE sauf cas très spécifiquesSéparer les responsabilités
Ne pas gérer le réseau, les VM, les bases de données, et les applications dans le même projet Terraform. La séparation limite le blast radius d'une erreur :
infra-network/: VPC, subnets, routing, DNSinfra-compute/: instances, autoscaling, load balancersinfra-data/: RDS, S3, ElastiCacheapp-myapp/: ressources applicatives spécifiques
Drift et réconciliation
Le drift survient quand l'état réel diverge du state Terraform (modification manuelle dans la console AWS, action automatisée externe). Pour détecter et corriger :
# Détecter le drift sans rien changer
terraform plan -refresh-only
# Appliquer la réconciliation (met à jour le state pour refléter la réalité)
terraform apply -refresh-only
# Recréer une ressource dérivée
terraform apply -replace=aws_instance.web