L'état dans Terraform est un élément crucial pour la gestion de votre infrastructure de manière efficace et cohérente. Il joue le rôle d'une source de vérité en enregistrant l'état actuel de vos ressources provisionnées.
Fonctionnement:
- Fichier d'état: Chaque fois que vous appliquez une configuration Terraform, un fichier d'état (généralement nommé
terraform.tfstate) est créé ou mis à jour.
- Informations stockées: Ce fichier contient des informations détaillées sur les ressources gérées par Terraform, y compris leurs identifiants, attributs, dépendances et métadonnées.
La gestion efficace des fichiers d'état est essentielle pour plusieurs raisons :
- Cohérence : Elle assure que l'état de votre infrastructure correspond à ce qui est défini dans votre configuration Terraform.
- Performance : En ayant une vue claire de l'état actuel, Terraform peut opérer plus rapidement, en se concentrant uniquement sur les ressources qui nécessitent des changements.
- Sécurité : Un fichier d'état bien géré contribue à la sécurité de votre infrastructure en évitant des modifications accidentelles ou non autorisées.
Supposons que vous ayez à configurer un serveur virtuel sur AWS, avec un groupe de sécurité associé et un équilibrage de charge.
Lorsque vous exécutez terraform apply pour la première fois, Terraform crée un fichier d'état nommé terraform.tfstate. Ce fichier enregistre des détails clés sur les ressources créées, comme les identifiants AWS, les adresses IP et les configurations de sécurité.
- Configuration Initiale : Votre fichier Terraform définit un serveur EC2, un groupe de sécurité et un équilibrage de charge.
- Première Exécution : Terraform déploie ces ressources et enregistre leurs états dans
terraform.tfstate.
- Consultation du Fichier d'État : Ce fichier contient maintenant des informations telles que l'ID de l'instance EC2, les règles du groupe de sécurité et les détails de l'équilibrage de charge.
Supposons maintenant que vous modifiez la configuration pour augmenter la capacité de l'équilibrage de charge.
- Mise à Jour de la Configuration : Vous ajustez le paramètre de capacité dans votre fichier Terraform.
- Deuxième Exécution : Lorsque vous exécutez à nouveau
terraform apply, Terraform compare l'état souhaité (votre configuration mise à jour) avec l'état actuel (stocké dans terraform.tfstate).
- Application Sélective des Changements : Terraform détecte que seul l'équilibrage de charge doit être modifié et applique les changements nécessaires sans toucher aux autres ressources.
- Stockage centralisé: Permet de stocker les états de manière centralisée, accessible à plusieurs utilisateurs et équipes.
- Collaboration améliorée: Facilite la collaboration en permettant à plusieurs utilisateurs de travailler sur la même infrastructure sans conflit d'état.
- Sécurité renforcée: Offre des options de sécurité supplémentaires pour protéger les fichiers d'état sensibles.
- Disponibilité accrue: Permet de stocker les états dans des emplacements hautement disponibles pour assurer la continuité d'activité.
- Écosystème cloud: Choisir un backend compatible avec votre environnement cloud (AWS, Azure, GCP, etc.).
- Besoins en matière de sécurité: Évaluer les options de sécurité offertes par chaque backend (chiffrement, contrôle d'accès, etc.).
- Collaboration: Considérer les fonctionnalités de collaboration offertes par le backend (verrouillage d'état, historique des modifications, etc.).
- Disponibilité: Déterminer le niveau de disponibilité requis pour les fichiers d'état (réplication, basculement, etc.).
- Backend local: Stocke les états localement, simple à utiliser mais moins adapté à la collaboration et à la haute disponibilité.
- Backend distant: Stocke les états dans un stockage distant (Cloud Storage, S3, etc.), offre une meilleure collaboration et disponibilité.
- Backend HashiCorp Cloud Terraform: Solution cloud native pour la gestion des états, offre des fonctionnalités avancées de sécurité, de collaboration et d'automatisation.
Par défaut les données du state sont stockés dans un fichier local, se nommant terraform.tfstate et utilise le backend local. On peut changer le répertoire ou il est stocké de cette manière :
terraform {
backend "local" {
path = "relative/path/to/terraform.tfstate"
}
}
Terraform propose de stocker ses states dans son infrastructure et ce soit :
- dans l'offre Terraform cloud
- dans l'offre Terraform Enterprise
Voici un exemple de configuration utilisant le backend remote :
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "company"
workspaces {
name = "my-app-prod"
}
}
}
Plus d'informations sur ce billet dédié (Stéphane Robert).
¶ Backend Standards
Il est donc possible de stocker ses states dans des buckets Amazon S3. Ce backend prend en charge le verrouillage d'état et la vérification de cohérence avec une table Dynamo DB. Cela va permettre d'éviter de véroler les states suite à des déploiements simultanés par exemple.
Exemple de configuration utilisant le backend S3 :
terraform {
backend "s3" {
bucket = "mybucket"
key = "path/to/my/key"
region = "eu-west-1"
dynamodb_table = "terraform_state"
}
}
Terraform doit posséder les permissions IAM suivantes pour stocker et lire les données du state:
s3:ListBucket on arn:aws:s3:::mybucket s3:GetObject on arn:aws:s3:::mybucket/path/to/my/key s3:PutObject on arn:aws:s3:::mybucket/path/to/my/key
Pour créer le backend S3 et la table dynamodb, vous pouvez utiliser cette configuration :
resource "aws_s3_bucket" "bucket" {
bucket = "terraform-state-backend"
versioning {
enabled = true
}
server_side_encryption_configuration {
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
object_lock_configuration {
object_lock_enabled = "Enabled"
}
tags = {
Name = "S3 Remote Terraform State Store"
}
}
resource "aws_dynamodb_table" "terraform-lock" {
name = "terraform_state"
read_capacity = 5
write_capacity = 5
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
tags = {
"Name" = "DynamoDB Terraform State Lock Table"
}
}
-
terraform refresh : Cette commande permet de mettre à jour le fichier d'état pour qu'il corresponde à l'état réel des ressources dans le cloud.
-
terraform plan : Exécutez terraform plan pour examiner les actions que Terraform envisage de prendre. Cela peut aider à identifier les incohérences.
-
En cas de corruption ou de perte du fichier d'état, la récupération peut être complexe.
-
Si vous avez activé le versionnement dans votre backend distant, vous pouvez restaurer une version antérieure du fichier d'état.
-
Autrement, terraform import peut être utilisé pour reconstruire le fichier d'état. Cette commande permet d'importer les ressources existantes dans un nouveau fichier d'état.
- Stocker les fichiers d'état localement sur votre machine n'est pas recommandé, surtout dans un environnement d'équipe.
- Utiliser des backends distants comme S3 d'AWS, Azure Blob Storage, ou Google Cloud Storage. Cela permet de sécuriser, partager et versionner les fichiers d'état. Ces services offrent également des fonctionnalités comme le verrouillage d'état pour prévenir les conflits lors des modifications simultanées.
- Les fichiers d'état peuvent contenir des informations sensibles. Il est important de les chiffrer lors du stockage. La plupart des services de backend distant offrent des options de chiffrement, assurez-vous de les activer.
- Restreindre l'accès aux fichiers d'état est essentiel pour la sécurité. Configurer des contrôles d'accès précis et donner les permissions uniquement aux utilisateurs nécessaires.
- Activer le versionnement sur votre backend pour garder un historique des modifications apportées aux fichiers d'état. Effectuer des sauvegardes régulières pour prévenir la perte de données en cas de corruption ou de suppression accidentelle.
- Gérer des états séparés pour vos environnements de développement, de test et de production. Cela permet d'éviter les interférences entre les environnements et réduit le risque d'erreurs.