
Un output expose une valeur hors du module : le résultat d'une configuration,
lu par un humain, un autre module ou un pipeline. Le déclarer est simple. Ce qui
piège, c'est ce que sensitive ne masque pas, la façon dont la
sensibilité se propage à travers les expressions, et le fait qu'un output
n'est pas passif : un precondition peut faire échouer le plan.
Ce guide part de la base, la déclaration et le typage, puis traite la
sensibilité et sa propagation, nonsensitive(), le precondition, depends_on
et ephemeral. Tous les comportements ont été vérifiés sur Terraform v1.15.4.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Les sept arguments réels du bloc
output - La contrainte de type sur un output (Terraform 1.15)
- Pourquoi
sensitivene protège pas le secret, et où il reste en clair - Comment la sensibilité se propage, même à travers
sha256 nonsensitive()pour exposer volontairement une valeur dérivée- Le
preconditionqui bloque le plan, etdepends_on, etephemeral
Prérequis
Section intitulée « Prérequis »- Ressources et attributs (déclarer des ressources Terraform)
- Variables et sensibilité (variables Terraform)
- Terraform 1.15.x, la série stable courante
Les sept arguments d'un bloc output
Section intitulée « Les sept arguments d'un bloc output »Un output ne se réduit pas à value. Le bloc accepte sept arguments, et
quatre sont souvent ignorés :
| Argument | Rôle |
|---|---|
value | requis, l'expression exposée |
description | documente l'output |
type | contrainte de type (Terraform 1.15) |
sensitive | masque l'affichage (défaut false) |
ephemeral | exclut la valeur du state et du plan (1.10+) |
depends_on | dépendance explicite pour l'ordonnancement |
precondition | garantie évaluée au plan, échoue si fausse |
output "url_service" { type = string value = "https://${aws_lb.front.dns_name}" description = "URL publique du service."}Depuis Terraform 1.15, la contrainte type documente le contrat du module,
exactement comme pour une variable, et améliore la cohérence entre validation,
plan et apply.
sensitive masque l'affichage, pas le state
Section intitulée « sensitive masque l'affichage, pas le state »Voici le malentendu central, et il est dangereux. sensitive = true ne protège
pas le secret. Il masque la valeur dans la sortie humaine de plan,
apply et terraform output, rien de plus. La documentation est explicite :
When you run Terraform commands with a local state file, Terraform stores the state as plain text, including variable values, even if you have flagged them as sensitive.
Concrètement, terraform show -json, terraform output -json et
terraform output -raw rendent la valeur en clair, et le fichier d'état la
stocke telle quelle.
output "mot_de_passe" { value = random_password.admin.result sensitive = true}La sensibilité se propage, même à travers une fonction
Section intitulée « La sensibilité se propage, même à travers une fonction »C'est le comportement qui bloque réellement les apprenants. Toute expression
qui utilise une valeur sensible devient sensible. Un output qui référence un
attribut sensible sans sensitive = true est refusé au plan :
Error: Output refers to sensitive valuesLa documentation le formule ainsi : « Expressions used in outputs can only refer
to sensitive values if the sensitive attribute is true. » Et la contagion
traverse les fonctions : le sha256 d'un mot de passe reste sensible,
alors qu'un hachage n'est pourtant pas réversible.
nonsensitive() : déclassifier volontairement
Section intitulée « nonsensitive() : déclassifier volontairement »Pour exposer sciemment une valeur dérivée d'un secret mais qui ne le divulgue
pas, comme un hachage, on la déclassifie avec nonsensitive() :
output "empreinte" { value = nonsensitive(sha256(random_password.admin.result))}Pour exclure réellement une valeur du state et du plan, c'est
ephemeral = true (Terraform 1.10+), réservé aux modules enfants et
interdit dans le module racine, pas sensitive.
Un output n'est pas passif : precondition et depends_on
Section intitulée « Un output n'est pas passif : precondition et depends_on »On présente souvent l'output comme purement passif, incapable d'agir. C'est faux
sur deux points. Un bloc precondition, avec un error_message
obligatoire, fait échouer le plan si sa condition est fausse. C'est la
garantie de dernière ligne d'un module, évaluée au plan :
output "empreinte_rapport" { value = sha256(local_file.rapport.content)
precondition { condition = var.longueur >= 20 error_message = "longueur doit valoir au moins 20." }}Et depends_on sur un output ordonne les opérations : « Terraform completes
operations on upstream resources before computing dependent outputs. » Utile
quand la dépendance n'apparaît pas dans l'expression value, à réserver aux cas
où aucune référence ne l'exprime.
Dépannage
Section intitulée « Dépannage »Ces symptômes touchent presque tous à la sensibilité ou au type. Le tableau les relie à leur cause.
| Symptôme | Cause | Solution |
|---|---|---|
Output refers to sensitive values | Un output référence un secret sans être marqué | Ajouter sensitive = true, ou nonsensitive() si la valeur ne divulgue rien |
| Un secret apparaît en clair dans un pipeline | output -json et -raw lèvent la redaction | Chiffrer le state, ne pas logger le JSON, ou ephemeral en module enfant |
terraform output -raw échoue | La valeur n'est pas une chaîne, un nombre ou un booléen | Utiliser -json, ou exposer un attribut scalaire |
| Le plan échoue sur un output | Un precondition a rejeté la valeur | Corriger l'entrée, la condition n'est pas satisfaite |
ephemeral refusé au module racine | Il est réservé aux modules enfants | Le retirer, ou déplacer l'output dans un module appelé |
À retenir
Section intitulée « À retenir »- Le bloc
outputa sept arguments :value,description,type,sensitive,ephemeral,depends_on,precondition. - Depuis 1.15, un output peut être typé, comme une variable.
sensitivemasque l'affichage, pas le state :-jsonet-rawrendent la valeur en clair.- La sensibilité se propage, même à travers
sha256: un output dérivé d'un secret doit être sensible, ou déclassifié. nonsensitive()expose volontairement une valeur dérivée sûre ; à manier avec preuve.ephemeralexclut réellement du state, mais seulement en module enfant.- Un
preconditionsur un output bloque le plan ;depends_onordonne.
FAQ : questions fréquentes
Section intitulée « FAQ : questions fréquentes »Les questions ci-dessous reprennent les confusions les plus fréquentes sur les
outputs : la vraie portée de sensitive, la propagation de la sensibilité, et le
rôle actif du precondition.
Un masque d'affichage
sensitive = true masque la valeur dans la sortie humaine de plan, apply et terraform output. C'est tout.When you run Terraform commands with a local state file, Terraform stores the state as plain text, including variable values, even if you have flagged them as sensitive.
Vérifié sur 1.15.4
terraform show -json, terraform output -json et terraform output -raw rendent la valeur en clair. La protection réelle est un state chiffré et à accès restreint.La propagation de la sensibilité
Une expression qui utilise une valeur sensible devient sensible. Un output qui la référence sans être marqué est refusé :Error: Output refers to sensitive values
La doc : « Expressions used in outputs can only refer to sensitive values if the sensitive attribute is true. »La correction
output "mot_de_passe" {
value = random_password.admin.result
sensitive = true
}
La contagion traverse les fonctions
Vérifié sur Terraform 1.15.4 :sha256(random_password.admin.result) est sensible, même si un hachage n'est pas réversible. Un output non marqué qui l'expose échoue.La déclassification
output "empreinte" {
value = nonsensitive(sha256(random_password.admin.result))
}
nonsensitive() retire la marque. À n'employer que sur une valeur qui ne divulgue rien, comme un hachage, jamais sur le secret lui-même.La contrainte de type (1.15)
output "resume" {
type = object({
longueur = number
empreinte = string
})
value = {
longueur = 24
empreinte = "..."
}
}
Pourquoi
Comme pour une variable, letype documente le contrat du module : l'appelant sait ce qu'il reçoit, et Terraform vérifie la cohérence entre validation, plan et apply.precondition sur un output
output "empreinte_rapport" {
value = sha256(local_file.rapport.content)
precondition {
condition = var.longueur >= 20
error_message = "longueur doit valoir au moins 20."
}
}
Évalué au plan
Si la condition est fausse, Terraform arrête au plan avec l'error_message (obligatoire). C'est la garantie de dernière ligne d'un module, la preuve qu'un output n'est pas purement passif.La limite de -raw
terraform output -raw rend la valeur brute, sans guillemets, pratique pour un script shell. Mais « it only supports string, number, and boolean values ». Un output liste, map ou objet le fait échouer.Les options
- exposer un attribut scalaire (chaîne, nombre, booléen) ;
- ou utiliser
terraform output -json.
Attention au secret
-raw et -json affichent les valeurs sensibles en clair.La vraie exclusion du state
ephemeral = true (Terraform 1.10+) « omits that value from state and plan files ». C'est ce que sensitive ne fait pas.Deux règles
- Modules enfants uniquement :
ephemeralsur un output est interdit dans le module racine. - La valeur doit provenir d'un contexte éphémère et ne peut être référencée que dans un autre contexte éphémère.
sensitive ne l'est pas.Pour aller plus loin
Section intitulée « Pour aller plus loin »- sensitive : masquer les valeurs : Masque une valeur dans la sortie sans la protéger dans le state.
- Les valeurs éphémères : Garde un secret hors du state, complément d'un output sensible.
- Variables et outputs d'un module : Applique les outputs à l'interface d'un module réutilisable.