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)¶
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
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).