Aller au contenu

State management

Backend remote, locking et recovery pour gérer l'état de l'infrastructure en équipe.


Qu'est-ce que le state

Le state (terraform.tfstate) est un fichier JSON qui mappe les resources declarees en HCL aux objets réels dans le cloud. OpenTofu l'utilisé pour déterminer quoi créer, modifier ou supprimer.

Ne jamais éditer manuellement

Le fichier state ne doit jamais être modifie à la main. Utilisez les commandes tofu state pour les manipulations.

Backend local vs remote

Aspect Local Remote
Stockage Fichier local terraform.tfstate Cloud (GCS, S3, Azure Blob)
Collaboration Impossible (un seul opérateur) Multi-utilisateurs
Locking Non Oui (empêche les modifications concurrentes)
Historique Non Versionning du bucket

Backend GCS (Google Cloud Storage)

terraform {
  backend "gcs" {
    bucket = "my-project-tfstate"
    prefix = "env/prod"
  }
}

Créer le bucket au préalable :

gcloud storage buckets create gs://my-project-tfstate \
  --location=europe-west1 \
  --uniform-bucket-level-access

Backend S3 (AWS)

terraform {
  backend "s3" {
    bucket         = "my-project-tfstate"
    key            = "env/prod/terraform.tfstate"
    region         = "eu-west-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

Locking

Le locking empêche deux tofu apply simultanés de corrompre le state.

  • GCS : locking natif via le bucket
  • S3 : locking via une table DynamoDB
# Forcer le deverrouillage (en cas de crash)
tofu force-unlock <LOCK_ID>

force-unlock

N'utilisez force-unlock que si vous etes certain qu'aucun autre processus n'utilise le state. Un deverrouillage premature peut corrompre l'état.

Commandes state

# Lister les resources dans le state
tofu state list

# Afficher les details d'une resource
tofu state show google_compute_instance.webserver

# Supprimer une resource du state (sans la detruire)
tofu state rm google_compute_instance.webserver

# Deplacer une resource (renommage)
tofu state mv google_compute_instance.old google_compute_instance.new

# Importer une resource existante dans le state
tofu import google_compute_instance.webserver projects/my-project/zones/europe-west1-b/instances/webserver-01

Recovery

State corrompu

# Lister les versions du state (backend GCS)
gcloud storage ls gs://my-project-tfstate/env/prod/ --all-versions

# Restaurer une version anterieure
gcloud storage cp gs://my-project-tfstate/env/prod/default.tfstate#<generation> terraform.tfstate
tofu state push terraform.tfstate

Drift détection

# Comparer le state avec la realite
tofu plan -refresh-only

# Mettre a jour le state sans modifier l'infrastructure
tofu apply -refresh-only

Bonnes pratiques

Un state par environnement

Utilisez des préfixes ou des workspaces différents pour chaque environnement (dev, staging, prod). Ne partagez jamais un state entre environnements.

Versionning du bucket

Activez le versionning sur le bucket de state pour pouvoir restaurer une version antérieure en cas de problème.

Chiffrement

Activez le chiffrement côté serveur sur le bucket de state. Le fichier contient des informations sensibles (IPs, identifiants de resources).