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

Terragrunt : stacks implicites ou explicites ?

9 min de lecture

logo terragrunt

Vous avez vu des mentions de “stacks” dans Terragrunt, mais vous ne savez pas si vous devez utiliser l’approche implicite ou explicite ? La reponse depend de la taille de votre repo et de votre besoin de reutilisation.

Cette page compare les deux approches sur un meme module minimal pour que vous puissiez les tester et choisir en connaissance de cause.

  • Comprendre la difference entre stack implicite et stack explicite
  • Reproduire les deux approches sur un meme module minimal
  • Choisir le bon point de depart selon la taille de votre repo
  • Savoir quand passer de l’une a l’autre

Commencez par cette regle simple :

Votre besoinPoint de depart recommande
Quelques units rangees naturellement par dossiersStack implicite
Une composition reutilisable de plusieurs unitsStack explicite
Un repo encore debutant, peu de repetitionStack implicite
Un modele a generer plusieurs fois avec des valeurs differentesStack explicite

Pour comparer les deux approches sans bruit, on reutilise exactement le meme module Terraform ou OpenTofu dans les deux cas. Placez-le dans modules/write-file/main.tf :

terraform {
required_version = ">= 1.6.0"
required_providers {
local = {
source = "hashicorp/local"
version = "~> 2.5"
}
}
}
variable "filename" {
type = string
}
variable "content" {
type = string
}
resource "local_file" "this" {
filename = var.filename
content = var.content
}
output "file_path" {
value = local_file.this.filename
}
output "content" {
value = local_file.this.content
}

Le resultat observe est simple : chaque unit cree un fichier local avec un nom et un contenu differents.

Dans une stack implicite, c’est l’arborescence qui raconte la composition. Terragrunt parcourt les dossiers deployables et construit sa logique a partir de la structure et, si besoin, des dependances declarees.

  • Répertoirelab-implicit/
    • Répertoiremodules/
      • Répertoirewrite-file/
        • main.tf
    • Répertoirelive/
      • root.hcl
      • Répertoire_env/
        • write-file.hcl
      • Répertoiredev/
        • Répertoirefoo/
          • terragrunt.hcl
        • Répertoirebar/
          • terragrunt.hcl

Fichier live/root.hcl :

locals {
stack_name = "dev"
}

Fichier live/_env/write-file.hcl :

locals {
module_source = "${dirname(find_in_parent_folders("root.hcl"))}/../modules/write-file"
}
inputs = {
content_prefix = "hello"
}

Fichier live/dev/foo/terragrunt.hcl :

include "root" {
path = find_in_parent_folders("root.hcl")
expose = true
}
include "env" {
path = "${get_terragrunt_dir()}/../../_env/write-file.hcl"
expose = true
}
terraform {
source = include.env.locals.module_source
}
inputs = {
filename = "${get_terragrunt_dir()}/foo.txt"
content = "${include.env.inputs.content_prefix} from foo in ${include.root.locals.stack_name}"
}

Fichier live/dev/bar/terragrunt.hcl :

include "root" {
path = find_in_parent_folders("root.hcl")
expose = true
}
include "env" {
path = "${get_terragrunt_dir()}/../../_env/write-file.hcl"
expose = true
}
terraform {
source = include.env.locals.module_source
}
inputs = {
filename = "${get_terragrunt_dir()}/bar.txt"
content = "${include.env.inputs.content_prefix} from bar in ${include.root.locals.stack_name}"
}
  1. Creer les fichiers du live repo

    Verification : vous avez bien root.hcl, _env/write-file.hcl, puis deux units foo et bar.

  2. Vous placer dans live/dev

    Puis lancer :

    Fenêtre de terminal
    terragrunt run --all apply

    Verification : foo/foo.txt contient hello from foo in dev et bar/bar.txt contient hello from bar in dev.

  3. Nettoyer

    Fenêtre de terminal
    terragrunt run --all destroy

    Verification : les deux fichiers ont disparu.

Dans une stack explicite, vous ne laissez plus uniquement l’arborescence porter la composition. Vous declarez la liste des units dans un fichier terragrunt.stack.hcl.

  • Répertoirelab-explicit/
    • Répertoiremodules/
      • Répertoirewrite-file/
        • main.tf
    • Répertoirestacks/
      • Répertoiredev/
        • terragrunt.stack.hcl
    • Répertoireunits/
      • Répertoirewrite-file-unit/
        • terragrunt.hcl

Fichier units/write-file-unit/terragrunt.hcl :

terraform {
source = "../../modules/write-file"
}
inputs = {
filename = "${get_terragrunt_dir()}/${values.filename}"
content = values.content
}

Fichier stacks/dev/terragrunt.stack.hcl :

unit "app" {
source = "../../units/write-file-unit"
path = "app"
no_dot_terragrunt_stack = true
values = {
filename = "stack-app.txt"
content = "hello from explicit stack app"
}
}
unit "worker" {
source = "../../units/write-file-unit"
path = "worker"
no_dot_terragrunt_stack = true
values = {
filename = "stack-worker.txt"
content = "hello from explicit stack worker"
}
}
  1. Vous placer dans stacks/dev

    Puis lancer :

    Fenêtre de terminal
    terragrunt stack generate

    Verification : deux dossiers app et worker apparaissent avec leurs fichiers terragrunt.hcl.

  2. Appliquer la stack

    Fenêtre de terminal
    terragrunt run --all apply

    Verification : app/stack-app.txt contient hello from explicit stack app et worker/stack-worker.txt contient hello from explicit stack worker.

  3. Nettoyer

    Fenêtre de terminal
    terragrunt run --all destroy

    Verification : les deux fichiers ont disparu.

AspectStack impliciteStack explicite
Source de veriteL’arborescence du repoLe fichier terragrunt.stack.hcl
Mise en routePlus simple au debutPlus structuree
Generation de unitsManuelleAutomatique via stack generate
Lisibilite sur petit repoExcellenteParfois excessive
Reutilisation d’une compositionLimiteePlus forte
  • Choisissez la stack implicite si votre repo reste lisible naturellement par dossiers et que vous voulez avancer sans sur-architecture.
  • Choisissez la stack explicite si vous voulez decrire, generer et rejouer plusieurs units comme un bloc coherent et reutilisable.
SymptomeCause probableSolution
Le repo implicite devient confusTrop de logique est dispersee dans les dossiersRevenir a root.hcl, _env et des units plus lisibles
stack generate ne cree rienMauvais source ou mauvais cheminVerifier terragrunt.stack.hcl et le dossier courant
Une stack explicite semble trop lourdeLe repo est encore trop simpleRevenir a une stack implicite
  • Une stack implicite s’appuie surtout sur l’arborescence du repo.
  • Une stack explicite decrit la composition dans terragrunt.stack.hcl.
  • Les deux approches peuvent reutiliser exactement le meme module.
  • Commencez simple, puis montez en explicite quand la composition devient un vrai sujet.
  • Le bon choix depend moins de l’outil que de la taille et de la forme du repo.

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