Passer au contenu principal

Production (Terraform)

Remote backend et collaboration

En solo sur un seul poste, le state local fonctionne. Dès qu'une équipe ou un pipeline CI intervient sur la même infrastructure, le state local devient une source de conflits et de pertes de données. Le backend distant résout ce problème avec le stockage partagé et le verrouillage.

Backend S3 + DynamoDB (AWS)

La combinaison la plus répandue : S3 stocke le state, DynamoDB assure le verrouillage.

# backend.tf
terraform {
  backend "s3" {
    bucket         = "mon-bucket-tfstate"
    key            = "prod/myapp/terraform.tfstate"
    region         = "eu-west-1"
    encrypt        = true
    dynamodb_table = "terraform-locks"   # pour le state locking
  }
}
# Créer les ressources de bootstrap (une seule fois, manuellement ou avec un projet dédié)
aws s3api create-bucket --bucket mon-bucket-tfstate --region eu-west-1   --create-bucket-configuration LocationConstraint=eu-west-1
aws s3api put-bucket-versioning --bucket mon-bucket-tfstate   --versioning-configuration Status=Enabled
aws s3api put-bucket-encryption --bucket mon-bucket-tfstate   --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'

aws dynamodb create-table   --table-name terraform-locks   --attribute-definitions AttributeName=LockID,AttributeType=S   --key-schema AttributeName=LockID,KeyType=HASH   --billing-mode PAY_PER_REQUEST

Backend GCS (Google Cloud)

terraform {
  backend "gcs" {
    bucket = "mon-bucket-tfstate"
    prefix = "prod/myapp"
  }
}

State locking

Quand Terraform démarre un plan ou un apply, il pose un verrou sur le state. Si un autre processus tente de modifier le même state simultanément, il est bloqué jusqu'à la libération du verrou. Cela évite les corruptions de state en cas de runs simultanés.

# Si un run précédent s'est interrompu, le verrou peut rester bloqué
terraform force-unlock LOCK_ID

Migration de backend local vers distant

# 1. Ajouter le bloc backend dans le code
# 2. Réinitialiser Terraform — il proposera de migrer le state existant
terraform init
# Répondre "yes" à la question de migration

Terraform Cloud comme backend

terraform {
  cloud {
    organization = "mon-org"

    workspaces {
      name = "prod-myapp"
    }
  }
}

Terraform Cloud offre state management, locking, history, et exécution des plans dans le cloud. La version gratuite supporte jusqu'à 5 utilisateurs. Alternative open-source : Atlantis (couvert dans la section Expertise).

Partager le state entre projets

# Lire les outputs d'un autre projet Terraform
data "terraform_remote_state" "network" {
  backend = "s3"

  config = {
    bucket = "mon-bucket-tfstate"
    key    = "prod/network/terraform.tfstate"
    region = "eu-west-1"
  }
}

resource "aws_instance" "app" {
  subnet_id = data.terraform_remote_state.network.outputs.private_subnet_ids[0]
}

Le remote state data source est pratique mais crée un couplage fort entre projets. Pour les nouvelles architectures, préférer passer les valeurs par des paramètres SSM, des tags, ou des outputs de module.