
terraform state rm retire une ressource du state sans la détruire dans l’infrastructure réelle. L’inverse d’un import : la ressource continue d’exister, mais Terraform cesse de la gérer. C’est la commande indispensable quand vous voulez « dé-manager » une ressource — par exemple pour la rattacher à un autre projet Terraform ou la gérer manuellement. Depuis Terraform 1.7, le bloc removed offre une alternative déclarative.
Prérequis : savoir utiliser terraform state list et terraform state show pour identifier la ressource à retirer.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Retirer une ressource du state avec
terraform state rm - Simuler avec
-dry-runavant de modifier - Synchroniser le code HCL après le retrait
- Utiliser le bloc
removedcomme alternative déclarative (Terraform >= 1.7) - Comprendre les conséquences : ressource orpheline vs ressource détruite
terraform state rm [options] ADRESSE| Paramètre | Rôle |
|---|---|
ADRESSE | Adresse de la ressource à retirer (ex : libvirt_volume.db) |
-dry-run | Simule le retrait sans modifier le state |
Retirer une ressource du state
Section intitulée « Retirer une ressource du state »Le scénario type : un volume a été créé par Terraform, mais vous décidez de le gérer manuellement ou de le rattacher à un autre projet.
-
Identifier la ressource à retirer
Fenêtre de terminal terraform state listlibvirt_network.netlibvirt_volume.dblibvirt_volume.web -
Simuler le retrait
Utilisez
-dry-runpour vérifier avant de modifier :Fenêtre de terminal terraform state rm -dry-run libvirt_volume.dbWould remove libvirt_volume.db -
Exécuter le retrait
Fenêtre de terminal terraform state rm libvirt_volume.dbRemoved libvirt_volume.dbSuccessfully removed 1 resource instance(s). -
Vérifier le state
Fenêtre de terminal terraform state listlibvirt_network.netlibvirt_volume.webLe volume
dbn’apparaît plus dans le state. -
Confirmer que l’infrastructure existe toujours
La ressource physique est intacte —
state rmne touche jamais l’infrastructure :Fenêtre de terminal ls -la /var/lib/libvirt/images/db-server.qcow2-rw------- 1 root root 196672 mars 31 14:24 /var/lib/libvirt/images/db-server.qcow2
Synchroniser le code après state rm
Section intitulée « Synchroniser le code après state rm »Pour obtenir un plan propre, supprimez le bloc resource correspondant du fichier .tf :
# Supprimer ce bloc après state rmresource "libvirt_volume" "db" { name = "db-server.qcow2" # ...}Puis vérifiez :
terraform planNo changes. Your infrastructure matches the configuration.Alternative déclarative : le bloc removed
Section intitulée « Alternative déclarative : le bloc removed »Depuis Terraform 1.7, le bloc removed permet de retirer une ressource du state directement dans le code HCL. Plus besoin de commande manuelle — le retrait s’applique automatiquement au prochain apply.
Remplacez le bloc resource par un bloc removed :
removed { from = libvirt_volume.web
lifecycle { destroy = false }}Le lifecycle { destroy = false } indique à Terraform de retirer la ressource du state sans la détruire. Le plan affiche clairement l’intention :
# libvirt_volume.web will no longer be managed by Terraform, # but will not be destroyed # (destroy = false is set in the configuration) . resource "libvirt_volume" "web" { id = "/var/lib/libvirt/images/web-server.qcow2" name = "web-server.qcow2" # (8 unchanged attributes hidden) }
Plan: 0 to add, 0 to change, 0 to destroy.Un terraform apply finalise le retrait :
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.La ressource est sortie du state mais existe toujours dans l’infrastructure. Le warning de Terraform le confirme :
Warning: Some objects will no longer be managed by Terraform
If you apply this plan, Terraform will discard its tracking informationfor the following objects, but it will not delete them: - libvirt_volume.web
After applying this plan, Terraform will no longer manage these objects.You will need to import them into Terraform to manage them again.state rm ou removed : lequel choisir ?
Section intitulée « state rm ou removed : lequel choisir ? »| Critère | terraform state rm | Bloc removed |
|---|---|---|
| Version minimale | Toutes | Terraform >= 1.7 |
| Mode | Impératif (commande CLI) | Déclaratif (dans le code) |
| Traçabilité | Aucune trace dans le code | Visible dans l’historique Git |
| Collaboration | Chaque membre doit exécuter la commande | Automatique pour toute l’équipe |
| Sécurité | Risque d’oublier de mettre à jour le code | Code auto-synchronisé |
| Possibilité de détruire | Non — retrait pur | Configurable via destroy = true |
Cas d’usage courants
Section intitulée « Cas d’usage courants »| Besoin | Solution |
|---|---|
| Cesser de gérer une ressource créée manuellement avant Terraform | state rm puis supprimer le bloc |
| Transférer une ressource à un autre projet Terraform | state rm dans le projet A, terraform import dans le projet B |
| Supprimer le suivi d’une data source | state rm data.type.nom |
| Retirer un module complet | state rm 'module.nom_module' |
Erreur : adresse inexistante
Section intitulée « Erreur : adresse inexistante »Si l’adresse n’existe pas dans le state :
terraform state rm libvirt_volume.inexistant╷│ Error: Invalid target address││ No matching objects found. To view the available instances, use "terraform│ state list". Please modify the address to reference a specific instance.╵Vérifiez toujours l’adresse avec terraform state list.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Invalid target address | L’adresse n’existe pas dans le state | Vérifier avec terraform state list |
Plan veut recréer la ressource après rm | Le bloc resource est encore dans le code | Supprimer le bloc du .tf |
| L’apply échoue avec un conflit de nom | La ressource physique existe déjà (même nom) | state rm + supprimer le bloc, ou terraform import |
No state file was found | Aucun apply effectué | Lancer terraform apply d’abord |
Le removed block ne fonctionne pas | Version Terraform < 1.7 | Mettre à jour ou utiliser state rm |
À retenir
Section intitulée « À retenir »terraform state rmretire une ressource du state uniquement — l’infrastructure réelle n’est pas touchée- Utilisez
-dry-runpour simuler le retrait avant de modifier le state - Après un
state rm, supprimez le bloc du code HCL pour éviter une recréation au prochain plan - Le bloc
removed(Terraform >= 1.7) est l’alternative déclarative — aveclifecycle { destroy = false }pour empêcher la destruction - Pour re-gérer une ressource retirée, utilisez
terraform import - C’est l’opération inverse de
terraform import: import ajoute au state, rm retire du state