Module 5 — Gestion de l’état : distant, drift, import et workspaces
Durée indicative du cours : 1h30
Durée indicative de l’atelier : — (atelier à venir)
Durée totale (cours + atelier) : ~2h00–2h30 selon lab
Objectif du module
En Terraform Basics et à l’atelier 5, vous avez observé le state, lu un plan de drift, et listé des ressources.
Ici, on agit : state distant, verrouillage, import, state rm, workspaces CLI, et décisions de réconciliation.
Prérequis mental : config, state et cloud sont trois choses distinctes (module 3 Basics — workflow).
Pourquoi le state local ne suffit plus
Avec un terraform.tfstate sur le disque :
- un seul poste « possède » la vérité ;
- risque de perte (disque, mauvaise branche Git si on commit par erreur) ;
- deux personnes peuvent
applysans se voir.
Un backend distant stocke le state sur un service partagé (Azure Storage, Terraform Cloud, S3, etc.).
L’équipe lit et écrit le même carnet d’état, avec des contrôles d’accès.
Rappel
Un dossier racine Terraform = un state (par workspace).
Découper les stacks change aussi le nombre de states — on y revient au module 7.
Backend distant — exemple Azure Storage
Configuration typique (souvent dans versions.tf ou backend.tf) :
terraform {
required_version = ">= 1.10.0"
backend "azurerm" {
resource_group_name = "rg-tfstate-shared"
storage_account_name = "sttfstatelab001"
container_name = "tfstate"
key = "platform/demo.tfstate"
}
}
Points à retenir :
- Le backend se configure au
terraform init(et parfois-migrate-statesi on quitte le local). - Les secrets du storage (clés, SAS) ne vont pas dans le HCL versionné : env, MSI, OIDC, ou partial config.
- La clé (
key) identifie l’objet state dans le conteneur.
Migration
Migrer le state est une opération d’équipe.
Vérifiez qu’aucun apply concurrent n’est en cours, et que tout le monde init ensuite sur le même backend.
À enrichir
Checklist de création du storage (chiffrement, soft-delete, RBAC), partial backend + fichier -backend-config, et atelier guidé de migration lab.
State lock — ne pas confondre avec le lockfile
| Verrou | Fichier / mécanisme | Protège quoi |
|---|---|---|
| Lockfile providers | .terraform.lock.hcl |
Versions exactes des providers (vu en Basics) |
| State lock | Lease / lock du backend | Deux écritures concurrentes sur le même state |
Pendant un plan / apply (selon backend), Terraform tente d’acquérir le lock.
Si un autre run le détient, vous voyez souvent : Error acquiring the state lock.
Forcer le unlock
terraform force-unlock <LOCK_ID> existe.
Ne l’utilisez que si vous êtes sûrs qu’aucun autre processus légitime ne tourne.
Un unlock trop tôt = state corrompu ou divergences d’équipe.
Sur Azure Storage, le lock s’appuie typiquement sur un lease du blob d’état.
Trois situations à ne pas confondre
| Situation | State | Cloud | Ce que fait souvent le plan |
Levier principal |
|---|---|---|---|---|
| Drift | Ressource présente | Modifiée hors Terraform (portail, autre outil) | ~ update ou recreate |
Adapter le code puis apply, ou accepter le réel via refresh / réécriture HCL |
| Orphelin hors state | Absente | Ressource créée à la main | Terraform ignore la ressource | import (puis aligner le HCL) |
| Dans le state, détruite dehors | Présente | Ressource absente | Recreate / erreurs provider | Recréer via apply, ou state rm si on sort du management |
Drift — ressource déjà gérée
Le state connaît la ressource.
Quelqu’un a changé un tag ou une SKU dans le portail.
Le plan propose de revenir à la config (ou de détecter un replace).
Réflexe :
- Lire le plan sans paniquer.
- Décider : le code a raison, ou le portail a raison.
- Soit
applypour réimposer le code, soit modifier le HCL pour matcher le réel (puisplanpropre).
Import — adopter une ressource existante
# CLI historique
terraform import azurerm_resource_group.main /subscriptions/.../resourceGroups/rg-demo-lab
# Config moderne (Terraform récent) — idée
# bloc import { to = azurerm_resource_group.main ; id = "..." }
Bonne pratique :
- Écrire (ou générer) le HCL de la ressource avant ou juste après l’import.
- Utiliser l’ID Azure correct.
- Enchaîner un
terraform plan: idéalement no changes, sinon comprendre chaque écart.
state rm — sortir du management sans détruire le cloud
La ressource reste dans Azure.
Terraform ne la gère plus.
Utile pour découper une stack, reprendre une main, ou corriger une erreur d’adresse — pas un réflexe quotidien.
state rm ≠ destroy
terraform destroy supprime le cloud.
state rm oublie seulement l’entrée dans le carnet.
Refresh : ce que ça fait, ce que ça ne répare pas
Pendant plan / apply, Terraform rafraîchit en général les attributs connus depuis le cloud.
Pour seulement aligner le state sur le réel, sans appliquer le .tf :
(L’ancienne commande terraform refresh est voisine ; on préfère -refresh-only.)
Le refresh ne :
- n’importe pas une ressource inconnue du state ;
- ne « répare » pas un HCL faux ;
- ne remplace pas une décision d’équipe (code vs réel).
Rappel Basics : section refresh.
Réconciliation — choisir une stratégie
| Objectif | Action typique |
|---|---|
| Revenir au code | Corriger le drift par apply |
| Adopter le réel | Adapter le HCL, puis refresh / import / plan propre |
| Sortir du management | state rm (ressource conserve dans le cloud) |
| Adopter une orpheline | Écrire le HCL + import |
Message examen TA-004
Savoir nommer drift, import, refresh et state rm, et ce que chacun touche (state vs cloud).
Workspaces CLI
Un workspace CLI est un espace d’état nommé pour le même code (même dossier, même backend).
Ce n’est pas un dossier Git différent : c’est une clé de state différente.
| Idée | Détail |
|---|---|
| Défaut | Workspace default |
| Ce qui est isolé | Le state (donc les ressources gérées sous ce nom) |
| Ce qui ne change pas | Les fichiers .tf (sauf si vous branchez la logique sur terraform.workspace) |
| Référence HCL | terraform.workspace → chaîne du workspace actif |
terraform workspace list
terraform workspace show
terraform workspace new lab-alice
terraform workspace select default
# terraform workspace delete lab-alice # seulement si OK à perdre ce state
Backend local : souvent terraform.tfstate.d/<nom>/terraform.tfstate.
Backend Azure Storage : le nom du workspace entre en général dans le chemin / la clé de l’objet.
Usages légitimes de terraform.workspace dans le HCL (détail au module 8) :
locals {
name_suffix = terraform.workspace == "default" ? "lab" : terraform.workspace
}
output "current_workspace" {
value = terraform.workspace
}
Limites
Un mauvais workspace select puis apply touche le mauvais state.
Pour dev / test / prod sérieux, combinez discipline (tfvars, CI, droits) — ne comptez pas sur le seul nom de workspace.
Les workspaces Terraform Cloud sont un autre produit (même mot) — module 11.
Commandes state utiles (aperçu)
| Commande | Rôle |
|---|---|
terraform state list |
Lister les adresses dans le state |
terraform state show <addr> |
Afficher une ressource du state |
terraform state mv |
Renommer / déplacer une adresse (refactor) |
terraform state rm |
Retirer du state sans destroy cloud |
terraform import |
Adopter une ressource cloud dans le state |
Le module 6 approfondit import, -target, fmt et validate dans le workflow quotidien.
Suite
Poursuivre avec le module 6 — Commandes avancées.
Pratique (quand l’atelier sera prêt) : drift portail → décision ; ressource à la main → import ; cas state rm contrôlé.