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.
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
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
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.
É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.
- Créer un dépôt de recette avec dossier infra/ et workflow de contrôle dédié.
- Définir permissions: contents: read pour la CI sur pull request.
- Réserver les identifiants cloud et le droit d’appliquer les changements à un workflow protégé distinct.
# 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À 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.
É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.
- Créer .github/workflows/terraform-checks.yml en adaptant la version Terraform.
- É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.
- Utiliser -backend=false pour éviter l’accès au state distant pendant ces contrôles.
# .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À 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.
É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.
- Ouvrir une pull request de recette avec du Terraform valide et contrôler les logs.
- Créer ensuite une erreur de formatage puis une référence HCL invalide pour provoquer volontairement des échecs.
- Rendre le job validate obligatoire dans la protection de main seulement après l’avoir vu fonctionner.
# 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À 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.
É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.
- 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.
- Init utilise le backend distant sécurisé et le verrouillage ; les permissions du rôle couvrent uniquement le périmètre requis.
- Lire les créations, remplacements et suppressions avant de déclarer le plan acceptable.
terraform -chdir=infra init -input=false
terraform -chdir=infra plan -input=false -out=plan.bin
# Ne jamais publier plan.bin sur une PR publique.À 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.
É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.
- Identifier l’approbateur et les critères : risque, coûts, disponibilité, dépendances, rollback.
- Associer l’approbation à un commit et au plan contrôlé ; limiter les exécutions simultanées sur un state.
- Après approbation, appliquer le plan sauvegardé avec un exécuteur protégé et des providers identiques.
# 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À 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.
É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.
- Contrôler les outputs attendus, l’état d’exploitation et les dépendances après apply.
- Conserver les traces de validation, de revue et de déploiement dans un système à accès restreint.
- Préparer des changements correctifs par un nouveau plan ; ne pas considérer terraform destroy comme un rollback universel.
terraform -chdir=infra output
terraform -chdir=infra plan -input=false
# Vérifications métiers et supervision à exécuter
# dans les outils du service concerné.À 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.
05 · RECETTE
Comment vérifier que tout fonctionne ?
Une PR sans secrets déclenche fmt, init -backend=false et validate.
Les jobs Terraform ont permissions: contents: read en contexte non privilégié.
Le plan de production est exécuté sous une identité distincte à privilèges limités.
Un approbateur valide le contenu exact du plan et les critères Go/NoGo.
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
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