Tutoriel3 min de lecture · Mis à jour le 29 sept. 2026
Terraform — workflow d'équipe et gestion de l'état
Organiser un dépôt Terraform, stocker l'état à distance avec verrouillage, structurer les modules et intégrer plan/apply dans la CI.
- #infrastructure-as-code
- #automation
- #aws
Workflow
terraform init # télécharge providers et modules, configure le backend
terraform fmt -recursive && terraform validate
terraform plan -out plan.tfplan
terraform apply plan.tfplan
Appliquez le plan relu, jamais un apply direct en production.
État distant et verrouillage
terraform {
required_version = ">= 1.7"
backend "s3" {
bucket = "acme-tfstate"
key = "network/prod/terraform.tfstate"
region = "eu-west-3"
dynamodb_table = "tfstate-locks"
encrypt = true
}
}
L'état contient des secrets en clair : bucket privé, chiffré, versionné, accès restreint.
Structure recommandée
modules/
vpc/ (variables.tf, main.tf, outputs.tf)
envs/
dev/main.tf → module "vpc" { source = "../../modules/vpc" cidr = "10.10.0.0/16" }
prod/main.tf
- Un état par environnement et par couche (réseau, données, applicatif) : rayon d'impact réduit.
- Versions de providers et de modules épinglées.
Module VPC minimal
resource "aws_vpc" "this" {
cidr_block = var.cidr
enable_dns_hostnames = true
tags = { Name = var.name }
}
resource "aws_subnet" "private" {
for_each = toset(var.azs)
vpc_id = aws_vpc.this.id
availability_zone = each.value
cidr_block = cidrsubnet(var.cidr, 4, index(var.azs, each.value))
}
Opérations délicates
| Besoin | Commande |
|---|---|
| Importer une ressource existante | bloc import {} puis plan |
| Renommer sans détruire | bloc moved {} |
| Détecter la dérive | terraform plan -refresh-only |
| Forcer un remplacement | terraform apply -replace=aws_instance.web |
Dans la CI
Plan sur chaque merge request (commentaire du diff), apply manuel approuvé sur main, analyse statique (tflint, checkov/trivy config).