Aller au contenu

GUIDE TECHNIQUE · TERRAFORM

Terraform CI/CD : GitHub Actions, plan et Go/NoGo

Mettre en place des contrôles Terraform dans GitHub Actions sans exposer de secrets sur les pull requests : formatage, initialisation sans backend, validation HCL, puis passage en plan et apply uniquement dans un circuit protégé avec revue et Go/NoGo.

Niveau Avancé7 min de lecture— vuesTerraform

L’ESSENTIEL EN BREF

Les étapes clés

Ce guide présente 6 étapes, de « Séparer les niveaux de confiance des workflows » à « Vérifier la livraison et préparer le retour arrière ».

Avant de commencer : Dépôt GitHub de recette avec code Terraform dans infra/ et une branche main protégée.

01 · CADRAGE

Périmètre et résultat visé

Résultat attendu : Une PR sans secrets déclenche fmt, init -backend=false et validate.

Public concerné : Ingénieurs DevOps, platform engineers, tech leads, responsables CI/CD et équipes de production

Environnement et versions

GitHub Actions, Terraform CLI compatible avec le code du dépôt et actions officielles checkout/setup-terraform ; adapter les références aux versions et SHA approuvés par l’organisation.

Contrôlez les versions, les droits et les options disponibles dans votre environnement avant de suivre la procédure.

02 · AVANT DE COMMENCER

Prérequis et points de contrôle

  • Dépôt GitHub de recette avec code Terraform dans infra/ et une branche main protégée.
  • Contrôles GitHub Actions autorisés et politique de permissions GITHUB_TOKEN définie.
  • Version Terraform et providers validée ; dépendances déclarées et .terraform.lock.hcl suivi dans Git.
  • Un backend et une identité cloud à privilèges limités prévus seulement pour les jobs de confiance, et un mécanisme d’approbation production.

03 · VUE D’ENSEMBLE

Comprendre l’architecture et les flux

ARCHITECTURE TECHNIQUEComprendre la chaîne de bout en bout
01Pull request
02fmt -check
03init -backend=false
04validate
05Revue humaine
06Plan protégé
07Go/NoGo
08Apply contrôlé
La CI non privilégiée effectue des contrôles statiques sans accès cloud ; les opérations plan/apply nécessitant backend ou providers sont réservées à des runners et branches de confiance. Une approbation ne remplace pas la revue du plan.

04 · TUTORIEL

Procédure complète, étape par étape

Suivez les étapes dans l’ordre et contrôlez chaque résultat avant de poursuivre. Renseignez les paramètres adaptés à votre environnement.

01

ÉTAPE 1 / 6

Séparer les niveaux de confiance des workflows

Une pull request, notamment issue d’un fork, exécute du code non fiable. Les secrets et les droits de déploiement doivent rester inaccessibles à ce contexte.

  1. Créer un dépôt de recette avec dossier infra/ et workflow de contrôle dédié.
  2. Définir permissions: contents: read pour la CI sur pull request.
  3. Réserver les identifiants cloud et le droit d’appliquer les changements à un workflow protégé distinct.
Exemple techniqueÀ adapter à votre environnement
# Schéma de gouvernance
# PR externe -> format / validation, aucun secret
# Branche protégée -> plan avec identité contrôlée
# Environnement approuvé -> apply après Go/NoGo
Ce qui se passe à cette étape
1Confiance minimale
2Contrôles PR
3Publication séparée

À vérifier : La PR ne reçoit aucun secret cloud et n’est pas autorisée à appliquer une modification.

Point de vigilance : Ne pas utiliser pull_request_target pour exécuter du code provenant d’une PR non fiable avec des secrets.

02

ÉTAPE 2 / 6

Créer un workflow de formatage et validation sans backend

fmt et validate donnent un premier niveau de qualité sans accorder d’accès aux comptes cloud.

  1. Créer .github/workflows/terraform-checks.yml en adaptant la version Terraform.
  2. Épingler les actions à un SHA de commit vérifié avant adoption en production : les tags major de cet exemple servent uniquement de point de départ.
  3. Utiliser -backend=false pour éviter l’accès au state distant pendant ces contrôles.
Exemple techniqueÀ adapter à votre environnement
# .github/workflows/terraform-checks.yml
name: Terraform checks
on:
  pull_request:
    paths:
      - "infra/**"
      - ".github/workflows/terraform-checks.yml"
permissions:
  contents: read
jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: "1.9.8"
      - run: terraform -chdir=infra fmt -check -recursive
      - run: terraform -chdir=infra init -backend=false -input=false
      - run: terraform -chdir=infra validate -no-color
Ce qui se passe à cette étape
1Checkout
2Fmt
3Validate

À vérifier : Le workflow déclenche les contrôles sur les PR modifiant infra/ sans utiliser de secret cloud.

Point de vigilance : Adaptez la version CLI à vos contraintes validées ; épinglez les actions par SHA revu avant tout usage sensible.

03

ÉTAPE 3 / 6

Vérifier que la CI bloque les erreurs réellement observées

Un badge vert ne suffit pas : il faut confirmer que les contrôles échouent lorsque le code est incohérent.

  1. Ouvrir une pull request de recette avec du Terraform valide et contrôler les logs.
  2. Créer ensuite une erreur de formatage puis une référence HCL invalide pour provoquer volontairement des échecs.
  3. Rendre le job validate obligatoire dans la protection de main seulement après l’avoir vu fonctionner.
Exemple techniqueÀ adapter à votre environnement
# Contrôles reproductibles en local :
terraform -chdir=infra fmt -check -recursive
terraform -chdir=infra init -backend=false -input=false
terraform -chdir=infra validate -no-color
Ce qui se passe à cette étape
1Tests négatifs
2Statuts CI
3Protection main

À vérifier : Les PR incorrectes restent non fusionnables jusqu’à correction des contrôles requis.

Point de vigilance : La validation statique n’évalue ni le coût cloud ni l’effet d’un changement sur une infrastructure active.

04

ÉTAPE 4 / 6

Préparer un plan de confiance après la revue

plan peut interroger des APIs cloud et accéder au state ; il doit s’exécuter sur une identité limitée, dans le bon environnement.

  1. Après revue, exécuter plan dans un workflow de branche protégée avec authentification éphémère OIDC si le provider le permet.
  2. Init utilise le backend distant sécurisé et le verrouillage ; les permissions du rôle couvrent uniquement le périmètre requis.
  3. Lire les créations, remplacements et suppressions avant de déclarer le plan acceptable.
Exemple techniqueÀ adapter à votre environnement
terraform -chdir=infra init -input=false
terraform -chdir=infra plan -input=false -out=plan.bin
# Ne jamais publier plan.bin sur une PR publique.
Ce qui se passe à cette étape
1OIDC / identité
2Backend
3Plan confidentiel

À vérifier : Un plan sur l’environnement cible est disponible uniquement pour les personnes autorisées à le consulter.

Point de vigilance : Un plan sauvegardé embarque configuration, valeurs et données de state potentiellement sensibles ; ne pas le rendre public.

05

ÉTAPE 5 / 6

Formaliser un Go/NoGo avant apply

La validation opérationnelle doit porter sur le contenu exact du plan et ses impacts, pas seulement sur la réussite de la CI.

  1. Identifier l’approbateur et les critères : risque, coûts, disponibilité, dépendances, rollback.
  2. Associer l’approbation à un commit et au plan contrôlé ; limiter les exécutions simultanées sur un state.
  3. Après approbation, appliquer le plan sauvegardé avec un exécuteur protégé et des providers identiques.
Exemple techniqueÀ adapter à votre environnement
# Commande à exécuter seulement après approbation
# depuis l'environnement sécurisé où le plan a été préparé :
terraform -chdir=infra apply -input=false plan.bin
Ce qui se passe à cette étape
1Revue du plan
2Go/NoGo
3Apply protégé

À vérifier : L’opération appliquée correspond au plan explicitement approuvé.

Point de vigilance : Si le state ou l’infrastructure a évolué depuis le plan, regénérer le plan et obtenir une nouvelle approbation.

06

ÉTAPE 6 / 6

Vérifier la livraison et préparer le retour arrière

La réussite technique d’apply n’assure ni disponibilité applicative ni réversibilité métier.

  1. Contrôler les outputs attendus, l’état d’exploitation et les dépendances après apply.
  2. Conserver les traces de validation, de revue et de déploiement dans un système à accès restreint.
  3. Préparer des changements correctifs par un nouveau plan ; ne pas considérer terraform destroy comme un rollback universel.
Exemple techniqueÀ adapter à votre environnement
terraform -chdir=infra output
terraform -chdir=infra plan -input=false
# Vérifications métiers et supervision à exécuter
# dans les outils du service concerné.
Ce qui se passe à cette étape
1Apply terminé
2Tests RUN
3Décision clôturée

À vérifier : Les changements sont vérifiés côté infrastructure et service, sans nouvelle dérive constatée.

Point de vigilance : Les changements de données, d’état ou de ressources externes ne sont pas automatiquement annulés par Terraform.

RÉFÉRENCES TECHNIQUES

Documentation officielle

Retrouvez les prérequis, les fonctionnalités et les versions prises en charge par Terraform. Vérifiez les commandes sur un environnement de test avant leur utilisation en production.

Consulter la documentation officielle

05 · RECETTE

Comment vérifier que tout fonctionne ?

Résultat attenduContrôles avant de considérer la procédure terminée
01

Une PR sans secrets déclenche fmt, init -backend=false et validate.

02

Les jobs Terraform ont permissions: contents: read en contexte non privilégié.

03

Le plan de production est exécuté sous une identité distincte à privilèges limités.

04

Un approbateur valide le contenu exact du plan et les critères Go/NoGo.

05

Les plans, états et journaux sensibles ne sont pas publiés comme artefacts publics.

06 · DIAGNOSTIC

Problèmes fréquents et résolution

CI fmt échoue

Cause probable : Mise en forme HCL non conforme

Que faire : Exécuter terraform fmt -recursive puis committer les changements.

init -backend=false échoue

Cause probable : Provider incompatible ou module non accessible

Que faire : Contrôler les versions et .terraform.lock.hcl sans autoriser des secrets à la PR.

Plan échoue en environnement protégé

Cause probable : IAM, backend, région ou variables absentes

Que faire : Examiner le rôle OIDC, les privilèges et la configuration de l’environnement.

Plan obsolète au moment d’apply

Cause probable : State modifié entre plan et apply

Que faire : Recalculer puis réapprouver le plan ; éviter toute application sur un state divergent.

07 · QUESTIONS PRATIQUES

Questions fréquentes

Pourquoi ne pas appliquer Terraform dans une pull request ?

Parce qu’une PR peut contenir du code non fiable et ne doit pas accéder aux droits de modification de l’infrastructure.

terraform validate suffit-il pour livrer ?

Non. Il vérifie la configuration HCL, pas les coûts, les accès cloud, les dépendances opérationnelles ni le risque de destruction.

Comment éviter les clés AWS dans GitHub ?

Préférer OIDC et un rôle IAM de confiance à durée courte, avec des conditions d’audience et de dépôt précises.

Peut-on appliquer automatiquement après fusion ?

Techniquement oui, mais pour les systèmes critiques une revue de plan et une approbation explicite restent recommandées.

AUTRES TECHNOLOGIES

Guides complémentaires

Tous les guides Terraform

VOTRE ENVIRONNEMENT

Besoin d’aller plus loin sur votre environnement ?

Infrastructure as Code, modules et gouvernance : échangeons sur la fiabilité et la sécurité de vos déploiements Terraform.

Échanger avec ADN Consulting

Pour aller plus loin