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 codeImport 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-0123456789abcdefDé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}"}"
fiLe 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.