Passer au contenu principal

Expertise (Terraform)

Drift detection et réconciliation

Le drift est l'écart entre ce que Terraform croit être l'état de l'infrastructure (le state) et ce qui existe réellement. Il survient inévitablement : une modification manuelle dans la console AWS, une action automatisée par un autre outil, une ressource détruite manuellement. Détecter et réconcilier le drift est une compétence opérationnelle clé.

Causes de drift

  • Modifications manuelles : changement de configuration dans la console cloud, ajout d'un security group rule en urgence
  • Actions automatisées externes : autoscaling qui modifie le desired_capacity, Lambda qui crée des ressources, AWS Config qui applique des remédiation automatiques
  • Ressources supprimées manuellement : VM terminée manuellement, bucket supprimé depuis la CLI
  • Expiration de ressources : certificats TLS, credentials IAM, tokens

Détecter le drift

# Plan avec refresh explicite (détecte ce qui a changé dans la réalité)
terraform plan -refresh-only

# Ce que ça affiche :
# ~ aws_instance.web (update in-place)
#   ~ tags = {
#     + "ManualTag" = "added-manually"
#   }
# ~ aws_security_group.web (update in-place)
#   ~ ingress = [
#     + rule added manually
#   ]

Stratégies de réconciliation

Option 1 : accepter le drift (mettre à jour le state)

# Mettre à jour le state pour refléter la réalité
terraform apply -refresh-only

À utiliser quand la modification manuelle est intentionnelle et qu'on veut la conserver temporairement. Attention : le prochain terraform apply réappliquerait la configuration HCL et supprimerait ces changements.

Option 2 : corriger le code HCL

Si la modification manuelle doit être permanente, l'intégrer dans le code HCL, puis lancer un terraform apply normal. Le state et la réalité convergent vers la nouvelle configuration.

Option 3 : revenir à l'état Terraform

# Plan sans -refresh-only : Terraform voit le drift et propose de le corriger
terraform plan     # affiche les changements pour revenir à l'état HCL
terraform apply    # revient à l'état défini dans le code

Import de ressources en drift

# Une ressource a été créée manuellement et doit être adoptée par Terraform
terraform import aws_security_group.extra sg-0123456789abcdef

Détection périodique automatisée

# Script de détection de drift (à planifier via cron ou CI)
#!/bin/bash
set -e

terraform init -backend-config="bucket=${TF_STATE_BUCKET}" > /dev/null

DRIFT=$(terraform plan -refresh-only -detailed-exitcode 2>&1; echo $?)
EXIT_CODE=${DRIFT##*$'
'}

if [ "$EXIT_CODE" = "2" ]; then
  echo "DRIFT DÉTECTÉ"
  terraform plan -refresh-only -no-color 2>&1 |     grep -E "^  [~+-]" | head -20
  # Envoyer une alerte (Slack, email, PagerDuty)
  curl -X POST "$SLACK_WEBHOOK"     -d "{"text": "⚠️ Drift Terraform détecté sur ${TF_WORKSPACE}"}"
fi

Le code de sortie 2 de terraform plan indique qu'il y a des changements à appliquer. Le code 0 indique que l'état est cohérent. Le code 1 est une erreur.

Terraform Cloud : drift detection intégrée

Terraform Cloud dispose d'une fonctionnalité de Health Assessment qui exécute automatiquement des terraform plan -refresh-only périodiques et notifie en cas de drift. Disponible en tier Plus et Enterprise.