TP 24 : Refactoriser sans recréer avec moved
TP 24 : Refactoriser sans recréer avec moved
Section intitulée « TP 24 : Refactoriser sans recréer avec moved »Objectifs
Section intitulée « Objectifs »À l’issue de ce TP, vous serez capable de :
- comprendre pourquoi un simple renommage détruit et recrée une ressource ;
- utiliser le bloc
movedpour renommer une ressource sans impact ; - déplacer une ressource dans un module avec
moved; - valider qu’un plan ne propose ni destruction ni recréation.
Prérequis
Section intitulée « Prérequis »- Terraform
>= 1.1(le blocmovedest disponible depuis la 1.1). - Un compte AWS et la CLI
awsconfigurée, ou l’usage du providerrandompour un TP sans coût.
Contexte
Section intitulée « Contexte »L’équipe d’InfraBank fait évoluer sa nomenclature : les ressources historiques doivent adopter des noms explicites, et une partie du code doit passer dans un module réutilisable. Le refactoring ne doit provoquer aucune destruction en production.
Étape 1 : Configuration de départ
Section intitulée « Étape 1 : Configuration de départ »Pour rester sans coût, on travaille avec le provider random, dont le principe (destruction = recréation à l’identique) illustre parfaitement le problème.
terraform { required_version = ">= 1.1" required_providers { random = { source = "hashicorp/random" version = "~> 3.6" } }}resource "random_password" "db" { length = 20 special = true}terraform initterraform apply -auto-approveterraform state list# random_password.dbNotez la valeur générée :
terraform output -raw db_secret 2>/dev/null || terraform show | grep -A2 random_passwordÉtape 2 : Observer le problème du renommage nu
Section intitulée « Étape 2 : Observer le problème du renommage nu »Renommez la ressource db en database_master sans bloc moved :
resource "random_password" "database_master" { length = 20 special = true}terraform planLe plan propose :
Plan: 1 to add, 0 to change, 1 to destroy.Terraform ne « voit » pas un renommage : il voit une adresse disparue (random_password.db) et une nouvelle (random_password.database_master). Sur une vraie ressource, cela signifierait une destruction. N’appliquez pas.
Étape 3 : Renommer proprement avec moved
Section intitulée « Étape 3 : Renommer proprement avec moved »Ajoutez un bloc moved qui déclare l’équivalence entre l’ancienne et la nouvelle adresse :
moved { from = random_password.db to = random_password.database_master}terraform planLe plan devient :
Plan: 0 to add, 0 to change, 0 to destroy.# random_password.db has moved to random_password.database_masterAucune destruction. Terraform met simplement à jour l’adresse dans le state.
terraform apply -auto-approveterraform state list# random_password.database_masterÉtape 4 : Déplacer une ressource dans un module
Section intitulée « Étape 4 : Déplacer une ressource dans un module »Créez un module local qui portera désormais la ressource :
terraform { required_providers { random = { source = "hashicorp/random" version = "~> 3.6" } }}resource "random_password" "database_master" { length = 20 special = true}Dans la configuration racine, remplacez la ressource par un appel de module et déclarez le déplacement :
module "secrets" { source = "./modules/secrets"}
moved { from = random_password.database_master to = module.secrets.random_password.database_master}terraform init # nécessaire : nouveau moduleterraform plan# random_password.database_master has moved to# module.secrets.random_password.database_master# Plan: 0 to add, 0 to change, 0 to destroy.terraform apply -auto-approveÉtape 5 : Vérifier l’absence de recréation
Section intitulée « Étape 5 : Vérifier l’absence de recréation »terraform state list# module.secrets.random_password.database_masterterraform plan# No changes.La valeur du mot de passe n’a pas changé entre les étapes : la preuve que rien n’a été recréé.
Étape 6 : Conserver ou retirer les blocs moved
Section intitulée « Étape 6 : Conserver ou retirer les blocs moved »Les blocs moved peuvent rester dans le code : ils sont sans effet une fois le déplacement absorbé par tous les states. Retirez-les seulement lorsque vous êtes certain que tous les environnements ont été appliqués (sinon un environnement en retard recréerait la ressource).
Vérification
Section intitulée « Vérification »- Aucun plan de ce TP n’a proposé de destruction après ajout du bloc
moved. - La ressource finale vit dans
module.secrets. - La valeur générée est restée identique du début à la fin.
Nettoyage
Section intitulée « Nettoyage »terraform destroy -auto-approve