Patterns et modules¶
DRY vs WET, modules réutilisables, workspaces, organisation du code IaC en monorepo ou multi-repo.
DRY vs WET¶
DRY (Don't Repeat Yourself) : factoriser ce qui se répété en modules réutilisables.
WET (Write Everything Twice, ou We Enjoy Typing) : accepter la duplication quand la factorisation nuit à la clarte ou au couplage.
Quand factoriser¶
- Le même pattern apparait dans trois contextes ou plus
- Le pattern va évoluer : le modifier a un seul endroit plutôt qu'en dix
- L'abstraction a du sens semantiquement (un module
vpc-standardreprésenté quelque chose de clair)
Quand accepter la duplication¶
- Deux ressources se ressemblent aujourd'hui mais divergeront probablement — les coupler creerait des contraintes inutiles
- La factorisation nécessité des abstractions si complexes qu'elles deviennent incomprehensibles
- L'équipe qui consomme le module est différente de l'équipe qui le maintient, avec des besoins qui evoluent independamment
Module a une seule équipe
Un module maintenu par une équipe et consomme uniquement par cette équipe est plus facile à refactoriser. Quand un module est consomme par dix équipes, chaque changement devient un projet de coordination. Versionnez et deprecatez explicitement.
Modules réutilisables¶
Design d'un bon module¶
Un bon module Terraform ou rôle Ansible à les caractéristiques suivantes :
- Interface claire : les variables d'entree sont documentees, typees et ont des valeurs par défaut sensibles
- Périmètre limite : un module fait une chose bien plutôt que tout faire
- Pas d'opinions cachees : les comportements par défaut sont explicites et surchargeable
- Testable independamment : on peut l'utiliser en isolation sans dépendances implicites
Versioning¶
graph LR
A["Module v1.0"] --> B["Module v1.1<br/>(ajout feature)"]
B --> C["Module v2.0<br/>(breaking change)"]
D["Consommateur A"] -->|"~> 1.0"| B
E["Consommateur B"] -->|"= 1.0"| A
F["Consommateur C"] -->|"~> 2.0"| C Utilisez le versioning semantique (semver) pour vos modules. Un breaking change dans l'interface (suppression d'une variable, changement de comportement) implique un bump de version majeure.
Registry¶
Les modules peuvent être publies sur :
- Terraform Registry public : pour les modules open source
- Terraform Registry prive (Terraform Cloud/Enterprise) : pour les modules internes
- Git avec tags : la solution la plus simple pour commencer
Workspaces et environnements¶
Les workspaces Terraform permettent de gérer plusieurs states indépendants depuis le même code.
Workspaces vs répertoires distincts¶
| Critère | Workspaces | Répertoires distincts |
|---|---|---|
| Isolation du state | Partielle (même backend) | Complète |
| Partage de code | Natif | Via modules |
| Différences entre envs | Via variables workspace | Fichiers tfvars par env |
| Risque d'appliquer au mauvais env | Élevé | Faible |
| Lisibilite | Moins claire | Plus explicite |
Pour la plupart des équipes, des répertoires distincts par environnement sont plus surs et plus lisibles que les workspaces. Les workspaces conviennent aux environnements éphémères (preview, feature branches).
Monorepo vs multi-repo¶
Structure d'un repo IaC typique¶
graph TD
R["infra/"] --> M["modules/"]
R --> E["environments/"]
M --> M1["vpc/"]
M --> M2["eks/"]
M --> M3["rds/"]
E --> ENV1["dev/"]
E --> ENV2["staging/"]
E --> ENV3["prod/"]
ENV1 --> T1["main.tf"]
ENV1 --> T2["variables.tf"]
ENV1 --> T3["terraform.tfvars"] Critères de choix¶
| Critère | Monorepo | Multi-repo |
|---|---|---|
| Visibilité | Tout visible au même endroit | Fragmentee entre repos |
| Changements cross-composants | Atomiques dans un commit | Necessitent des PRs coordonnées |
| Accès et permissions | Complexe a granulariser | Par repo, plus simple |
| CI/CD | A optimiser (run only changed) | Par repo, plus simple |
| Équipes indépendantes | Conflits et couplage | Autonomie par équipe |
Recommendation pratique¶
Commencez avec un monorepo infra/ dans votre repo applicatif ou un repo dédié. Passez en multi-repo quand des équipes indépendantes ont besoin d'autonomie et que le monorepo devient un goulot d'étranglement.
Outils¶
| Outil | Description | Lien |
|---|---|---|
| Terragrunt | Wrapper DRY pour Terraform — géré les dépendances entre modules et les configs multi-env | terragrunt.gruntwork.io |
| Atlantis | Automation des PR Terraform : plan sur PR, apply sur merge | runatlantis.io |
| terraform-docs | Génération automatique de documentation pour les modules | terraform-docs.io |
| pre-commit | Hooks pre-commit pour tflint, Checkov, terraform-docs | pre-commit.com |