Aller au contenu
English
English
Infrastructure as Code medium

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

8 min de lecture

logo terragrunt

Vous voulez intégrer 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 même logique a plusieurs environnements.

  • Comprendre quelles commandes Terragrunt sont adaptées a un pipeline
  • Lancer un run cible et non interactif
  • Maîtriser 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 dépendances, afin de vérifier qu'un pipeline cible bien une seule partie du repo avant d'elargir son périmètre.

  • 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 réflexe. Sur ce lab, le bon point d'entrée est live/dev. C'est ce choix qui borne déjà une partie du blast radius.

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

Dans cet exemple, la première commande exécutée est :

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

Le résultat 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 troisième principe : elargir seulement quand c'est voulu

Section intitulée « Le troisième principe : elargir seulement quand c'est voulu »

Une fois la cible validée, vous pouvez lancer une execution plus large :

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

Le résultat attendu est cette fois :

  • service-a/service-a.txt existe toujours ;
  • service-b/service-b.txt apparaît a son tour.

Autrement dit, vous passez d'un run a blast radius faible a un run a portée plus large, mais ce changement de périmètre reste volontaire et visible.

  1. Créer 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 apparaît 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' -- applyRéduire le blast radius
Tout l'environnement doit être rejoueterragrunt run --all --non-interactive applyAppliquer l'ensemble du scope courant
Nettoyage d'un environnement éphémèreterragrunt 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'entrée et de pipeline.

Dans un repo réel, vous pourriez par exemple avoir :

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

Le principe reste le même : vous rejouez la commande depuis l'environnement vise. Le mecanisme presente dans ce guide porte donc sur le contrôle du périmètre, pas sur un nom d'environnement particulier.

SymptômeCause 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'entrée dans le repoVérifier le dossier avant d'exécuter 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 déjà partie du contrôle.
  • --filter sert a réduire le blast radius.
  • Une promotion est une reexecution contrôlée depuis un autre environnement.
  • Un bon pipeline Terragrunt commence petit, puis elargit son périmètre seulement si nécessaire.

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