GUIDE TECHNIQUE · TERRAFORM
Terraform State : sécuriser S3 et le verrouillage
Mettre sous contrôle le Terraform State d’une équipe : comprendre le backend S3, activer la conservation des versions, le chiffrement, les permissions IAM et le verrouillage natif use_lockfile avant toute migration de state.
L’ESSENTIEL EN BREF
Les étapes clés
Ce guide présente 6 étapes, de « Inventorier les states et les exécutions concurrentes » à « Documenter la restauration et la réponse aux incidents ».
Avant de commencer : Compte AWS de recette autorisé et bucket de state préalablement créé par une procédure d’administration.
01 · CADRAGE
Périmètre et résultat visé
Résultat attendu : Bucket S3 privé, chiffré, versionné et contrôlé par IAM.
Public concerné : Ingénieurs cloud AWS, équipes plateformes, DevOps confirmés, responsables RUN et sécurité infrastructure
Terraform récent avec backend S3 prenant en charge use_lockfile. S3 et IAM AWS ; les exemples utilisent la région eu-west-3 uniquement si le bucket y est effectivement situé.
Contrôlez les versions, les droits et les options disponibles dans votre environnement avant de suivre la procédure.
02 · AVANT DE COMMENCER
Prérequis et points de contrôle
- Compte AWS de recette autorisé et bucket de state préalablement créé par une procédure d’administration.
- Versioning S3, chiffrement et règles d’accès au bucket validés avec l’équipe sécurité.
- Rôle ou identité IAM à privilèges limités et méthode d’authentification sans clés statiques dans le code.
- Un state non productif ou un laboratoire pour vérifier init et le verrouillage, avec fenêtre de changement si migration.
03 · VUE D’ENSEMBLE
Comprendre l’architecture et les flux
04 · TUTORIEL
Procédure complète, étape par étape
Suivez les étapes dans l’ordre et contrôlez chaque résultat avant de poursuivre. Renseignez les paramètres adaptés à votre environnement.
ÉTAPE 1 / 6
Inventorier les states et les exécutions concurrentes
Une migration sans cartographie expose à un écrasement d’état ou à l’utilisation de deux sources de vérité.
- Identifier les projets, environnements, pipelines, comptes AWS et responsables du state.
- Déterminer s’il existe déjà un backend distant et vérifier son mode de verrouillage.
- Suspendre les écritures concurrentes pour toute opération de migration planifiée.
terraform version
terraform workspace show
terraform state listÀ vérifier : La liste des environnements et des ressources suivies est connue avant modification.
Point de vigilance : terraform state list peut exposer des noms de ressources ; ne publier aucune sortie issue d’un environnement client.
ÉTAPE 2 / 6
Préparer un bucket de state sécurisé et restaurable
Un backend distant n’est pas automatiquement sécurisé : la conservation des versions et les permissions doivent être établies avant usage.
- Faire créer un bucket dédié au state, avec block public access, chiffrement au repos et versioning.
- Tester l’accès via un rôle IAM ; restreindre bucket, préfixe et fichiers .tflock nécessaires.
- Contrôler les règles d’audit, de rétention et les opérations de restauration S3 versioning.
aws s3api get-bucket-versioning --bucket NOM_DU_BUCKET
aws s3api get-public-access-block --bucket NOM_DU_BUCKET
aws s3api get-bucket-encryption --bucket NOM_DU_BUCKETÀ vérifier : Versioning, accès privé et chiffrement sont confirmés pour le bucket de recette.
Point de vigilance : Le versioning protège contre certaines erreurs de manipulation, pas contre la suppression malveillante ou l’absence de sauvegarde gouvernée.
ÉTAPE 3 / 6
Déclarer le backend S3 et son verrouillage natif
Le paramètre use_lockfile est la méthode native S3 recommandée ; le verrouillage fondé sur DynamoDB est déprécié dans la documentation actuelle.
- Renseigner bucket, key, région réelle du bucket et use_lockfile=true.
- Éviter toute clé AWS, secret, token ou mot de passe directement dans les fichiers .tf ou options -backend-config.
- Différencier les fichiers d’état par environnement et vérifier que les permissions couvrent aussi la clé .tflock.
# backend.tf (exemple de structure à adapter)
terraform {
backend "s3" {
bucket = "NOM_DU_BUCKET"
key = "plateforme/recette/terraform.tfstate"
region = "eu-west-3"
encrypt = true
use_lockfile = true
}
}À vérifier : Le backend référence un emplacement unique et active le verrouillage par fichier.
Point de vigilance : Le bucket doit déjà exister ; terraform init ne crée pas automatiquement son propre backend S3.
ÉTAPE 4 / 6
Initialiser le backend sans migration accidentelle
La première initialisation et le déplacement d’un state existant sont deux opérations différentes qui ne doivent pas être confondues.
- Sur un laboratoire neuf sans state à migrer, exécuter terraform init avec les identifiants IAM du rôle autorisé.
- Si un state local existe, le sauvegarder de façon sécurisée et organiser une migration encadrée avec terraform init -migrate-state ; examiner les demandes de confirmation.
- Vérifier l’emplacement réellement configuré ; ne pas utiliser -reconfigure pour masquer un écart de state sans investigation.
# Laboratoire neuf, après contrôle du backend :
terraform init
terraform validate
terraform planÀ vérifier : Le backend S3 est initialisé et le plan est calculé dans l’environnement attendu.
Point de vigilance : Un plan sauvé (.tfplan) ou une copie de state peut contenir des secrets : traitement confidentiel obligatoire.
ÉTAPE 5 / 6
Tester les autorisations et le verrouillage
Le vrai critère est d’empêcher les écritures concurrentes tout en autorisant les opérations normales d’un runner légitime.
- Vérifier que le rôle de travail possède les droits nécessaires sur le state et sur .tflock, sans accès à tous les buckets.
- Dans un laboratoire, organiser un test d’exécution simultanée contrôlé et vérifier qu’une seconde écriture attend ou échoue proprement.
- Observer l’objet de verrouillage pendant l’opération et vérifier sa disparition après la fin du processus.
# Exemple de vérification non destructive du state suivi :
terraform state list
# Tester les accès et le lock sous supervision,
# sans exécuter deux apply concurrents en production.À vérifier : Le processus de verrouillage évite deux mises à jour simultanées du même state.
Point de vigilance : Ne jamais contourner un verrou avec -lock=false ou terraform force-unlock par réflexe.
ÉTAPE 6 / 6
Documenter la restauration et la réponse aux incidents
La réversibilité exige de savoir retrouver une version saine et les acteurs habilités avant une panne.
- Documenter le préfixe de state, les propriétaires, la rétention et les sauvegardes.
- Tester en recette l’identification d’une ancienne version S3 sans la restaurer dans un state actif de production.
- Prévoir un plan de récupération validé par un pair avant toute modification manuelle de state.
aws s3api list-object-versions \
--bucket NOM_DU_BUCKET \
--prefix plateforme/recette/terraform.tfstateÀ vérifier : Les versions disponibles sont identifiées et la procédure de restauration est explicitement gouvernée.
Point de vigilance : Ne jamais réécrire un state de production depuis une sauvegarde sans analyse de l’infrastructure réelle et validation.
RÉFÉRENCES TECHNIQUES
Documentation officielle
Retrouvez les prérequis, les fonctionnalités et les versions prises en charge par Terraform. Vérifiez les commandes sur un environnement de test avant leur utilisation en production.
05 · RECETTE
Comment vérifier que tout fonctionne ?
Bucket S3 privé, chiffré, versionné et contrôlé par IAM.
use_lockfile=true et permissions sur la clé .tflock sont en place.
Le backend pointe vers le bon compte, bucket, préfixe et environnement.
Une exécution concurrente ne peut pas écrire simultanément le même state.
Une procédure de restauration existe et n’expose aucun secret dans Git ou dans les logs.
06 · DIAGNOSTIC
Problèmes fréquents et résolution
AccessDenied durant init
Cause probable : Permissions IAM manquantes ou mauvaise identité active
Que faire : Vérifier l’identité du runner, le bucket, la clé et les droits sur .tflock.
Error acquiring the state lock
Cause probable : Une exécution concurrente détient le verrou ou un incident a laissé un verrou
Que faire : Identifier le processus propriétaire et documenter la décision avant tout déverrouillage.
State introuvable
Cause probable : Mauvais bucket, key, région ou workspace
Que faire : Comparer les paramètres à la cartographie et vérifier les versions S3 existantes.
Migration inattendue
Cause probable : Backend précédemment local ou différent
Que faire : Stopper et sauvegarder le state avant toute confirmation de migration.
07 · QUESTIONS PRATIQUES
Questions fréquentes
Pourquoi versionner le bucket S3 ?
Pour disposer de versions antérieures en cas de corruption ou suppression accidentelle, avec une procédure contrôlée de récupération.
DynamoDB est-il indispensable au verrouillage ?
Non. Le backend S3 récent prend en charge use_lockfile ; le verrouillage DynamoDB est déprécié.
Un state marqué sensible est-il chiffré dans Git ?
Non. sensitive masque certains affichages mais ne remplace pas la protection du state et des sauvegardes.
Peut-on partager un même state entre tous les environnements ?
Il est généralement préférable d’isoler les environnements et les droits pour réduire l’impact d’une erreur.
AUTRES TECHNOLOGIES
Guides complémentaires
VOTRE ENVIRONNEMENT
Besoin d’aller plus loin sur votre environnement ?
Infrastructure as Code, modules et gouvernance : échangeons sur la fiabilité et la sécurité de vos déploiements Terraform.
Échanger avec ADN Consulting