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

Fonctions HCL : chaînes, collections et transformations

4 min de lecture

Les fonctions HCL servent à transformer des valeurs sans alourdir votre code. C’est elles qui vous évitent de concaténer à la main, de reconstruire des maps laborieusement, ou de multiplier des conditions peu lisibles. Elles sont très présentes dans Terraform et Packer.

Le plus important n’est pas de mémoriser toute la référence, mais de reconnaître quelques grandes familles de fonctions et les problèmes qu’elles résolvent.

Ces fonctions servent à nettoyer, composer ou formater du texte :

locals {
slug = replace(lower(var.project), " ", "-")
short_name = substr(var.project, 0, 8)
display = format("%s-%s", var.project, var.environment)
}

Retenez notamment :

  • lower() et upper() ;
  • replace() ;
  • substr() ;
  • format() ;
  • split() et join().

Elles servent à manipuler listes, sets, maps et objets :

locals {
names = distinct(var.names)
all_names = concat(["bootstrap"], local.names)
config = merge(var.default_tags, var.extra_tags)
has_admin = contains(var.roles, "admin")
}

Les plus fréquentes sont souvent :

  • length() ;
  • contains() ;
  • concat() ;
  • distinct() ;
  • merge() ;
  • keys() et values() ;
  • lookup().

Certaines fonctions sont utiles pour garder un code plus robuste :

locals {
enabled_text = tostring(var.enabled)
safe_port = try(var.service.port, 8080)
valid_name = can(regex("^[a-z0-9-]+$", var.project))
}

Trois fonctions valent l’effort d’être retenues tôt :

  • tostring(), tonumber(), tolist() et autres conversions ;
  • try() pour prévoir un repli ;
  • can() pour tester si une expression s’évalue sans erreur.

La logique générale est commune aux deux outils. Exemples :

  • dans Terraform, vous utiliserez souvent ces fonctions pour construire des tags, des noms de ressources, des valeurs d’outputs ou des locals ;
  • dans Packer, vous les utiliserez pour préparer une image, générer des labels, composer un identifiant de build ou sélectionner des paquets.

Exemple Packer :

locals {
image_name = format("%s-%s", var.project, var.environment)
packages = var.environment == "prod" ? ["curl", "ca-certificates"] : ["curl", "jq", "vim"]
}

Exemple Terraform :

locals {
vm_name = format("%s-%s", var.project, var.environment)
tags = merge(var.default_tags, { Name = local.vm_name })
}

Même si Terraform et Packer partagent une grande partie de l’écosystème HCL, toutes les fonctions ne sont pas forcément disponibles de manière identique dans toutes les versions. Si vous travaillez sur un projet ancien, vérifiez toujours la version de l’outil avant d’utiliser une fonction récente.

  • Les fonctions HCL évitent le code répétitif et rendent les expressions lisibles.
  • Commencez par les familles chaînes, collections et robustesse.
  • format(), merge(), contains(), length(), lookup(), try() et can() couvrent déjà beaucoup de cas réels.
  • Terraform et Packer partagent largement cette logique, même si les usages concrets diffèrent.

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