Passer au contenu principal

Production (Terraform)

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écifiques

Sé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, DNS
  • infra-compute/ : instances, autoscaling, load balancers
  • infra-data/ : RDS, S3, ElastiCache
  • app-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