Provisioning¶
Provisionner des ressources avec Terraform et OpenTofu — state, modules, plan/apply et alternatives.
Concepts fondamentaux Terraform/OpenTofu¶
Terraform est un outil IaC declaratif qui interagit avec des APIs cloud via des providers. OpenTofu en est le fork open source, compatible a 100%.
Les quatre objets principaux¶
Providers — plugins qui parlent a une API (AWS, Azure, GCP, Kubernetes, GitHub…). Chaque provider expose des ressources et des data sources.
Resources — unites d'infrastructure a provisionner : une VM, un bucket, un groupe de sécurité, un enregistrement DNS.
Data sources — lecture seule de ressources existantes sans les créer ni les gérer.
Variables et outputs — parametrisation des modules et exposition de valeurs pour les modules consommateurs.
Le cycle plan/apply¶
graph LR
A["terraform init<br/>(telecharge providers)"] --> B["terraform plan<br/>(calcule les changements)"]
B --> C["terraform apply<br/>(applique sur l'API)"]
C --> D["State mis a jour"]
D --> B
B --> E["terraform destroy<br/>(supprime les ressources)"] - init : téléchargé les providers et modules declares, initialise le backend de state
- plan : compare l'état desire (fichiers .tf) avec l'état connu (state) et propose un diff
- apply : exécuté le plan — créé, modifie ou détruit les ressources
- destroy : supprimé toutes les ressources gérées — opération destructive, a protéger en CI
Toujours relire le plan avant d'appliquer
Un terraform apply sans relire le plan peut détruire des ressources critiques. En CI, generez et sauvegardez le plan comme artefact, puis appliquez-le explicitement avec terraform apply plan.tfplan.
Gestion du state¶
Le state est le fichier (ou la base de données) dans lequel Terraform stocke la correspondance entre les ressources declarees et les ressources réelles sur l'API cloud.
State local vs remote¶
| Critère | State local (terraform.tfstate) | State remote (S3, GCS, Terraform Cloud…) |
|---|---|---|
| Collaboration | Impossible — chacun a son propre state | Partage entre tous les membres de l'équipe |
| Locking | Aucun — risque de corruption | Verrou lors de chaque apply |
| Sécurité | Fichier en clair sur le poste | Accès contrôle, chiffrement possible |
| CI/CD | Complexe | Natif |
State local en équipe = recette pour le desastre
Deux personnes qui font un apply simultane avec un state local peuvent corrompre l'infrastructure. Le state remote avec locking (DynamoDB pour S3, native pour Terraform Cloud) est obligatoire des le deuxieme contributeur.
Import¶
terraform import permet d'intégrer dans le state une ressource existante créée hors de Terraform (ClickOps legacy). Depuis Terraform 1.5, le bloc import dans le code permet de le faire de manière declarative et reproductible.
Modules¶
Un module Terraform est un répertoire contenant des fichiers .tf. Il reçoit des inputs via des variables et expose des outputs. Les modules permettent de factoriser et de réutiliser des patterns d'infrastructure.
Structure d'un module¶
Versioning des modules¶
Les modules peuvent être versionnes et publies sur le Terraform Registry (public ou prive). On les consomme avec une contrainte de version :
Un module, un usage
Un module trop générique devient ingeerable. Concevez vos modules autour d'un pattern métier clair : vm-web-tier, rds-postgres, vpc-standard. Un module doit résoudre un problème précis.
Alternatives¶
| Outil | Approche | Avantage principal | Inconvénient |
|---|---|---|---|
| Terraform / OpenTofu | Declaratif, HCL | Écosystème, maturité, multi-cloud | HCL limitant pour la logique complexe |
| Pulumi | Declaratif, langages généraux (Python, Go, TS) | Logique métier native, tests unitaires | Courbe d'apprentissage, moins de modules |
| CloudFormation | Declaratif, YAML/JSON | Natif AWS, integrations profondes | AWS uniquement, verbeux |
| Crossplane | Declaratif, Kubernetes CRDs | Unifie IaC et Kubernetes | Complexité opérationnelle élevée |
| CDK / Bicep | Imperatif/declaratif | Natif AWS ou Azure | Scope limite au cloud provider |
Outils¶
| Outil | Description | Lien |
|---|---|---|
| Terraform | IaC declaratif — référence du marche | terraform.io |
| OpenTofu | Fork open source post-licence BSL | opentofu.org |
| Terragrunt | Wrapper Terraform pour DRY et multi-environnements | terragrunt.gruntwork.io |
| Terraform Cloud | Backend state + CI/CD intégré par HashiCorp | app.terraform.io |
| Infracost | Estimation des coûts avant apply | infracost.io |