Aller au contenu
Infrastructure as Code medium

Expressions Terraform : références, types et conversion

15 min de lecture

logo terraform

Une expression calcule une valeur : une interpolation, un opérateur, un ternaire, une référence. C'est le tissu de toute configuration Terraform. Le déclarer est simple ; les pièges se cachent dans les détails : la syntaxe de référence d'une ressource, la conversion de types (présente pour l'arithmétique, absente pour l'égalité), et la valeur null qu'on remplace à tort par une chaîne vide.

Ce guide part de la base, où vivent les expressions et comment les tester, puis traite les références, les types et leur conversion, null, la précédence des opérateurs et les valeurs inconnues au plan. Tous les comportements ont été vérifiés sur Terraform v1.15.4 dans terraform console.

  • Où vivent les expressions, et tester avec terraform console
  • La référence d'une ressource gérée, sans préfixe
  • La conversion automatique de types, et l'exception de ==
  • null comme absence, pas comme chaîne vide
  • La précédence des opérateurs, et les valeurs inconnues au plan
  • Un projet Terraform initialisé (installer Terraform)
  • Terraform 1.15.x, la série stable courante

terraform console évalue une expression sans rien appliquer. Il est interactif, mais s'utilise aussi en script, en lui passant des commandes sur l'entrée standard, ce qui en fait un vrai outil de test et de CI :

Fenêtre de terminal
echo 'max(3, 7, 2)' | terraform console
7

L'option -plan évalue même les expressions contre l'état planifié. C'est le moyen le plus rapide de vérifier une expression avant de l'écrire dans une ressource.

Les valeurs nommées ont chacune leur préfixe : var.nom, local.nom, data.<type>.<nom>.<attribut>, module.<nom>.<sortie>, auxquels s'ajoutent each.key / each.value, count.index, path.module / path.root et terraform.workspace. Mais une ressource gérée fait exception : elle se référence SANS préfixe, par <type>.<nom>.<attribut> :

resource "random_string" "jeton" {
length = 8
}
output "valeur" {
value = random_string.jeton.result
}

Écrire resource.random_string.jeton.result est une erreur : le mot resource n'apparaît jamais dans une expression. C'est le seul cas de la liste sans préfixe, et la confusion la plus fréquente des débutants.

Terraform a trois types primitifs (string, number, bool) et des types complexes (list, set, tuple, map, object). Entre primitifs, il convertit automatiquement quand il le peut, notamment pour l'arithmétique :

> "5" + 3
8

La chaîne "5" devient un nombre. Mais l'égalité ne convertit pas, et c'est la règle qui surprend le plus :

> 1 == "1"
false

Le nombre 1 et la chaîne "1" ne sont pas égaux. La documentation est nette : « Automatic type conversion does not occur when using the equality operator. » Elle recommande de n'employer == et != qu'entre types identiques, ou après une conversion explicite (tostring(), tonumber()).

null représente l'absence d'une valeur. Affecter null à un argument de ressource revient à ne pas l'écrire du tout : Terraform applique alors le défaut du provider. La documentation le dit : « If you set an argument of a resource to null, Terraform behaves as though you had completely omitted it. »

resource "local_file" "exemple" {
filename = "exemple.txt"
content = "x"
file_permission = var.perm != "" ? var.perm : null
}

Quand var.perm est vide, l'argument vaut null et la permission retombe sur le défaut du provider. Écrire une chaîne vide "" à la place serait une valeur bien réelle, souvent invalide, pas une omission. C'est le mécanisme standard pour rendre un argument optionnel, et le piège classique de la chaîne vide employée à sa place.

Les opérateurs suivent une précédence classique : l'unaire (!, -), puis * / %, puis + -, puis les comparaisons, puis &&, puis ||. Le multiplicatif passe avant l'additif :

> 1 + 2 * 3
7

1 + 2 * 3 se lit 1 + (2 * 3), soit 7, jamais 9. En cas de doute, les parenthèses lèvent l'ambiguïté et documentent l'intention.

Enfin, une expression qui dépend d'un attribut pas encore créé vaut (known after apply). Cette inconnue se propage : une valeur connue combinée à une valeur inconnue donne une valeur inconnue. Trois conséquences concrètes : un count ne peut pas dépendre d'un attribut de ressource, la lecture d'une data source peut être reportée à l'apply, et certains outputs n'ont leur valeur qu'après l'apply. C'est le sujet le plus discriminant du niveau Professional.

Cette page pose le cadre. Quatre familles d'expressions ont leur guide dédié :

Pour produire du JSON ou du YAML, préférez d'ailleurs jsonencode() et yamlencode() à un heredoc <<-, plus sûrs sur l'échappement.

Ces symptômes viennent presque tous d'une règle de type ou de référence. Le tableau les relie à leur cause.

SymptômeCauseSolution
Reference to undeclared resourceUn préfixe resource. écrit dans l'expressionRéférencer sans préfixe : type.nom.attribut
Une égalité vraie attendue rend false== ne convertit pas les typesComparer entre types identiques, ou convertir (tostring, tonumber)
Un ternaire censé rendre un nombre rend une chaîneConversion silencieuse vers un type communConvertir explicitement, ou aligner les deux branches
Un argument mis à "" provoque une erreur du providerLa chaîne vide est une valeur, pas une omissionUtiliser null pour omettre l'argument
Invalid count argument (valeur inconnue)count dépend d'un attribut known after applyLe fonder sur une variable ou une valeur connue au plan
  1. terraform console évalue une expression sans appliquer, et s'utilise en script (entrée standard, -plan).
  2. Une ressource gérée se référence sans préfixe : type.nom.attribut.
  3. L'arithmétique convertit les types ("5" + 3 = 8), == non (1 == "1" = false).
  4. Un ternaire convertit ses branches vers un type commun, sans erreur.
  5. null omet un argument ; une chaîne vide est une valeur.
  6. Précédence : * avant + ; 1 + 2 * 3 = 7.
  7. Une valeur inconnue au plan (known after apply) se propage.

Les questions ci-dessous reprennent les confusions les plus fréquentes sur les expressions : la référence sans préfixe, la conversion de types, et null.

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