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

Terragrunt en CI/CD : cibler, limiter le blast radius, promouvoir

8 min de lecture

logo terragrunt

Vous voulez integrer Terragrunt dans votre pipeline CI/CD sans risquer d’appliquer tout le repo a chaque changement ? Le bon usage consiste a partir du bon dossier, a lancer des commandes non interactives, puis a cibler seulement les units utiles. Ce guide montre ce flux sur un exemple minimal avec deux units, puis explique comment transposer la meme logique a plusieurs environnements.

  • Comprendre quelles commandes Terragrunt sont adaptees a un pipeline
  • Lancer un run cible et non interactif
  • Maitriser le blast radius d’une execution CI/CD
  • Comprendre la logique de promotion par environnement

Le scenario le plus utile pour parler CI/CD est celui de deux units sans dependances, afin de verifier qu’un pipeline cible bien une seule partie du repo avant d’elargir son perimetre.

  • Répertoirelab-cicd/
    • Répertoiremodules/
      • Répertoirewrite-file/
        • main.tf
    • Répertoirelive/
      • Répertoiredev/
        • Répertoireservice-a/
        • Répertoireservice-b/
          • terragrunt.hcl

Placez le module commun 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/service-a/terragrunt.hcl :

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

Fichier live/dev/service-b/terragrunt.hcl :

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

Le pipeline ne doit pas partir du haut du repo par reflexe. Sur ce lab, le bon point d’entree est live/dev. C’est ce choix qui borne deja une partie du blast radius.

Un pipeline trop large commence souvent par une erreur simple : lancer Terragrunt depuis un dossier plus haut que necessaire.

Dans cet exemple, la premiere commande executee est :

Fenêtre de terminal
cd live/dev
terragrunt run --all --non-interactive --filter './service-a' -- apply

Le resultat attendu est observable :

  • service-a/service-a.txt existe ;
  • service-b/service-b.txt n’existe pas encore.

Cette etape est importante en CI/CD : elle prouve que le pipeline n’a touche que la partie du repo qu’il devait traiter.

Le troisieme principe : elargir seulement quand c’est voulu

Section intitulée « Le troisieme principe : elargir seulement quand c’est voulu »

Une fois la cible validee, vous pouvez lancer une execution plus large :

Fenêtre de terminal
cd live/dev
terragrunt run --all --non-interactive apply

Le resultat attendu est cette fois :

  • service-a/service-a.txt existe toujours ;
  • service-b/service-b.txt apparait a son tour.

Autrement dit, vous passez d’un run a blast radius faible a un run a portee plus large, mais ce changement de perimetre reste volontaire et visible.

  1. Creer le projet et se placer dans live/dev

    Verification : deux units service-a et service-b sont presentes.

  2. Lancer un apply cible et non interactif

    Fenêtre de terminal
    terragrunt run --all --non-interactive --filter './service-a' -- apply

    Verification : seul service-a/service-a.txt existe.

  3. Elargir ensuite a tout l’environnement

    Fenêtre de terminal
    terragrunt run --all --non-interactive apply

    Verification : service-b/service-b.txt apparait aussi.

  4. Nettoyer

    Fenêtre de terminal
    terragrunt run --all --non-interactive destroy

    Verification : les deux fichiers ont disparu.

CasCommande utilePourquoi
Un seul composant changeterragrunt run --all --non-interactive --filter './service-a' -- applyReduire le blast radius
Tout l’environnement doit etre rejoueterragrunt run --all --non-interactive applyAppliquer l’ensemble du scope courant
Nettoyage d’un environnement ephemereterragrunt run --all --non-interactive destroyNettoyer sans invites

Une promotion n’est pas une sous-commande speciale de Terragrunt. C’est un choix de dossier d’entree et de pipeline.

Dans un repo reel, vous pourriez par exemple avoir :

  • live/dev/...
  • live/staging/...
  • live/prod/...

Le principe reste le meme : vous rejouez la commande depuis l’environnement vise. Le mecanisme presente dans ce guide porte donc sur le controle du perimetre, pas sur un nom d’environnement particulier.

SymptomeCause probableSolution
Le pipeline attend une saisieOubli de --non-interactiveAjouter l’option sur les commandes non lues par un humain
Trop de units sont toucheesDossier courant trop haut ou absence de filtreRepartir du bon dossier puis cibler avec --filter
Le mauvais environnement est modifieMauvais point d’entree dans le repoVerifier le dossier avant d’executer Terragrunt
Un pipeline est trop lent et trop largeTout est lance a chaque changementCommencer par un run cible quand c’est possible
  • En CI/CD, --non-interactive est la base.
  • Le dossier depuis lequel vous lancez Terragrunt fait deja partie du controle.
  • --filter sert a reduire le blast radius.
  • Une promotion est une reexecution controlee depuis un autre environnement.
  • Un bon pipeline Terragrunt commence petit, puis elargit son perimetre seulement si necessaire.

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