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

Détruire proprement avec Terraform

9 min de lecture

logo terraform

Vous lancez terraform destroy et tout disparaît en une commande — mais dans quel ordre ? Si la VM utilise un réseau, peut-elle disparaître après le réseau ? Et si vous ne voulez supprimer qu’une seule ressource sur trois ?

Terraform calcule automatiquement l’ordre de destruction en inversant le graphe de dépendances. Mais certaines situations nécessitent un contrôle plus fin : supprimer une seule VM pour la recréer, retirer une ressource du code sans tout casser, ou nettoyer un state partiel après une erreur.

Ce que vous allez apprendre :

  • Comment Terraform détruit dans l’ordre inverse des dépendances
  • Supprimer une seule ressource avec destroy -target
  • Vérifier l’état restant avec terraform state list
  • La différence entre destroy, supprimer du code + apply, et state rm

Prérequis : avoir suivi les guides Première infrastructure et Réseau virtuel.

Si votre configuration crée :

  1. Un réseau (libvirt_network)
  2. Un disque (libvirt_volume)
  3. Une VM (libvirt_domain) — qui dépend du réseau et du disque

Alors terraform destroy détruit dans cet ordre :

  1. La VM
  2. Le disque
  3. Le réseau

Terraform calcule cet ordre automatiquement en analysant les références entre ressources (libvirt_network.lab_net.name, libvirt_volume.disk.path, etc.).

  1. Créez le répertoire du lab :

    Fenêtre de terminal
    mkdir -p ~/terraform-destroy-propre
    cd ~/terraform-destroy-propre
  2. Créez versions.tf :

    terraform {
    required_version = ">= 1.11.0"
    required_providers {
    libvirt = {
    source = "dmacvicar/libvirt"
    version = "~> 0.8"
    }
    }
    }
    provider "libvirt" {
    uri = "qemu:///system"
    }
  3. Créez main.tf avec 3 ressources :

    resource "libvirt_network" "lab_net" {
    name = "lab15-net"
    autostart = false
    forward = { mode = "nat" }
    ips = [{
    address = "10.99.15.1"
    netmask = "255.255.255.0"
    dhcp = { ranges = [{ start = "10.99.15.100", end = "10.99.15.200" }] }
    }]
    }
    resource "libvirt_volume" "disk" {
    name = "lab15-vm.qcow2"
    pool = "default"
    target = { format = { type = "qcow2" } }
    create = { content = { url = pathexpand("~/images/ubuntu-24.04-cloudimg.img") } }
    }
    resource "libvirt_domain" "vm" {
    name = "lab15-vm"
    type = "kvm"
    memory = 512
    memory_unit = "MiB"
    vcpu = 1
    os = { type = "hvm", type_arch = "x86_64", type_machine = "q35" }
    devices = {
    disks = [{
    source = { file = { file = libvirt_volume.disk.path } }
    target = { dev = "vda", bus = "virtio" }
    }]
    interfaces = [{
    model = { type = "virtio" }
    source = { network = { network = libvirt_network.lab_net.name } }
    }]
    }
    }
    output "created_resources" {
    value = {
    network = libvirt_network.lab_net.name
    vm = libvirt_domain.vm.name
    disk = libvirt_volume.disk.name
    }
    description = "Ressources créées dans ce lab"
    }
  4. Appliquez :

    Fenêtre de terminal
    terraform init
    terraform apply -auto-approve

    Sortie attendue :

    Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

La plupart du temps, terraform destroy supprime tout en une fois. Mais parfois vous voulez supprimer une seule ressource — par exemple pour recréer uniquement la VM sans toucher au réseau.

Fenêtre de terminal
terraform destroy -target=libvirt_domain.vm -auto-approve

Sortie :

Destroy complete! Resources: 1 destroyed.

Vérifiez l’état après destroy ciblé :

Fenêtre de terminal
terraform state list
libvirt_network.lab_net
libvirt_volume.disk

La VM a disparu, mais le réseau et le disque subsistent dans le state. Vous pouvez recréer uniquement la VM :

Fenêtre de terminal
terraform apply -target=libvirt_domain.vm -auto-approve

Une fois les expériences terminées, détruisez toutes les ressources restantes :

Fenêtre de terminal
terraform destroy -auto-approve

Sortie observée (après le destroy ciblé précédent) :

libvirt_network.lab_net: Destroying...
libvirt_volume.disk: Destroying...
libvirt_network.lab_net: Destruction complete after 0s
libvirt_volume.disk: Destruction complete after 1s
Destroy complete! Resources: 2 destroyed.

Terraform détruit uniquement ce qui reste dans son state. Il ne fait pas de double emploi.

Après un terraform destroy, le state existe toujours mais est vide :

Fenêtre de terminal
terraform state list
# (aucune sortie — état vide)

Côté libvirt :

Fenêtre de terminal
virsh list --all # Aucune VM lab15
virsh net-list # Aucun réseau lab15

Que se passe-t-il si on supprime une ressource du code ?

Section intitulée « Que se passe-t-il si on supprime une ressource du code ? »

Il existe une autre façon de “détruire” une ressource : la retirer de votre main.tf puis faire un terraform apply. Terraform détecte que la ressource est dans son état mais plus dans le code, et la supprime.

main.tf avant : réseau + disque + VM
main.tf après : disque + VM
terraform apply : Terraform détruit le réseau

C’est le comportement normal quand vous faites évoluer votre infrastructure : vous enlevez ce dont vous n’avez plus besoin.

ActionCe qui se passe
terraform destroyTerraform supprime + met à jour le state
virsh destroy lab15-vmLa VM s’arrête mais reste dans le state Terraform
Supprimer la ressource de main.tf + applyTerraform supprime + met à jour le state

Si vous supprimez une ressource manuellement (sans Terraform), le prochain terraform plan détectera la divergence et proposera de recréer la ressource manquante.

  • Terraform détruit dans l’ordre inverse des dépendances, automatiquement.
  • destroy -target=<nom> supprime uniquement la ressource ciblée et ses dépendants.
  • Après un destroy ciblé, un state list confirme ce qui reste à gérer.
  • Supprimer une ressource du code puis faire un apply a le même effet qu’un destroy -target.
  • terraform state rm ne supprime pas la ressource réelle — seulement son entrée dans le 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