
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 que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
applytournent 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
Ce qu’est le verrouillage
Section intitulée « Ce qu’est le verrouillage »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.
Pourquoi c’est indispensable
Section intitulée « Pourquoi c’est indispensable »Sans verrouillage, voici ce qui peut arriver quand Alice et Bob travaillent sur le même projet :
| Étape | Alice | Bob | Résultat |
|---|---|---|---|
| 1 | Lit le state (serial 5) | ||
| 2 | Lit le state (serial 5) | Même point de départ | |
| 3 | apply → crée VM-A | Serial 6 | |
| 4 | apply → crée VM-B | Écrase le serial 6 d’Alice | |
| 5 | VM-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.
Comment fonctionne le verrou — backend local
Section intitulée « Comment fonctionne le verrou — backend local »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.
Observer le verrou en action
Section intitulée « Observer le verrou en action »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 verrouresource "terraform_data" "slow" { input = "verrouillage-demo"
provisioner "local-exec" { command = "echo 'Début du déploiement...' && sleep 30 && echo 'Fin du déploiement.'" }}-
Lancez l’apply dans un premier terminal
Fenêtre de terminal terraform apply -auto-approveLe provisioner affiche « Début du déploiement… » et attend 30 secondes.
-
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"} -
Toujours dans le second terminal, tentez un apply concurrent
Fenêtre de terminal terraform apply -auto-approveTerraform 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.╵ -
Une fois le premier apply terminé, vérifiez que le verrou a disparu
Fenêtre de terminal ls .terraform.tfstate.lock.infols: cannot access '.terraform.tfstate.lock.info': No such file or directory
Lire les informations du verrou
Section intitulée « Lire les informations du verrou »Le fichier .terraform.tfstate.lock.info contient un objet JSON avec six champs :
| Champ | Description | Exemple |
|---|---|---|
ID | Identifiant unique du verrou (UUID) | b53d7713-b782-99eb-... |
Operation | Type d’opération en cours | OperationTypeApply, OperationTypeDestroy |
Who | Utilisateur et machine qui détiennent le verrou | bob@master1 |
Version | Version de Terraform qui a posé le verrou | 1.14.3 |
Created | Date et heure de création du verrou (UTC) | 2026-03-31T12:05:34Z |
Path | Chemin du state verrouillé | terraform.tfstate |
Ces informations sont précieuses pour diagnostiquer un verrou bloqué : vous savez qui fait quoi depuis quand.
Débloquer un verrou orphelin
Section intitulée « Débloquer un verrou orphelin »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.
Avec le backend local
Section intitulée « Avec le backend local »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 :
rm .terraform.tfstate.lock.infoVérifiez d’abord que personne n’est réellement en train de faire un apply (consultez le champ Who et Created dans le fichier).
Avec un backend distant
Section intitulée « Avec un backend distant »Les backends distants (S3, Consul, PostgreSQL…) gèrent le verrou côté serveur. Terraform fournit la commande force-unlock pour ces cas :
terraform force-unlock LOCK_IDLe LOCK_ID est le champ ID affiché dans le message d’erreur. Par exemple :
terraform force-unlock b53d7713-b782-99eb-2e08-8363f2719c1eTerraform 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: yesLe flag -lock=false
Section intitulée « Le flag -lock=false »Terraform permet de désactiver le verrouillage avec le flag -lock=false :
terraform apply -lock=falseVerrouillage selon le backend
Section intitulée « Verrouillage selon le backend »Chaque backend implémente le verrouillage différemment :
| Backend | Mécanisme de verrouillage | Force-unlock |
|---|---|---|
| local | Fichier .terraform.tfstate.lock.info (verrou système) | Non (rm manuel) |
| s3 | Fichier .tflock dans le bucket (Terraform ≥ 1.10) ou DynamoDB | Oui |
| consul | Session lock Consul | Oui |
| pg | Advisory lock PostgreSQL | Oui |
| gcs | Objet lock dans le bucket | Oui |
| azurerm | Blob lease | Oui |
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Error acquiring the state lock | Un autre apply est en cours | Attendre sa fin, vérifier le champ Who |
| Verrou bloqué depuis des heures | Terraform 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 process | force-unlock sur backend local | Utiliser rm au lieu de force-unlock pour le backend local |
Verrou bloqué après Ctrl+C | Interruption pendant l’écriture du state | Vérifier l’intégrité du state (terraform state list), puis supprimer le verrou |
À retenir
Section intitulée « À retenir »- 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 avecrm(local) outerraform force-unlock(distant) - Le flag
-lock=falsedésactive le verrouillage — à ne jamais utiliser en équipe - Depuis Terraform 1.10, le backend S3 gère le verrouillage nativement sans DynamoDB