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

BesoinCommande
Importer une ressource existantebloc import {} puis plan
Renommer sans détruirebloc moved {}
Détecter la dériveterraform plan -refresh-only
Forcer un remplacementterraform 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).