
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