Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Expressions HCL : références, conditions et transformations

5 min de lecture

Une expression HCL est une valeur calculée à partir d’autres valeurs. C’est elle qui permet de concaténer des chaînes, choisir une valeur selon un contexte, transformer une liste ou construire un objet sans répéter du code. Vous la retrouvez partout dans Terraform et Packer.

La difficulté ne vient pas de la syntaxe brute, mais du fait qu’on mélange souvent les expressions avec la logique métier de l’outil. Cette page reste au niveau du langage : elle vous apprend à lire les expressions HCL avant de passer aux guides Terraform ou Packer plus spécialisés.

Une expression peut être très simple :

name = "vm-dev"
enabled = true
memory = 2048

Elle peut aussi être calculée :

name = "${var.environment}-web"
enabled = var.environment == "prod"

Dans les deux cas, le côté droit de l’assignation est une expression.

Les expressions HCL deviennent utiles dès que vous lisez des valeurs nommées. Les familles exactes dépendent de l’outil, mais les deux plus communes sont :

  • var.nom pour une valeur d’entrée ;
  • local.nom pour une valeur calculée localement.

Exemple Terraform :

locals {
vm_name = "${var.environment}-web"
}

Exemple Packer :

locals {
full_image = "${var.base_image}:${var.image_tag}"
}

Les expressions HCL utilisent les opérateurs classiques :

locals {
is_prod = var.environment == "prod"
has_quota = var.cpu >= 2 && var.memory >= 2048
name = "${var.project}-01"
}

Vous retrouvez notamment :

  • == et != pour comparer ;
  • >, >=, <, <= pour les bornes ;
  • &&, ||, ! pour la logique ;
  • +, -, *, /, % pour les calculs numériques.

Une condition ternaire choisit une valeur selon un test booléen :

locals {
instance_type = var.environment == "prod" ? "large" : "small"
}

Cette forme est très fréquente :

  • dans Terraform pour choisir une taille, un nom, une option ou un ensemble de tags ;
  • dans Packer pour activer certains paquets ou ajuster une option de build.

Quand une expression entière est seule, vous n’avez pas besoin de ${} :

count = var.instance_count

En revanche, si vous insérez une expression dans une chaîne, l’interpolation reste pertinente :

name = "${var.project}-${var.environment}"

Cette distinction évite l’un des contresens les plus courants en HCL.

HCL permet aussi de transformer des collections avec une expression for :

locals {
labels = [for package in var.packages : upper(package)]
}

Ou de construire une map :

locals {
tags = {
for key, value in var.labels :
lower(key) => value
}
}

Cette capacité est commune à Terraform et Packer. En revanche, la manière d’utiliser le résultat dépend ensuite du schéma de l’outil.

Cette page vous donne le cadre général. Passez ensuite à un guide dédié si votre difficulté principale est :

  • Une expression HCL est une valeur littérale ou calculée.
  • var. et local. sont les références nommées les plus communes.
  • Les conditions ternaires, compréhensions et interpolations sont des briques normales du langage.
  • HCL fournit la syntaxe ; Terraform et Packer définissent ensuite où ces expressions sont autorisées et à quoi elles servent.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn