Terraform : bloquer un plan destructeur avec prevent_destroy
Comment analyser un remplacement Terraform inattendu, protéger une ressource critique et réaligner l’état sans détruire la production.
Ne jamais appliquer un remplacement incompris
Le symbole -/+ dans un plan signifie que Terraform veut détruire puis recréer une ressource. Pour une base de données ou une ressource avec état, arrête la livraison tant que l’attribut forces replacement n’est pas compris.
Sauvegarde le plan et lis sa version détaillée. Le résumé seul ne montre pas toujours l’attribut à l’origine du remplacement.
terraform plan -out=tfplan
terraform show tfplan
terraform show -json tfplan > tfplan.jsonAjouter une barrière de sécurité
Le bloc lifecycle avec prevent_destroy transforme une destruction planifiée en erreur. Il ne corrige pas la divergence, mais empêche une application accidentelle pendant le diagnostic.
Cette protection doit être définie dans le code et revue comme toute autre modification d’infrastructure.
lifecycle {
prevent_destroy = true
}Déterminer si l’état doit être déplacé
Un renommage de ressource dans le code peut faire croire à Terraform que l’ancienne ressource doit disparaître. Utilise un bloc moved ou terraform state mv pour relier l’ancienne adresse à la nouvelle sans toucher à l’infrastructure.
Avant toute manipulation d’état, réalise une sauvegarde et vérifie que tu travailles dans le bon workspace.
terraform workspace show
terraform state pull > state-backup.json
terraform state mv module.old.aws_db_instance.main module.new.aws_db_instance.mainRecalculer et faire relire le plan
Génère un nouveau plan après la correction. L’objectif est d’obtenir zéro destruction non prévue, pas simplement de faire disparaître le message d’erreur.
Pour les ressources critiques, ajoute une validation automatique qui bloque la pipeline lorsque le plan contient une suppression et exige une approbation humaine explicite.
terraform plan -out=tfplan-fixed
terraform show tfplan-fixed
terraform apply tfplan-fixed