📗 Terragrunt#
Référentiel des blocs de configuration Terragrunt#
Vue d’ensemble#
Bloc |
Type |
Rôle |
|---|---|---|
|
Block |
Configurer l’exécution Terraform/OpenTofu |
|
Block |
Configurer le backend d’état |
|
Block |
Hériter d’une configuration parente |
|
Block |
Définir des variables réutilisables |
|
Block |
Accéder aux outputs d’un autre module |
|
Block |
Orchestrer l’ordre d’exécution |
|
Block |
Générer des fichiers HCL/JSON avant l’exécution |
|
Block |
Flags de fonctionnalité |
|
Block |
Exclure conditionnellement un module |
|
Block |
Gérer les erreurs (retry, ignore) |
|
Block |
Configurer un moteur d’exécution alternatif |
|
Block |
Déclarer des unités/stacks (fichier |
|
Attribute |
Passer des variables à Terraform |
terraform#
Contrôle comment Terragrunt exécute Terraform/OpenTofu.
terraform {
source = "github.com/org/modules.git//vpc?ref=v1.0.0"
extra_arguments "common" {
commands = get_terraform_commands_that_need_vars()
arguments = ["-var-file=common.auto.tfvars"]
}
before_hook "show_version" {
commands = ["init", "plan", "apply"]
execute = ["terraform", "version"]
}
after_hook "show_outputs" {
commands = ["apply"]
execute = ["terraform", "output", "-json"]
}
error_hook "handle_failure" {
commands = ["apply"]
on_errors = [".*Error: timeout.*"]
execute = ["echo", "Apply failed due to timeout"]
}
}
Attribut |
Type |
Description |
|---|---|---|
|
string (req) |
URL ou chemin local du module. Supporte |
|
bool |
Copier |
|
Block (0+) |
Arguments CLI supplémentaires conditionnels |
|
Block (0+) |
Hook exécuté avant la commande |
|
Block (0+) |
Hook exécuté après la commande |
|
Block (0+) |
Hook exécuté en cas d’erreur (matching |
|
[]string |
Fichiers |
Hook sub-block attributes :
Attribut |
Type |
Description |
|---|---|---|
|
string |
Identifiant du hook |
|
[]string |
Commandes qui déclenchent le hook |
|
[]string |
Commande et arguments à exécuter |
|
expression |
Condition pour exécuter le hook |
|
bool |
Exécuter même si une erreur précédente |
|
bool |
Supprimer la sortie standard |
|
string |
Répertoire de travail |
|
[]string |
(error_hook) Regex matchés contre le message d’erreur |
remote_state#
Configure le backend d’état et génère automatiquement le fichier backend.tf.
remote_state {
backend = "s3"
generate = {
path = "backend.tf"
if_exists = "overwrite_terragrunt"
}
config = {
bucket = "my-state-bucket"
key = "${path_relative_to_include()}/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "my-lock-table"
}
}
Attribut |
Type |
Description |
|---|---|---|
|
string (req) |
Nom du backend ( |
|
map (req) |
Paramètres du backend passés à Terraform |
|
map |
Générer un fichier |
|
bool |
Désactiver le bloc |
generate sub-attributes :
Attribut |
Valeurs |
|---|---|
|
Chemin du fichier à générer (relatif au working dir) |
|
|
include#
Hérite et fusionne une configuration parente.
include "root" {
path = find_in_parent_folders("root.hcl")
expose = true
merge_strategy = "deep"
}
Attribut |
Type |
Description |
|---|---|---|
|
string (req) |
Identifiant de l’include |
|
string (req) |
Chemin vers le fichier parent |
|
bool |
Rendre accessible via |
|
string |
|
Stratégies de merge :
Stratégie |
Comportement |
|---|---|
|
Pas de fusion — accès uniquement via |
|
Fusion superficielle (les clés du child remplacent celles du parent) |
|
Fusion profonde (les maps sont fusionnées récursivement) |
|
Fusion profonde uniquement pour les maps, pas les lists |
Accès aux valeurs exposées :
inputs = {
region = include.root.locals.region
bucket = include.root.remote_state.config.bucket
}
locals#
Définit des variables réutilisables dans la configuration.
locals {
env = "dev"
region = "eu-west-1"
project = "myapp"
state_key = "${local.project}/${local.env}/${path_relative_to_include()}"
parent_config = read_terragrunt_config(find_in_parent_folders("env.hcl"))
}
Un seul bloc locals par fichier. Toutes les variables sont préfixées par local..
dependency#
Accède aux outputs d’un autre module Terragrunt.
dependency "vpc" {
config_path = "../vpc"
mock_outputs_allowed_terraform_commands = ["validate", "plan"]
mock_outputs = {
vpc_id = "vpc-00000000"
subnet_ids = ["subnet-aaa", "subnet-bbb"]
}
mock_outputs_merge_strategy_with_state = "shallow"
}
inputs = {
vpc_id = dependency.vpc.outputs.vpc_id
subnet_ids = dependency.vpc.outputs.subnet_ids
}
Attribut |
Type |
Description |
|---|---|---|
|
string (req) |
Identifiant (référence via |
|
string (req) |
Chemin relatif vers le |
|
bool |
Activer/désactiver la dépendance (défaut: |
|
bool |
Ne pas récupérer les outputs (défaut: |
|
any |
Outputs simulés si le module n’est pas encore appliqué |
|
[]string |
Commandes où les mock outputs sont autorisés |
|
string |
|
dependencies#
Orchestre l’ordre d’exécution (sans accéder aux outputs).
dependencies {
paths = ["../vpc", "../security-group"]
}
Attribut |
Type |
Description |
|---|---|---|
|
[]string (req) |
Chemins relatifs vers les modules à exécuter d’abord |
Différence clé : dependencies ne fait que définir l’ordre ; dependency expose en plus les outputs.
generate#
Génère des fichiers HCL/JSON avant l’exécution de Terraform.
generate "provider" {
path = "provider.tf"
if_exists = "overwrite_terragrunt"
contents = <<EOF
provider "aws" {
region = "${local.region}"
}
EOF
}
generate "tags" {
path = "tags.auto.tfvars"
if_exists = "overwrite"
contents = <<EOF
tags = {
environment = "${local.env}"
project = "${local.project}"
}
EOF
}
Attribut |
Type |
Description |
|---|---|---|
|
string (req) |
Identifiant unique |
|
string (req) |
Chemin du fichier à générer |
|
string (req) |
|
|
string (req) |
Contenu du fichier |
|
string |
Action si |
|
string |
Préfixe des commentaires de signature (défaut: |
|
bool |
Omettre l’en-tête “generated by Terragrunt” |
|
bool |
Désactiver le bloc |
errors#
Gestion des erreurs avec retry et ignore.
errors {
retry "transient" {
retryable_errors = [".*Error: transient network issue.*"]
max_attempts = 3
sleep_interval_sec = 5
}
ignore "safe_warnings" {
ignorable_errors = [".*Warning: deprecated.*"]
message = "Ignoring deprecation warnings"
}
}
Sous-bloc |
Attributs |
|---|---|
|
|
|
|
feature#
Flags de fonctionnalité Terragrunt.
feature "terraform_lock" {
enabled = true
}
exclude#
Exclut conditionnellement un module de l’exécution.
exclude {
path = "live/us-east-1/dev/legacy-module"
}
engine#
Configure un moteur d’exécution alternatif (ex: OpenTofu au lieu de Terraform).
engine "opentofu" {
source = "github.com/opentofu/opentofu/releases/download/v1.6.0/tofu_1.6.0_linux_amd64.zip"
}
inputs (attribut, pas un bloc)#
inputs = {
name = "my-vpc"
cidr = "10.0.0.0/16"
azs = ["us-east-1a", "us-east-1b"]
vpc_id = dependency.vpc.outputs.vpc_id
region = include.root.locals.region
}
Passé directement comme variables à Terraform via -var ou .tfvars.
unit et stack (fichier terragrunt.stack.hcl)#
Nouveauté pour les Stacks Terragrunt — définies dans un fichier terragrunt.stack.hcl distinct de terragrunt.hcl.
# terragrunt.stack.hcl
locals {
region = "eu-west-1"
}
unit "vpc" {
source = "github.com/org/modules.git//vpc?ref=v1.0.0"
path = "vpc"
values = {
cidr_block = "10.0.0.0/16"
}
}
stack "subnets" {
source = "github.com/org/modules.git//stacks/subnets?ref=v1.0.0"
path = "subnets"
values = {
availability_zone = "eu-west-1a"
}
}
Bloc |
Cardinalité |
Rôle |
|---|---|---|
|
0 ou 1 |
Variables locales du stack |
|
0+ |
Inclure d’autres configurations de stack |
|
0+ |
Déclarer une unité Terragrunt |
|
0+ |
Déclarer un stack imbriqué |
Ordre de parsing#
L’ordre dans lequel Terragrunt évalue les blocs est important :
include(de toutes les configurations de l’arbre)locals(de toutes les configurations de l’arbre)dependency(de toutes les configurations, sans récupérer les outputs)terraform(de toutes les configurations)dependencies(de toutes les configurations)dependencyoutputs (récupération réelle)inputs,generate,remote_state, etc.
Cela signifie qu’on peut référencer local.* dans inputs, et dependency.*.outputs dans inputs, mais pas l’inverse.
Exemple complet combinant plusieurs blocs#
# live/us-east-1/dev/app/terragrunt.hcl
include "root" {
path = find_in_parent_folders("root.hcl")
}
locals {
env = "dev"
region = "us-east-1"
}
dependency "vpc" {
config_path = "../vpc"
mock_outputs = {
vpc_id = "vpc-mock"
subnet_ids = ["subnet-mock"]
}
}
dependencies {
paths = ["../vpc", "../security-group"]
}
terraform {
source = "${get_path_to_repo_root()}//modules/app"
}
inputs = {
name = "my-app-${local.env}"
vpc_id = dependency.vpc.outputs.vpc_id
subnet_ids = dependency.vpc.outputs.subnet_ids
aws_region = local.region
}
generate "provider" {
path = "provider.tf"
if_exists = "overwrite_terragrunt"
contents = <<EOF
provider "aws" {
region = "${local.region}"
}
EOF
}
Tour d’horizon des fonctions intégrées de Terragrunt#
Chemins et hiérarchie de configuration#
Fonction |
Description |
Exemple |
|---|---|---|
|
Monte l’arborescence et retourne le chemin absolu du premier fichier correspondant. Sans argument, cherche |
|
|
Chemin relatif depuis le fichier parent inclus vers le fichier actuel. |
|
|
Chemin relatif depuis le fichier actuel vers le fichier parent inclus. |
|
|
Chemin absolu du répertoire contenant le |
|
|
Chemin du répertoire du fichier parent inclus. |
|
|
Chemin du répertoire du |
|
|
Chemin du répertoire de travail courant. |
Exemple typique d’héritage :
# live/us-east-1/dev/mysql/terragrunt.hcl
include "root" {
path = find_in_parent_folders()
}
locals {
env_config = read_terragrunt_config(find_in_parent_folders("env.hcl"))
}
remote_state {
backend = "s3"
config = {
bucket = "mycompany-state"
key = "us-east-1/${local.env_config.locals.environment}/mysql/terraform.tfstate"
region = "us-east-1"
}
}
Lecture de configuration#
Fonction |
Description |
|---|---|
|
Parse un fichier HCL Terragrunt et retourne son contenu ( |
|
Lit un fichier |
|
Déchiffre un fichier chiffré avec SOPS et retourne le contenu. |
Différence clé include vs read_terragrunt_config :
includefusionne les blocs (remote_state,generate,terraform, etc.) du fichier parent dans la configuration courante.read_terragrunt_configse contente de lire les données — rien n’est fusionné. On accède aux valeurs via.locals,.inputs,.dependency, etc.
locals {
root_config = read_terragrunt_config(find_in_parent_folders("root.hcl"))
region_config = read_terragrunt_config(find_in_parent_folders("region.hcl"))
project = local.root_config.locals.project
aws_region = local.region_config.locals.aws_region
}
Variables d’environnement et plateforme#
Fonction |
Description |
|---|---|
|
Retourne la valeur d’une variable d’environnement. Erreur si absente. |
|
Retourne la valeur ou |
|
Retourne le système d’exploitation courant ( |
Git#
Fonction |
Description |
|---|---|
|
Chemin absolu de la racine du dépôt Git. |
|
Chemin relatif de la racine du dépôt vers le répertoire courant. |
|
Chemin relatif de la racine du dépôt vers le répertoire courant. |
terraform {
source = "${get_path_to_repo_root()}//modules/vpc"
}
AWS#
Fonction |
Description |
|---|---|
|
ID du compte AWS associé aux credentials courants. |
|
Alias du compte AWS. |
|
ARN de l’identité appelante (utilisateur ou rôle). |
|
ID de l’utilisateur appelant. |
remote_state {
backend = "s3"
config = {
bucket = "mycompany-${get_aws_account_id()}-state"
}
}
Commandes et exécution#
Fonction |
Description |
|---|---|
|
Exécute une commande shell et retourne sa sortie standard. Flags disponibles : |
|
Retourne la commande Terraform en cours ( |
|
Retourne la liste des arguments CLI passés à Terraform. |
locals {
git_commit = run_cmd("git", "rev-parse", "HEAD")
}
Commandes Terraform (pour extra_arguments)#
Fonction |
Description |
|---|---|
|
Liste des commandes qui nécessitent les variables. |
|
Commandes qui nécessitent l’input interactif. |
|
Commandes qui nécessitent le verrouillage d’état. |
|
Commandes qui nécessitent le paramètre de parallélisme. |
terraform {
extra_arguments "lock" {
commands = get_terraform_commands_that_need_locking()
arguments = ["-lock-timeout=20m"]
}
}
Utilitaires et manipulation de données#
Fonction |
Description |
|---|---|
|
Fusionne profondément plusieurs maps/objets. |
|
|
|
|
|
|
|
Compare deux timestamps (retourne |
|
Vérifie si une version semver satisfait une contrainte. |
|
Retourne la valeur du flag |
|
Retourne la liste des erreurs par défaut considérées comme réessayables. |
Suivi de fichiers (pour --filter-affected)#
Fonction |
Description |
|---|---|
|
Marque explicitement un fichier comme lu (affecte le calcul de |
|
Marque tous les fichiers correspondant à un motif glob. |
# S'assurer que les fichiers .tf sont considérés comme "lus"
mark_as_read("${get_terragrunt_dir()}/*.tf")
mark_glob_as_read("${get_terragrunt_dir()}/**")
Bonnes pratiques#
find_in_parent_folders+read_terragrunt_configest le duo le plus utilisé pour construire une hiérarchie de configuration DRY (racine → région → environnement → module).path_relative_to_includeest indispensable pour générer des clés d’état S3/EOS uniques par module sans hardcoder les chemins.run_cmddoit être utilisé avec parcimonie : chaque appel déclenche un processus shell, ce qui ralentit l’évaluation. Privilégierget_envou des fichiers de configuration statiques quand c’est possible.Toutes les fonctions sont utilisables dans les blocs
locals,inputs,remote_state,generate,terraform,includeetdependency.