Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Sauvegarder et restaurer le state Terraform

8 min de lecture

logo terraform

terraform state pull exporte le state complet en JSON vers la sortie standard, et terraform state push le réimporte. Ces deux commandes forment le duo sauvegarde/restauration du state. En complément, Terraform crée automatiquement un fichier .backup à chaque opération qui modifie le state. Ensemble, ces mécanismes vous protègent contre les corruptions et les erreurs de manipulation.

Prérequis : avoir un projet Terraform avec des ressources déployées et comprendre la structure du state.

  • Exporter le state avec terraform state pull
  • Créer des sauvegardes manuelles horodatées
  • Comprendre les sauvegardes automatiques (.backup)
  • Restaurer un state avec terraform state push
  • Gérer les conflits de version (serial)

terraform state pull affiche le contenu complet du state en JSON sur la sortie standard :

Fenêtre de terminal
terraform state pull
{
"version": 4,
"terraform_version": "1.14.3",
"serial": 3,
"lineage": "2adb552a-e139-00c0-689a-8c9bebad16a2",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "libvirt_network",
"name": "net",
"provider": "provider[\"registry.terraform.io/dmacvicar/libvirt\"]",
"instances": [...]
},
...
]
}

Les métadonnées clés du state sont :

ChampRôle
versionFormat du state (actuellement 4)
terraform_versionVersion de Terraform qui a écrit ce state
serialCompteur incrémenté à chaque modification — sert de garde-fou
lineageIdentifiant unique du state — empêche de mélanger deux projets
resourcesListe complète des ressources gérées

Redirigez la sortie de pull vers un fichier horodaté pour créer une sauvegarde :

Fenêtre de terminal
terraform state pull > state-backup-$(date +%Y%m%d-%H%M%S).json
Fenêtre de terminal
ls -la state-backup-*.json
-rw-rw-r-- 1 bob bob 3630 mars 31 14:31 state-backup-20260331-143123.json

Cette sauvegarde est un fichier JSON autonome. Vous pouvez la stocker dans un emplacement sûr séparé de votre répertoire de travail.

Terraform crée automatiquement un fichier terraform.tfstate.backup contenant le state précédent à chaque opération qui modifie le state (apply, state mv, state rm…) :

Fenêtre de terminal
ls -la terraform.tfstate*
-rw-rw-r-- 1 bob bob 3630 mars 31 14:31 terraform.tfstate
-rw-rw-r-- 1 bob bob 3629 mars 31 14:31 terraform.tfstate.backup

Le fichier .backup contient toujours la version précédente du state. Vous pouvez comparer les serials pour le vérifier :

FichierSerialContenu
terraform.tfstate5State actuel (après le dernier apply)
terraform.tfstate.backup3État précédent (avant le dernier apply)

terraform state push écrit un fichier de state dans le backend. Pour restaurer une sauvegarde :

Fenêtre de terminal
terraform state push state-backup-20260331-143123.json

Terraform refuse d’écraser un state plus récent (serial supérieur) avec un state plus ancien :

Failed to write state: cannot import state with serial 3 over newer state
with serial 5

Ce garde-fou empêche les restaurations accidentelles qui perdraient des changements.

Si vous êtes certain de vouloir restaurer un state ancien, utilisez -force :

Fenêtre de terminal
terraform state push -force state-backup-20260331-143123.json

Terraform pousse le state et incrémente le serial automatiquement. Après un push forcé du serial 3, le state aura le serial 4 (3 + 1).

Avant toute manipulation du state (mv, rm, import), suivez cette procédure :

  1. Sauvegarder le state actuel

    Fenêtre de terminal
    terraform state pull > state-avant-operation.json

    Ne comptez pas sur terraform.tfstate.backup ici : il ne représentera peut-être déjà plus le bon point de retour après la commande suivante.

  2. Effectuer l’opération

    Fenêtre de terminal
    terraform state mv libvirt_volume.web libvirt_volume.frontend
  3. Vérifier avec un plan

    Fenêtre de terminal
    terraform plan

    Si le plan est propre (No changes), l’opération est réussie.

  4. En cas de problème — restaurer

    Fenêtre de terminal
    terraform state push -force state-avant-operation.json
MécanismeQuandContenuConservation
terraform.tfstate.backupAutomatique à chaque opérationState précédent (N-1)Écrasé à chaque opération
terraform state pull > fichier.jsonManuelState complet au moment TConservé tant que le fichier existe
Versioning S3Automatique (si activé)Historique completToutes les versions
Snapshot backend distantSelon le backendSelon configurationVariable
SymptômeCause probableSolution
cannot import state with serial N over newer state with serial MSerial du backup inférieur au state actuelUtiliser -force si volontaire
cannot import state with serial N, which is the same as the current stateLe fichier poussé est identique au state actuelRien à faire — les states sont identiques
cannot import state with a different lineageLe backup provient d’un autre projetVérifier que le backup correspond au bon projet
Le .backup n’existe pasUn seul apply a été faitNormal — .backup est créé à partir du 2ème apply
state pull retourne un state videAucun apply effectuéLancer terraform apply d’abord
  • terraform state pull exporte le state complet en JSON vers la sortie standard — fonctionne avec tous les backends
  • Redirigez vers un fichier horodaté pour créer des sauvegardes manuelles avant chaque opération risquée
  • Le fichier terraform.tfstate.backup ne contient que la version N-1 — pas un historique complet
  • terraform state push restaure un state depuis un fichier, avec une protection par serial contre les régressions
  • -force est un dernier recours — coordonnez-vous en équipe avant un push forcé
  • Pour un historique complet, activez le versioning S3 ou utilisez un backend avec snapshots

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn