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

terraform state rm — retirer une ressource du state

9 min de lecture

logo terraform

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.

  • Retirer une ressource du state avec terraform state rm
  • Simuler avec -dry-run avant de modifier
  • Synchroniser le code HCL après le retrait
  • Utiliser le bloc removed comme alternative déclarative (Terraform >= 1.7)
  • Comprendre les conséquences : ressource orpheline vs ressource détruite
Fenêtre de terminal
terraform state rm [options] ADRESSE
ParamètreRôle
ADRESSEAdresse de la ressource à retirer (ex : libvirt_volume.db)
-dry-runSimule le retrait sans modifier le 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.

  1. Identifier la ressource à retirer

    Fenêtre de terminal
    terraform state list
    libvirt_network.net
    libvirt_volume.db
    libvirt_volume.web
  2. Simuler le retrait

    Utilisez -dry-run pour vérifier avant de modifier :

    Fenêtre de terminal
    terraform state rm -dry-run libvirt_volume.db
    Would remove libvirt_volume.db
  3. Exécuter le retrait

    Fenêtre de terminal
    terraform state rm libvirt_volume.db
    Removed libvirt_volume.db
    Successfully removed 1 resource instance(s).
  4. Vérifier le state

    Fenêtre de terminal
    terraform state list
    libvirt_network.net
    libvirt_volume.web

    Le volume db n’apparaît plus dans le state.

  5. Confirmer que l’infrastructure existe toujours

    La ressource physique est intacte — state rm ne 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

Pour obtenir un plan propre, supprimez le bloc resource correspondant du fichier .tf :

# Supprimer ce bloc après state rm
resource "libvirt_volume" "db" {
name = "db-server.qcow2"
# ...
}

Puis vérifiez :

Fenêtre de terminal
terraform plan
No changes. Your infrastructure matches the configuration.

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 information
for 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.
Critèreterraform state rmBloc removed
Version minimaleToutesTerraform >= 1.7
ModeImpératif (commande CLI)Déclaratif (dans le code)
TraçabilitéAucune trace dans le codeVisible dans l’historique Git
CollaborationChaque membre doit exécuter la commandeAutomatique pour toute l’équipe
SécuritéRisque d’oublier de mettre à jour le codeCode auto-synchronisé
Possibilité de détruireNon — retrait purConfigurable via destroy = true
BesoinSolution
Cesser de gérer une ressource créée manuellement avant Terraformstate rm puis supprimer le bloc
Transférer une ressource à un autre projet Terraformstate rm dans le projet A, terraform import dans le projet B
Supprimer le suivi d’une data sourcestate rm data.type.nom
Retirer un module completstate rm 'module.nom_module'

Si l’adresse n’existe pas dans le state :

Fenêtre de terminal
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.

SymptômeCause probableSolution
Invalid target addressL’adresse n’existe pas dans le stateVérifier avec terraform state list
Plan veut recréer la ressource après rmLe bloc resource est encore dans le codeSupprimer le bloc du .tf
L’apply échoue avec un conflit de nomLa ressource physique existe déjà (même nom)state rm + supprimer le bloc, ou terraform import
No state file was foundAucun apply effectuéLancer terraform apply d’abord
Le removed block ne fonctionne pasVersion Terraform < 1.7Mettre à jour ou utiliser state rm
  • terraform state rm retire une ressource du state uniquement — l’infrastructure réelle n’est pas touchée
  • Utilisez -dry-run pour 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 — avec lifecycle { 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

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