Aller au contenu
Infrastructure as Code medium

terraform state show : lire une instance, et ce que la fiche cache

25 min de lecture

logo terraform

terraform state show <adresse> affiche la fiche d'une instance enregistrée dans le state. Là où state list donne l'inventaire, state show ouvre le détail. C'est la lecture de confort du quotidien, et la documentation officielle précise pour qui : cette sortie est destinée à la consommation humaine, pas programmatique. Ce guide montre comment l'obtenir, ce qu'elle omet, ce qu'elle caviarde, et par quoi la remplacer dès qu'un script en dépend.

Tous les comportements de ce guide ont été exécutés sur Terraform v1.15.4 avec les providers random et local : aucun hyperviseur ni compte cloud n'est nécessaire pour les reproduire.

  • Afficher la fiche d'une instance, y compris indexée par count ou for_each
  • Les attributs nuls, qui disparaissent de la fiche sans disparaître du state
  • Les valeurs sensibles, caviardées, et l'objet sensitive_values du JSON
  • terraform show -json : la voie machine, et son revers sur les secrets
  • Pourquoi state show ne diagnostique pas un écart avec l'infrastructure

La commande prend une adresse et rend la fiche correspondante. Le projet de démonstration déclare un random_pet, un random_password, trois répliques en count et une data source :

Fenêtre de terminal
terraform state show random_pet.env
# random_pet.env:
resource "random_pet" "env" {
id = "happy-lizard"
length = 2
separator = "-"
}

La fiche est mise en forme comme du HCL, avec l'adresse en commentaire sur la première ligne. Elle se lit de haut en bas, sans outil. Une data source s'inspecte de la même façon, avec son préfixe data. :

Fenêtre de terminal
terraform state show data.local_file.relecture
# data.local_file.relecture:
data "local_file" "relecture" {
content = <<-EOT
env=happy-lizard
EOT
content_base64 = "ZW52PWhhcHB5LWxpemFyZAo="
content_base64sha256 = "k0hX0NbbCdEz35/9IztEB9nPepaPOI+xCOC3DbY/Ev4="
...
}

Retenez le nombre d'attributs de la première fiche : trois. Nous y reviendrons.

C'est le premier mur après un state list, et le message est explicite. Sur une ressource créée avec count, l'adresse sans index ne désigne aucune instance :

Fenêtre de terminal
terraform state show random_pet.replicas
No instance found for the given address!
This command requires that the address references one specific instance.
To view the available instances, use "terraform state list". Please modify
the address to reference a specific instance.

Le code de retour vaut 1. Il faut donc l'index, ou la clé pour un for_each :

Fenêtre de terminal
terraform state show 'random_pet.replicas[1]'
terraform state show 'random_pet.zone["eu-west"]'
terraform state show 'module.reseau.random_pet.sous_reseau["a"]'

Voici le premier angle mort. Un attribut qui vaut null n'apparaît pas dans la fiche. Il existe pourtant dans le state, et la sortie JSON le montre :

Fenêtre de terminal
terraform show -json | jq '.values.root_module.resources[]
| select(.address == "random_pet.env") | .values'
{
"id": "happy-lizard",
"keepers": null,
"length": 2,
"prefix": null,
"separator": "-"
}

Cinq attributs dans le state, trois dans la fiche. keepers et prefix existent, à null, et la fiche les passe sous silence.

La conséquence pratique est un faux diagnostic classique : un grep keepers sur la sortie de state show ne renvoie rien, et l'on en conclut que le provider ne gère pas cet attribut. La bonne question n'est pas « le provider le connaît-il », mais « vaut-il null », et seule la sortie JSON y répond.

Second angle mort. Un attribut sensible est remplacé par un marqueur :

Fenêtre de terminal
terraform state show random_password.api
# random_password.api:
resource "random_password" "api" {
bcrypt_hash = (sensitive value)
id = "none"
length = 24
lower = true
...
result = (sensitive value)
}

C'est une protection réelle et utile : la fiche peut être montrée, collée dans un ticket ou partagée en revue sans fuiter le secret. Mais elle rend la valeur inatteignable par ce chemin, et un grep result renverra le marqueur, pas le mot de passe.

Pour savoir quels attributs Terraform tient pour sensibles, ressource par ressource, le JSON expose un objet dédié :

Fenêtre de terminal
terraform show -json | jq '.values.root_module.resources[]
| select(.address == "random_password.api") | .sensitive_values'
{
"bcrypt_hash": true,
"result": true
}

C'est la trace exploitable : elle dit ce qui sera caviardé, avant même de regarder une fiche.

Dès qu'une valeur doit servir ailleurs que sous vos yeux, dans un test, un pipeline ou un script, la documentation de state show désigne nommément la voie correcte : produire le document JSON et décoder la structure documentée.

Attention à un détail qui piège : terraform state show n'a pas d'option -json.

Fenêtre de terminal
terraform state show -json random_pet.env
Failed to parse command-line flags
flag provided but not defined: -json

C'est terraform show -json, sans state, qui produit le document complet du state courant.

Troisième piège, et le plus coûteux en diagnostic. La commande lit le state enregistré. Elle n'interroge jamais l'infrastructure.

  1. Modifiez l'objet hors de Terraform

    Fenêtre de terminal
    echo "modifie a la main" >> inventaire.txt
  2. Relancez la fiche : elle est inchangée

    Fenêtre de terminal
    terraform state show local_file.inventaire

    Le content et les empreintes affichés sont toujours ceux du dernier apply. Aucune trace de la modification.

  3. C'est le plan qui révèle la dérive

    Fenêtre de terminal
    terraform plan -input=false -detailed-exitcode > /dev/null 2>&1; echo $?
    2

    Le code 2 signale des changements : le plan rafraîchit, lui.

state show montre donc l'écart entre le state et votre code, jamais entre le state et la réalité. Le confondre conduit à conclure « tout va bien » sur une ressource modifiée dans le dos de Terraform.

La syntaxe s'écrit terraform state show [options] ADRESSE, mais ce pluriel est trompeur : il n'existe qu'une seule option, -state=path, que la documentation qualifie de legacy et réserve au backend local. Pour tout le reste, notamment la sortie machine, la réponse est terraform show -json.

Le réflexe qui résout la majorité des cas : partir de state list pour obtenir l'adresse exacte, puis basculer sur le JSON dès qu'un attribut semble manquer.

SymptômeCause probableSolution
No instance found for the given address!Adresse sans index sur une ressource en count ou for_eachAjouter [0] ou ["clé"], en quotant sous zsh
Un attribut est absent de la ficheIl vaut null (le plus fréquent), ou il est sensibleLire terraform show -json, section values
(sensitive value) au lieu de la valeurAttribut marqué sensible par le providerterraform show -json ou terraform output -json, en protégeant la sortie
flag provided but not defined: -jsonstate show n'a pas cette optionUtiliser terraform show -json, sans state
La fiche ne montre pas une modification faite à la mainstate show ne rafraîchit pasterraform plan (ou -refresh-only) pour voir la dérive
No state file was found!Aucun apply, ou state ailleursLancer terraform apply, vérifier le backend

Le lab terraform state show fait remplir cinq sorties qui ne peuvent venir que du state : deux adresses, dont une indexée, une empreinte à référencer, un mot de passe que la fiche caviarde, et la liste des attributs nuls que la fiche omet. Les tests recalculent chaque vérité depuis le JSON et n'utilisent la fiche que pour prouver ce qu'elle cache. Le lab se joue hors ligne.

  • terraform state show rend la fiche d'une instance : l'adresse doit être précise, index ou clé compris, sinon No instance found for the given address! en code 1.
  • La sortie est faite pour un humain. La doc l'écrit, et interdit d'en extraire des données par programme.
  • Un attribut à null est omis de la fiche : son absence ne veut pas dire que le provider l'ignore.
  • Un attribut sensible est caviardé en (sensitive value) ; l'objet sensitive_values du JSON dit lesquels le sont.
  • Tout usage machine passe par terraform show -json, et state show n'a pas d'option -json.
  • Le JSON expose les secrets en clair : protégez le fichier produit.
  • state show ne rafraîchit rien : c'est terraform plan qui révèle une dérive, avec le code 2 en -detailed-exitcode.

Les questions ci-dessous portent sur ce qui bloque le plus souvent : l'adresse refusée, l'attribut introuvable, et la valeur qu'on n'arrive pas à récupérer. Chaque réponse donne la commande de vérification.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn