
AWS Budget : Ne laissez plus votre facture cloud vous surprendre !
Vous avez déjà reçu une facture AWS qui vous a fait froid dans le dos ? Vous n’êtes pas seul. La facturation cloud …
Terraform 1.11 rend obsolète l’utilisation de DynamoDB pour le verrouillage de state S3. Grâce aux écritures conditionnelles S3 (août 2024), le paramètre use_lockfile = true
remplace dynamodb_table
.
Résultat : infrastructure simplifiée, coûts réduits, migration en quelques minutes. Le verrouillage DynamoDB est déprécié et sera supprimé dans une future version mineure.
La gestion du verrouillage de state Terraform sur S3 nécessitait une table DynamoDB dédiée.
Cette époque est révolue ! Terraform 1.11 introduit le verrouillage natif S3, simplifiant drastiquement votre infrastructure backend.
Historiquement, S3 utilisait une cohérence éventuelle (eventual consistency) pour les lectures après écriture, ce qui rendait impossible la gestion fiable du verrouillage directement dans S3. DynamoDB était donc indispensable pour garantir la cohérence forte nécessaire au verrouillage.
Info
Point historique : En décembre 2020, AWS a annoncé que S3 supportait désormais la cohérence forte (strong read-after-write consistency), ouvrant la voie à l’élimination de DynamoDB pour le verrouillage.
AWS a annoncé en août 2024 le support des écritures conditionnelles dans Amazon S3, permettant de vérifier l’existence d’un objet avant de le créer. Cette fonctionnalité utilise le header HTTP if-none-match
avec les requêtes PutObject
et CompleteMultipartUpload
.
Terraform 1.10 a introduit le support expérimental du verrouillage natif S3 avec le paramètre use_lockfile. À ce stade, la fonctionnalité était utilisable mais marquée comme expérimentale.
Terraform 1.11 a rendu le verrouillage natif S3 généralement disponible (GA) et a officiellement déprécié les arguments liés à DynamoDB. C’est la version recommandée pour la migration.
Warning
Deprecation importante : Le verrouillage basé sur DynamoDB est maintenant déprécié et sera supprimé dans une future version mineure de Terraform.
Les écritures conditionnelles S3 permettent aux clients d’écrire des objets de manière conditionnelle, en s’assurant de ne pas écraser des objets déjà écrits par un autre client. Plus besoin de construire des mécanismes de consensus côté client ou d’effectuer des requêtes API supplémentaires pour vérifier la présence d’un objet.
Lorsque vous activez use_lockfile = true
, Terraform crée un fichier de verrouillage dans S3 avec l’extension .tflock
. Par exemple, si votre state file est terraform.tfstate
, le fichier de verrouillage sera terraform.tfstate.tflock
.
Lorsqu’un lock est actif, toute tentative d’écriture par un autre client retourne une erreur 412 Precondition Failed. Terraform gère automatiquement cette erreur et informe l’utilisateur qu’un verrouillage est en place.
Error: Error acquiring the state lock
Error message: operation error S3: PutObject, https response error
StatusCode: 412, api error PreconditionFailed: At least one of the
pre-conditions you specified did not hold
Lock Info:
ID: 837482e8-441e-9ff6-d30b-333ee83d8fc4
Path: my-bucket/terraform.tfstate
Operation: OperationTypeApply
Who: user@hostname
Version: 1.11.0
Votre configuration actuelle ressemble probablement à ceci :
terraform {
required_version = ">= 1.0"
backend "s3" {
bucket = "mon-bucket-terraform-state"
key = "production/terraform.tfstate"
region = "eu-west-1"
# Table DynamoDB pour le verrouillage (ancien système)
dynamodb_table = "terraform-state-lock"
encrypt = true
}
}
Avec Terraform 1.11 ou supérieur, le verrouillage natif S3 est GA. Remplacez simplement dynamodb_table
par use_lockfile
:
terraform {
required_version = ">= 1.11.0"
backend "s3" {
bucket = "mon-bucket-terraform-state"
key = "production/terraform.tfstate"
region = "eu-west-1"
# Nouveau : verrouillage natif S3
use_lockfile = true
encrypt = true
}
}
Si vous utilisez Terraform 1.10, la fonctionnalité est disponible mais expérimentale :
terraform {
required_version = "~> 1.10.0"
backend "s3" {
bucket = "mon-bucket-terraform-state"
key = "production/terraform.tfstate"
region = "eu-west-1"
# Verrouillage natif S3 (expérimental en 1.10)
use_lockfile = true
encrypt = true
}
}
Warning
Pour les environnements de production, il est fortement recommandé d’attendre Terraform 1.11+ où la fonctionnalité est stable.
Pour une migration en douceur, vous pouvez temporairement utiliser les deux systèmes :
terraform {
required_version = ">= 1.11.0"
backend "s3" {
bucket = "mon-bucket-terraform-state"
key = "production/terraform.tfstate"
region = "eu-west-1"
# Les deux systèmes actifs pendant la migration
dynamodb_table = "terraform-state-lock"
use_lockfile = true
encrypt = true
}
}
Lorsque les deux mécanismes sont configurés, Terraform acquiert les verrous des deux sources. Une fois que vous êtes confiant, retirez simplement la ligne dynamodb_table
.
Le verrouillage natif S3 nécessite des permissions IAM légèrement différentes.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::mon-bucket-terraform-state"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::mon-bucket-terraform-state/production/terraform.tfstate"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::mon-bucket-terraform-state/production/terraform.tfstate.tflock"
}
]
}
Points importants :
s3:DeleteObject
est requis sur le fichier .tflock
pour libérer le verroudynamodb:GetItem
, dynamodb:PutItem
, dynamodb:DeleteItem
)Après avoir modifié votre configuration, réinitialisez le backend :
terraform init -reconfigure
Tip
L’option -reconfigure
indique à Terraform de reconfigurer le backend sans migration de state. Votre state existant reste intact.
Effectuez un test de verrouillage :
# Terminal 1
terraform plan
# Terminal 2 (pendant que le plan tourne)
terraform plan
# Vous devriez voir l'erreur de verrouillage 412
Une fois la migration confirmée et stable, vous pouvez supprimer votre table DynamoDB :
aws dynamodb delete-table \
--table-name terraform-state-lock \
--region eu-west-1
Warning
Attention : Assurez-vous que TOUS vos projets Terraform ont migré avant de supprimer la table DynamoDB !
Plus besoin de gérer une ressource DynamoDB supplémentaire :
Élimination des charges de lecture/écriture DynamoDB, conduisant à des économies potentielles sur votre facture AWS.
Exemple de coûts économisés :
Comparaison du nombre de lignes de configuration :
Avant (avec DynamoDB) :
# 10 lignes de configuration backend
# + Table DynamoDB à créer et gérer
# + Permissions IAM pour DynamoDB
Après (natif S3) :
# 6 lignes de configuration backend
# Aucune ressource supplémentaire
# Permissions IAM simplifiées
Tip
Configuration du bucket S3 recommandée
Pour utiliser le verrouillage natif S3 en toute sécurité :
encrypt = true
Si un fichier de verrouillage reste en place après une interruption anormale :
# 1. Vérifier l'état du verrouillage
aws s3 ls s3://mon-bucket-terraform-state/production/ | grep tflock
# 2. Forcer le déverrouillage (après vérification !)
terraform force-unlock <LOCK_ID>
# 3. Ou supprimer manuellement le fichier de verrouillage
aws s3 rm s3://mon-bucket-terraform-state/production/terraform.tfstate.tflock
Warning
Ne forcez jamais le déverrouillage si une opération Terraform est réellement en cours !
Si vous devez maintenir des projets sous Terraform < 1.10, vous devrez continuer à utiliser DynamoDB pour ces projets spécifiques. La cohabitation des deux systèmes dans votre organisation est possible.
Le verrouillage natif S3 fonctionne par région. Pour des déploiements multi-régions complexes, documentez clairement quelle région héberge quel state file.
Besoin d’aide pour migrer votre infrastructure ? Chez Berria IT, on accompagne les équipes DevOps dans la modernisation de leur infrastructure as code. Contactez-nous.
Vous avez déjà reçu une facture AWS qui vous a fait froid dans le dos ? Vous n’êtes pas seul. La facturation cloud …
Les sites web statiques connaissent un regain d’intérêt dans le monde du DevOps et du Cloud. Pourquoi ? Parce …
Contactez-nous pour discuter de votre projet cloud et découvrir comment nous pouvons vous accompagner dans votre transformation digitale.
Nous contacter