Terraform testé et gouverné
Mettre sous contrôle les modules Terraform d'une plateforme IA Google Cloud : tests natifs avec providers simulés, tflint, checkov, politiques OPA sur le plan JSON (régions UE, labels, pas d'accès public), pre-commit, pipeline CI qui commente le plan, et détection de dérive exécutée sur une vraie infrastructure.

Six mois après la mise en place de la plateforme de Logi-Express, trois incidents tiennent sur une page. Un développeur a ajouté allUsers comme invoker « pour tester » et l'a oublié deux semaines. Une PR a créé un bucket en US parce que la variable de région avait un défaut différent dans un nouveau module. Et le label cost-center d'un bucket d'archive a été changé à la main par la finance : Terraform l'a remis en place sans prévenir au déploiement suivant, et le rapport de coûts du mois était faux. Chacun de ces trois incidents a passé une revue de code humaine.
Ce projet reprend les modules du projet précédent et les entoure d'une chaîne de contrôles automatiques, chacun à l'endroit où il coûte le moins : avant le commit, dans la PR, sur le plan, puis chaque matin sur l'infrastructure réelle.
Ce que vous livrez
- 17 tests natifs
terraform testsur 5 modules, providers simulés : sans clé, sans réseau, en une dizaine de secondes. - tflint (règles Terraform et Google) et checkov sur le code, exceptions justifiées dans le code.
- 11 règles OPA appliquées par conftest au plan JSON de dev et de prod : régions UE, 4 labels obligatoires, aucun accès public, pas d'IP publique, pas d'ingress Internet en prod ; 8 tests unitaires des règles.
- Un
pre-commitqui exécute les mêmes outils, aux mêmes versions. - Un pipeline GitHub Actions : vérifications, plan et politiques commentés sur la PR, détection de dérive planifiée qui ouvre un ticket.
- Une détection de dérive testée sur une vraie infrastructure : modification manuelle, détection (code 2), réconciliation.
Architecture
flowchart LR
DEV["Poste"] -- "git commit" --> PC["pre-commit<br/>fmt, validate, tflint,<br/>conftest verify, garde .tfstate"]
PC --> PR["Pull request"]
PR --> J1["Job verifier<br/>fmt, validate, test, lint, checkov"]
J1 --> J2["Job plan<br/>plan dev + prod → JSON"]
J2 --> POL["conftest + checkov<br/>sur le plan"]
POL --> CMT["Commentaire de PR<br/>plan + verdict"]
CRON["Planification<br/>chaque matin ouvré"] --> DR["drift.sh<br/>plan -detailed-exitcode"]
DR -- "code 2" --> TK["Ticket « dérive »"]
ST[("Bucket d'état GCS")] -.-> J2
ST -.-> DR
Stack, coût, durée
| Outil | Version | Rôle |
|---|---|---|
| Terraform | 1.16.0 | terraform test, mock_provider, expect_failures |
| tflint + ruleset google | 0.64.0 / 0.40.0 | conventions, variables inutilisées, valeurs Google invalides |
| checkov | 3.3.20 (dans .venv) | règles de sécurité sur le code et sur le plan |
| conftest (OPA) | 0.71.1 (binaire vérifié par SHA-256) | politiques de l'entreprise sur le plan JSON |
| pre-commit | 4.6.0 | mêmes contrôles avant chaque commit |
Coût mesuré : make test, lint et security sont locaux. make e2e crée et détruit le socle dev sans service Cloud Run, moins d'un centime par cycle. Durée : 5 h ; make ci s'exécute en 27 s.
Prérequis
- Le projet Une plateforme IA Google Cloud en modules Terraform, ou une pratique équivalente des modules, de l'état distant et des plans.
- Notions de CI (GitHub Actions ou équivalent).
- Sans projet Google Cloud :
make test,make lint,make securityet les tests des politiques fonctionnent ; les plans et la dérive demandent des identifiants.
Programme
| # | Leçon | Vous finissez avec |
|---|---|---|
| 1 | Tests natifs et providers simulés | make test : 17 tests verts sur 5 modules |
| 2 | Lint et analyse de sécurité | tflint et checkov à zéro échec, exceptions justifiées |
| 3 | Politiques as code sur le plan | un plan refusé par une règle OPA, testée |
| 4 | pre-commit et pipeline CI | make ci vert, le pipeline prêt à copier |
| 5 | Détecter la dérive | make e2e vert sur une vraie infrastructure, make cloud-down vérifié |
Le code complet est dans files/.
Ressources
Tout télécharger (.zip)Références
- Terraform : tests natifs (terraform test)developer.hashicorp.com
- Terraform : providers simulés dans les tests (mock_provider)developer.hashicorp.com
- Terraform : format JSON du plandeveloper.hashicorp.com
- Terraform : plan -detailed-exitcodedeveloper.hashicorp.com
- Conftestconftest.dev
- OPA : le langage Regoopenpolicyagent.org
- Checkov : ignorer une règle avec justificationcheckov.io
- Google Cloud : bonnes pratiques de test Terraformcloud.google.com