Aller au contenu
Infrastructure as Code medium

Outputs Terraform : type, sensibilité et precondition

15 min de lecture

logo terraform

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.

  • Les sept arguments réels du bloc output
  • La contrainte de type sur un output (Terraform 1.15)
  • Pourquoi sensitive ne 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 precondition qui bloque le plan, et depends_on, et ephemeral

Un output ne se réduit pas à value. Le bloc accepte sept arguments, et quatre sont souvent ignorés :

ArgumentRôle
valuerequis, l'expression exposée
descriptiondocumente l'output
typecontrainte de type (Terraform 1.15)
sensitivemasque l'affichage (défaut false)
ephemeralexclut la valeur du state et du plan (1.10+)
depends_ondépendance explicite pour l'ordonnancement
preconditiongarantie é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.

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 values

La 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.

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.

Ces symptômes touchent presque tous à la sensibilité ou au type. Le tableau les relie à leur cause.

SymptômeCauseSolution
Output refers to sensitive valuesUn 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 pipelineoutput -json et -raw lèvent la redactionChiffrer le state, ne pas logger le JSON, ou ephemeral en module enfant
terraform output -raw échoueLa valeur n'est pas une chaîne, un nombre ou un booléenUtiliser -json, ou exposer un attribut scalaire
Le plan échoue sur un outputUn precondition a rejeté la valeurCorriger l'entrée, la condition n'est pas satisfaite
ephemeral refusé au module racineIl est réservé aux modules enfantsLe retirer, ou déplacer l'output dans un module appelé
  1. Le bloc output a sept arguments : value, description, type, sensitive, ephemeral, depends_on, precondition.
  2. Depuis 1.15, un output peut être typé, comme une variable.
  3. sensitive masque l'affichage, pas le state : -json et -raw rendent la valeur en clair.
  4. La sensibilité se propage, même à travers sha256 : un output dérivé d'un secret doit être sensible, ou déclassifié.
  5. nonsensitive() expose volontairement une valeur dérivée sûre ; à manier avec preuve.
  6. ephemeral exclut réellement du state, mais seulement en module enfant.
  7. Un precondition sur un output bloque le plan ; depends_on ordonne.

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.

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