Aller au contenu
Infrastructure as Code medium

Backends Terraform : configuration partielle, -backend-config et migration

15 min de lecture

logo terraform

Par défaut, Terraform stocke le state dans un fichier local (terraform.tfstate). C'est suffisant pour apprendre, mais en équipe on le déplace vers un backend distant (S3, GCS, HCP…) pour partager le state et le verrouiller. Le vrai sujet n'est pas « choisir un backend », c'est comment le configurer proprement : le bloc backend a une contrainte surprenante, et la migration a des pièges qui coûtent cher.

Les comportements mesurables de ce guide (messages d'init, résolution de la configuration partielle, préservation du lineage) ont été rejoués sur Terraform v1.15.4. Les arguments propres au backend S3 (use_lockfile, skip_s3_checksum) reposent sur la doc officielle.

  • Pourquoi le bloc backend n'accepte ni variable ni local
  • La configuration partielle et -backend-config, un fichier par environnement
  • La migration du state : -migrate-state contre -reconfigure
  • Le verrouillage S3, opt-in, et la dépréciation de DynamoDB
  • Le diagnostic : .terraform/terraform.tfstate, et où fuitent les secrets

C'est le piège central, et la doc est nette : « A backend block cannot refer to named values (like input variables, locals, or data source attributes). » Le bloc est lu très tôt, avant l'évaluation des variables. Vérifié sur 1.15.4, ceci échoue :

terraform {
backend "local" {
path = var.chemin # Error: Variables not allowed
}
}

On ne peut donc pas paramétrer un backend par des variables. C'est la raison d'être de la configuration partielle.

On laisse le bloc incomplet et on fournit le reste à l'init :

terraform {
backend "local" {} # partiel : aucune valeur ici
}

Trois formes de -backend-config existent : un fichier (nommage recommandé *.<backend>.tfbackend), une paire KEY=VALUE, ou la saisie interactive :

Fenêtre de terminal
terraform init -backend-config=dev.local.tfbackend
terraform init -backend-config="path=etat/dev/terraform.tfstate"

Un fichier par environnement (dev, prod…) alimente le même bloc sans jamais coder le chemin en dur. Sans ce mécanisme, un même dossier ne peut pas servir deux environnements. Réinitialisé sans -backend-config, un bloc partiel résout ses valeurs à null : c'est la preuve qu'il est bien partiel.

Le fichier .terraform/terraform.tfstate : votre diagnostic

Section intitulée « Le fichier .terraform/terraform.tfstate : votre diagnostic »

Terraform enregistre le backend réellement retenu dans .terraform/terraform.tfstate : backend.type, la backend.config résolue et un hash. Ce n'est pas le state lui-même.

Fenêtre de terminal
jq '.backend | {type, path: .config.path}' .terraform/terraform.tfstate

C'est l'outil de diagnostic numéro un d'un problème de backend, et le seul moyen de voir ce que -backend-config a produit. À noter : il n'existe pas tant que le backend est le local implicite.

Migrer le state : -migrate-state contre -reconfigure

Section intitulée « Migrer le state : -migrate-state contre -reconfigure »

Quand la configuration du backend change, un terraform init nu refuse de tourner. Vérifié sur 1.15.4, message exact :

Error: Backend configuration changed
Either -reconfigure or -migrate-state must be supplied to update the backend
configuration.

Il n'y a donc aucun risque de perte silencieuse : c'est un arrêt franc qui vous force à choisir, en connaissance de cause, entre deux comportements opposés :

OptionCe qu'elle faitQuand
-migrate-statecopie le state existant vers le nouveau backenddéplacer un projet vivant
-reconfigureignore le state de l'ancien backend, repart de zérochanger sans rien emporter

Une migration réussie conserve le lineage du state : c'est la preuve d'une copie, pas d'un apply neuf (qui fabriquerait un lineage différent). Se tromper d'option est une source classique de state perdu.

Pour une migration non interactive (en CI, objectif 3c), ajoutez -force-copy, qui répond « yes » à la place de l'opérateur :

Fenêtre de terminal
terraform init -migrate-state -force-copy -backend-config=dev.local.tfbackend

Le verrouillage : opt-in sur S3, DynamoDB déprécié

Section intitulée « Le verrouillage : opt-in sur S3, DynamoDB déprécié »

Un backend distant peut verrouiller le state pour éviter deux écritures simultanées, mais ce n'est pas automatique partout. Sur le backend S3, « State locking is an opt-in feature » : use_lockfile vaut false par défaut. Une configuration S3 sans use_lockfile = true n'a donc aucun verrou, malgré ce qu'on croit souvent.

L'ancien mécanisme par DynamoDB (dynamodb_table) est désormais déprécié : « DynamoDB-based locking is deprecated and will be removed in a future minor version. » Le chemin actuel est use_lockfile = true (verrou par fichier .tflock dans le bucket).

Le backend s3 fonctionne avec des stockages compatibles, mais « Support for S3 Compatible storage providers is offered as best effort ». Deux points utiles :

  • skip_s3_checksum = true est destiné aux implémentations non AWS (« Useful for some S3-Compatible APIs »), avec les autres skip_*.
  • region est obligatoire, mais peut venir de l'environnement (AWS_REGION) comme les identifiants ; un serveur compatible l'accepte quelle qu'elle soit.

Le lab backends fait passer un projet du backend local implicite à un backend local paramétré : bloc partiel, -backend-config par environnement, et migration prouvée par la préservation du lineage. Il se joue hors ligne, sans compte cloud.

  • Le bloc backend n'accepte aucune valeur nommée : d'où la configuration partielle et -backend-config, un fichier par environnement.
  • Un init après changement de backend refuse : il faut choisir entre -migrate-state (copie) et -reconfigure (abandonne).
  • Une migration réussie conserve le lineage ; -force-copy la rend non interactive.
  • Le verrou S3 est opt-in (use_lockfile = true) ; DynamoDB est déprécié.
  • .terraform/terraform.tfstate porte la config résolue (et la fuite en clair) : c'est votre diagnostic.

Les questions ci-dessous portent sur les pièges du backend : la variable qu'on ne peut pas utiliser, le choix entre migrer et reconfigurer, et le verrou qu'on croit actif. Chaque réponse donne la vérification correspondante.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn