
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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Afficher la fiche d'une instance, y compris indexée par
countoufor_each - Les attributs nuls, qui disparaissent de la fiche sans disparaître du state
- Les valeurs sensibles, caviardées, et l'objet
sensitive_valuesdu JSON terraform show -json: la voie machine, et son revers sur les secrets- Pourquoi
state showne diagnostique pas un écart avec l'infrastructure
Prérequis
Section intitulée « Prérequis »- Terraform 1.11 ou plus récent (installer Terraform).
- Savoir obtenir une adresse avec
terraform state list, et connaître le rôle du state.
Afficher la fiche d'une instance
Section intitulée « Afficher la fiche d'une instance »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 :
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. :
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.
L'adresse doit désigner une instance précise
Section intitulée « L'adresse doit désigner une instance précise »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 :
terraform state show random_pet.replicasNo 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 modifythe address to reference a specific instance.Le code de retour vaut 1. Il faut donc l'index, ou la clé pour un
for_each :
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"]'Les attributs nuls sont omis
Section intitulée « Les attributs nuls sont omis »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 :
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.
Les valeurs sensibles sont caviardées
Section intitulée « Les valeurs sensibles sont caviardées »Second angle mort. Un attribut sensible est remplacé par un marqueur :
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é :
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.
La voie machine : terraform show -json
Section intitulée « La voie machine : terraform show -json »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.
terraform state show -json random_pet.envFailed to parse command-line flagsflag provided but not defined: -jsonC'est terraform show -json, sans state, qui produit le document complet
du state courant.
state show ne rafraîchit rien
Section intitulée « state show ne rafraîchit rien »Troisième piège, et le plus coûteux en diagnostic. La commande lit le state enregistré. Elle n'interroge jamais l'infrastructure.
-
Modifiez l'objet hors de Terraform
Fenêtre de terminal echo "modifie a la main" >> inventaire.txt -
Relancez la fiche : elle est inchangée
Fenêtre de terminal terraform state show local_file.inventaireLe
contentet les empreintes affichés sont toujours ceux du dernierapply. Aucune trace de la modification. -
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 $?2Le code 2 signale des changements : le
planrafraî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.
Les options : une seule, et elle est héritée
Section intitulée « Les options : une seule, et elle est héritée »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.
Dépannage
Section intitulée « Dépannage »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ôme | Cause probable | Solution |
|---|---|---|
No instance found for the given address! | Adresse sans index sur une ressource en count ou for_each | Ajouter [0] ou ["clé"], en quotant sous zsh |
| Un attribut est absent de la fiche | Il vaut null (le plus fréquent), ou il est sensible | Lire terraform show -json, section values |
(sensitive value) au lieu de la valeur | Attribut marqué sensible par le provider | terraform show -json ou terraform output -json, en protégeant la sortie |
flag provided but not defined: -json | state show n'a pas cette option | Utiliser terraform show -json, sans state |
| La fiche ne montre pas une modification faite à la main | state show ne rafraîchit pas | terraform plan (ou -refresh-only) pour voir la dérive |
No state file was found! | Aucun apply, ou state ailleurs | Lancer terraform apply, vérifier le backend |
Mettre en pratique
Section intitulée « Mettre en pratique »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.
À retenir
Section intitulée « À retenir »terraform state showrend la fiche d'une instance : l'adresse doit être précise, index ou clé compris, sinonNo 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 à
nullest omis de la fiche : son absence ne veut pas dire que le provider l'ignore. - Un attribut sensible est caviardé en
(sensitive value); l'objetsensitive_valuesdu JSON dit lesquels le sont. - Tout usage machine passe par
terraform show -json, etstate shown'a pas d'option-json. - Le JSON expose les secrets en clair : protégez le fichier produit.
state showne rafraîchit rien : c'estterraform planqui révèle une dérive, avec le code 2 en-detailed-exitcode.
FAQ : questions fréquentes
Section intitulée « FAQ : questions fréquentes »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.
La commande veut UNE instance, pas une famille
Sur une ressource encount ou for_each, l'adresse nue ne suffit pas :terraform state show random_pet.replicas
# No instance found for the given address!
# This command requires that the address references one specific instance.
Code de retour 1. La forme correcte porte l'index ou la cle :terraform state show 'random_pet.replicas[1]'
terraform state show 'random_pet.zone["eu-west"]'
Les guillemets simples sont obligatoires sous zsh, ou les crochets sont un motif de nom de fichier.La cause la plus frequente est un attribut a null
Verifie sur Terraform 1.15.4 : la fiche derandom_pet.env affiche trois attributs, alors que le state en contient cinq.terraform show -json | jq '.values.root_module.resources[]
| select(.address == "random_pet.env") | .values'
{
"id": "happy-lizard",
"keepers": null,
"length": 2,
"prefix": null,
"separator": "-"
}
keepers et prefix existent bel et bien. Conclure a un attribut « non supporte par le provider » sur la base d'un grep est donc un faux diagnostic.La fiche protege, le JSON expose
terraform state show random_password.api affiche result = (sensitive value). La valeur reelle se lit dans le document JSON :terraform show -json | jq -r '.values.root_module.resources[]
| select(.address == "random_password.api") | .values.result'
Pour savoir quels attributs sont concernes, sans les lire :terraform show -json | jq '.values.root_module.resources[]
| select(.address == "random_password.api") | .sensitive_values'
# { "bcrypt_hash": true, "result": true }
Attention : la doc officielle avertit que « any sensitive values in Terraform state will be displayed in plain text ». Un JSON redirige dans un artefact de CI contient donc vos secrets.Non, et c'est une confusion courante
terraform state show -json random_pet.env
# Failed to parse command-line flags
# flag provided but not defined: -json
Code de retour 1, verifie sur 1.15.4. La bonne commande est terraform show -json, sans state : elle rend tout le state courant en JSON.terraform state show n'accepte en realite qu'une seule option, -state=path, que la documentation qualifie de legacy et reserve au backend local.Elle lit le state, pas l'infrastructure
Verifie sur Terraform 1.15.4 avec unlocal_file modifie a la main :echo "modifie a la main" >> inventaire.txt
terraform state show local_file.inventaire # sortie INCHANGEE
terraform plan -detailed-exitcode > /dev/null 2>&1; echo $?
# 2 -> le plan, lui, rafraichit et voit la derive
state show montre donc l'ecart entre le state et votre code, jamais entre le state et la realite. Pour la derive, utilisez terraform plan ou terraform plan -refresh-only.Deux commandes, deux publics
| Commande | Portee | Destinataire |
|---|---|---|
terraform state show <adresse> |
une seule instance | un humain |
terraform show |
tout le state | un humain |
terraform show -json |
tout le state | un script |
state show porte un avertissement dedie : sa sortie est « intended for human consumption, not programmatic consumption ». Des qu'une valeur alimente un test, un pipeline ou un script, c'est terraform show -json et le decodage de la structure documentee.L'adresse complete, telle que state list l'affiche
terraform state show data.local_file.relecture
terraform state show 'module.reseau.random_pet.sous_reseau["a"]'
Une data source porte le prefixe data., une ressource de module le prefixe module.<nom>.. Le reflexe qui evite les erreurs de frappe : lister d'abord, puis copier l'adresse.terraform state list module.reseau
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Sauvegarder et restaurer le state : ce qui reste quand une fiche revele un state abime.
- terraform state rm : la retirer du state sans détruire l'objet réel.
- Diagnostiquer le state : quand la fiche ne correspond plus à la réalité.
- terraform state show : la référence officielle : l'avertissement sur l'usage humain et l'option
-state. - Format JSON du state :
values,sensitive_valueset la hiérarchie des modules.