Aller au contenu
English
English
Infrastructure as Code medium

Terragrunt : dépendances et mock_outputs

8 min de lecture

logo terragrunt

Comment faire quand une unit Terragrunt a besoin de la sortie d'une autre unit qui n'a pas encore été appliquée ? C'est le problème classique du premier plan multi-units. Le bloc dependency et l'option mock_outputs servent justement a gérer ce cas sans perdre le bénéfice d'un run multi-units.

Dans ce guide, on part d'un exemple concret avec deux units : une unit amont qui produit une sortie, puis une unit aval qui la consomme.

  • Comprendre le role du bloc dependency pour lire les outputs d'une autre unit
  • Savoir quand mock_outputs devient nécessaire pour débloquer un premier plan
  • Lancer un plan puis un apply multi-units en ordre
  • Vérifier que le résultat final utilise bien les vraies sorties, pas les mocks

Avant de passer a la pratique, quatre termes reviennent dans tout ce guide :

TermeRole
upstreamLa unit amont qui produit une sortie
downstreamLa unit aval qui consomme cette sortie
dependencyLe bloc Terragrunt qui permet de lire les outputs d'une autre unit
mock_outputsUne valeur provisoire fournie pour laisser passer un premier plan

Imaginez que vous montez un meuble en deux étapes. L'étape 2 a besoin de connaître la hauteur exacte produite par l'étape 1. Tant que l'étape 1 n'est pas terminée, vous pouvez quand même planifier l'étape 2 avec une dimension approximative. C'est exactement le role de mock_outputs : donner une valeur provisoire pour avancer dans le plan, puis utiliser la vraie mesure au moment du montage réel.

Pour reproduire ce scenario, créez cette arborescence :

  • Répertoirelab-c/
    • Répertoiremodules/
      • Répertoirewrite-file/
        • main.tf
    • Répertoirelive/
      • Répertoiredev/
        • Répertoireupstream/
        • Répertoiredownstream/
          • terragrunt.hcl

Placez le module suivant 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
}

Fichier live/dev/upstream/terragrunt.hcl :

terraform {
source = "../../../modules/write-file"
}
inputs = {
filename = "${get_terragrunt_dir()}/upstream.txt"
content = "hello from upstream"
}

La unit downstream utilise ce pattern :

terraform {
source = "../../../modules/write-file"
}
dependency "upstream" {
config_path = "../upstream"
mock_outputs = {
content = "mocked upstream"
}
mock_outputs_allowed_terraform_commands = ["plan"]
}
inputs = {
filename = "${get_terragrunt_dir()}/downstream.txt"
content = "downstream reads: ${dependency.upstream.outputs.content}"
}

Copiez ce second bloc dans live/dev/downstream/terragrunt.hcl.

Le raisonnement est simple :

  • config_path indique quelle unit lire ;
  • dependency.upstream.outputs... permet de récupérer ses outputs ;
  • mock_outputs fournit une valeur temporaire quand les outputs réels ne sont pas encore disponibles.

Lors d'un premier run --all plan, l'unit amont n'a pas encore d'état applique. Il n'existe donc pas encore d'outputs réels a lire. Terragrunt sait bien ordonner les units, mais il ne peut pas inventer une valeur qui n'a jamais été materialisee.

Le bloc mock_outputs donne alors une valeur de substitution pour laisser le plan avancer. C'est utile pour vérifier la structure globale avant le premier apply complet.

Dans le pattern recommande, les mocks sont autorisés seulement ici :

mock_outputs_allowed_terraform_commands = ["plan"]

Cette restriction est importante. Elle dit explicitement :

  • pendant plan, une valeur de simulation est acceptable ;
  • pendant apply, on veut les vrais outputs de l'upstream.

Cette discipline évite de laisser trainer des valeurs fictives dans une phase ou la création réelle des ressources est en train de se produire.

Voici la sequence a suivre :

  1. Lancer terragrunt run --all plan

    Verification : Terragrunt annonce bien que l'upstream n'a pas encore d'outputs réels, mais utilise les mock_outputs pour permettre au plan de continuer.

  2. Lancer terragrunt run --all apply

    Verification : l'unit upstream est appliquée avant l'unit downstream.

  3. Vérifier les fichiers produits

    Deux fichiers doivent exister :

    • upstream.txt avec hello from upstream
    • downstream.txt avec downstream reads: hello from upstream
  4. Lancer terragrunt run --all destroy

    Verification : les deux units sont detruites proprement ensuite.

Le point clé est que le contenu final de downstream.txt ne reprend pas la valeur mockee. Il reprend bien la vraie sortie de l'upstream après apply.

Il faut bien distinguer deux blocs Terragrunt souvent confondus :

BlocRole
dependencyLit des outputs d'une autre unit
dependenciesIndique seulement un ordre entre units, sans lecture d'outputs

Si vous avez besoin de consommer une sortie, utilisez dependency. Si vous ne voulez qu'imposer un ordre global, dependencies suffit souvent.

SymptômeCause probableSolution
Le plan casse avant le premier applyAucun output réel encore disponibleAjouter mock_outputs sur la dependency
Le apply continue avec une fausse valeurLes mocks restent autorisés trop largementLimiter mock_outputs_allowed_terraform_commands a plan
Mauvais ordre d'exécutionconfig_path faux ou relation mal définieVérifier le chemin et la vraie dépendance logique
  • Le bloc dependency sert a lire les outputs d'une autre unit.
  • mock_outputs sert surtout a débloquer un premier plan multi-units.
  • Il vaut mieux limiter les mocks a plan et utiliser les vrais outputs en apply.
  • Le résultat final doit être verifie avec une sortie observable, pas seulement avec le log.
  • Terragrunt sait ordonner les units, mais il a besoin d'aide quand les outputs n'existent pas encore.

Ce site vous est utile ?

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

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. 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