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

Verrouiller le state Terraform

11 min de lecture

logo terraform

Quand deux personnes lancent terraform apply en même temps sur le même projet, les deux tentent de modifier le state. Sans protection, le second écrase le travail du premier — ou pire, le state devient incohérent. Le verrouillage (locking) résout ce problème : Terraform pose un verrou sur le state avant toute modification et le libère ensuite. Ce guide vous montre comment ce mécanisme fonctionne et comment réagir quand un verrou reste bloqué.

Prérequis : avoir compris le rôle du state Terraform et idéalement avoir configuré un backend distant.

  • Ce qu’est le verrouillage et pourquoi il est indispensable
  • Comment fonctionne le verrou avec le backend local (fichier .lock.info)
  • Ce qui se passe quand deux apply tournent en même temps
  • Comment lire les informations du verrou (ID, opération, auteur, date)
  • Comment débloquer un verrou orphelin avec terraform force-unlock
  • Les différences de verrouillage selon le backend

Le verrouillage (ou state locking) est un mécanisme qui empêche deux opérations Terraform d’écrire dans le state en même temps. Il s’active automatiquement pour toute commande qui modifie le state : apply, destroy, import, state mv, state rm.

En une phrase : un seul apply à la fois, toujours.

Sans verrouillage, voici ce qui peut arriver quand Alice et Bob travaillent sur le même projet :

ÉtapeAliceBobRésultat
1Lit le state (serial 5)
2Lit le state (serial 5)Même point de départ
3apply → crée VM-ASerial 6
4apply → crée VM-BÉcrase le serial 6 d’Alice
5VM-A disparaît du state

Le state de Bob ne contient pas VM-A — elle est « orpheline ». Terraform ne la gère plus, mais elle existe toujours sur l’hyperviseur. Le verrouillage empêche l’étape 2 : Bob doit attendre qu’Alice ait fini.

Avec le backend local (par défaut), Terraform crée un fichier .terraform.tfstate.lock.info dans le dossier du projet au début de chaque opération qui modifie le state.

Pour voir le verrou, il faut qu’un apply prenne assez de temps. Utilisez une ressource terraform_data avec un provisioner qui attend :

# main.tf — ressource lente pour observer le verrou
resource "terraform_data" "slow" {
input = "verrouillage-demo"
provisioner "local-exec" {
command = "echo 'Début du déploiement...' && sleep 30 && echo 'Fin du déploiement.'"
}
}
  1. Lancez l’apply dans un premier terminal

    Fenêtre de terminal
    terraform apply -auto-approve

    Le provisioner affiche « Début du déploiement… » et attend 30 secondes.

  2. Pendant ce temps, dans un second terminal, affichez le fichier de verrou

    Fenêtre de terminal
    cat .terraform.tfstate.lock.info
    {
    "ID": "b53d7713-b782-99eb-2e08-8363f2719c1e",
    "Operation": "OperationTypeApply",
    "Info": "",
    "Who": "bob@master1",
    "Version": "1.14.3",
    "Created": "2026-03-31T12:05:34.096511527Z",
    "Path": "terraform.tfstate"
    }
  3. Toujours dans le second terminal, tentez un apply concurrent

    Fenêtre de terminal
    terraform apply -auto-approve

    Terraform refuse immédiatement :

    │ Error: Error acquiring the state lock
    │ Error message: resource temporarily unavailable
    │ Lock Info:
    │ ID: b53d7713-b782-99eb-2e08-8363f2719c1e
    │ Path: terraform.tfstate
    │ Operation: OperationTypeApply
    │ Who: bob@master1
    │ Version: 1.14.3
    │ Created: 2026-03-31 12:05:34.096511527 +0000 UTC
    │ Terraform acquires a state lock to protect the state from being written
    │ by multiple users at the same time. Please resolve the issue above and try
    │ again. For most commands, you can disable locking with the "-lock=false"
    │ flag, but this is not recommended.
  4. Une fois le premier apply terminé, vérifiez que le verrou a disparu

    Fenêtre de terminal
    ls .terraform.tfstate.lock.info
    ls: cannot access '.terraform.tfstate.lock.info': No such file or directory

Le fichier .terraform.tfstate.lock.info contient un objet JSON avec six champs :

ChampDescriptionExemple
IDIdentifiant unique du verrou (UUID)b53d7713-b782-99eb-...
OperationType d’opération en coursOperationTypeApply, OperationTypeDestroy
WhoUtilisateur et machine qui détiennent le verroubob@master1
VersionVersion de Terraform qui a posé le verrou1.14.3
CreatedDate et heure de création du verrou (UTC)2026-03-31T12:05:34Z
PathChemin du state verrouilléterraform.tfstate

Ces informations sont précieuses pour diagnostiquer un verrou bloqué : vous savez qui fait quoi depuis quand.

Un verrou peut rester actif si Terraform plante ou si l’utilisateur fait Ctrl+C au mauvais moment. Le fichier .lock.info reste mais personne ne le détient — c’est un verrou orphelin.

Sur le backend local, le verrou utilise le système de fichiers. Si Terraform plante, le fichier .terraform.tfstate.lock.info peut subsister. Pour le supprimer :

Fenêtre de terminal
rm .terraform.tfstate.lock.info

Vérifiez d’abord que personne n’est réellement en train de faire un apply (consultez le champ Who et Created dans le fichier).

Les backends distants (S3, Consul, PostgreSQL…) gèrent le verrou côté serveur. Terraform fournit la commande force-unlock pour ces cas :

Fenêtre de terminal
terraform force-unlock LOCK_ID

Le LOCK_ID est le champ ID affiché dans le message d’erreur. Par exemple :

Fenêtre de terminal
terraform force-unlock b53d7713-b782-99eb-2e08-8363f2719c1e

Terraform demande confirmation avant de supprimer le verrou :

Do you really want to force-unlock?
Terraform will remove the lock on the remote state.
This will allow local Terraform commands to modify this state, even though it
may still be in use. Only 'yes' will be accepted to confirm.
Enter a value: yes

Terraform permet de désactiver le verrouillage avec le flag -lock=false :

Fenêtre de terminal
terraform apply -lock=false

Chaque backend implémente le verrouillage différemment :

BackendMécanisme de verrouillageForce-unlock
localFichier .terraform.tfstate.lock.info (verrou système)Non (rm manuel)
s3Fichier .tflock dans le bucket (Terraform ≥ 1.10) ou DynamoDBOui
consulSession lock ConsulOui
pgAdvisory lock PostgreSQLOui
gcsObjet lock dans le bucketOui
azurermBlob leaseOui
SymptômeCause probableSolution
Error acquiring the state lockUn autre apply est en coursAttendre sa fin, vérifier le champ Who
Verrou bloqué depuis des heuresTerraform a planté ou a été tuéBackend local : rm .terraform.tfstate.lock.info ; distant : terraform force-unlock LOCK_ID
Local state cannot be unlocked by another processforce-unlock sur backend localUtiliser rm au lieu de force-unlock pour le backend local
Verrou bloqué après Ctrl+CInterruption pendant l’écriture du stateVérifier l’intégrité du state (terraform state list), puis supprimer le verrou
  • Le verrouillage empêche deux opérations Terraform d’écrire dans le state en même temps — il est activé par défaut
  • Avec le backend local, le verrou est un fichier .terraform.tfstate.lock.info — créé au début, supprimé à la fin
  • Le verrou contient l’identifiant, l’opération, l’auteur et la date — utiles pour diagnostiquer un blocage
  • Un verrou orphelin (crash, Ctrl+C) se supprime avec rm (local) ou terraform force-unlock (distant)
  • Le flag -lock=false désactive le verrouillage — à ne jamais utiliser en équipe
  • Depuis Terraform 1.10, le backend S3 gère le verrouillage nativement sans DynamoDB

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