Lorsque vous gérez une infrastructure cloud avec Terraform, il est essentiel de suivre quels blocs de configuration correspondent à quelles ressources réelles afin de détecter précisément les modifications. L'état Terraform conserve cette correspondance, ce qui permet à Terraform de générer des plans d'exécution corrects et d'appliquer uniquement les changements nécessaires.
Qu'est-ce que l'état Terraform
L'état Terraform est un référentiel de métadonnées pour la configuration de votre infrastructure. Par défaut, Terraform enregistre l'état de chaque ressource qu'il gère dans un fichier d'état nommé terraform.tfstate, mais vous pouvez également stocker ce fichier à distance.
Chaque bloc de ressource dans une configuration Terraform est identifié dans l'état par son resource_name. Terraform utilise cet identifiant pour faire correspondre les objets distants, tels que les ressources cloud, aux instances de ressources déclarées dans votre configuration. Lorsque Terraform crée ou modifie un objet distant, il enregistre l'identité de cet objet dans le fichier d'état. Les futures modifications de configuration s'appuient sur cet enregistrement pour déterminer s'il faut mettre à jour ou supprimer l'objet.
Le flux de gestion des ressources fonctionne comme suit :
Lors du premier
terraform apply, Terraform crée les ressources déclarées et génère un fichier d'état qui référence chaque ressource par son nom de bloc.Lors des exécutions suivantes, Terraform compare le fichier de configuration, le fichier d'état et l'état réel de la ressource distante, puis génère un plan d'exécution en fonction des différences constatées.
Lors de l'exécution du plan, Terraform met à jour chaque ressource pour qu'elle corresponde à la configuration. Si une mise à jour sur place n'est pas possible en raison des limitations de l'API distante, Terraform détruit et recrée la ressource.
Une fois le plan exécuté, Terraform met à jour le fichier d'état pour refléter l'état actuel de l'infrastructure.
Si une ressource est supprimée de la configuration mais existe toujours dans le fichier d'état, Terraform détruit cette ressource.
Stockage de l'état Terraform
Par défaut, Terraform enregistre l'état localement dans le répertoire de travail actuel sous forme de fichier .tfstate. Cette approche convient parfaitement aux projets développés par une seule personne, sans configuration supplémentaire. Lorsque plusieurs développeurs exécutent Terraform simultanément, chacun avec son propre fichier d'état local, cette méthode pose problème.
L'utilisation d'un état local dans un environnement d'équipe présente trois limites :
-
Absence d'accès partagé
Chaque membre de l'équipe doit accéder au même fichier d'état. Le stocker sur une ressource partagée, telle qu'une instance ECS, ajoute une charge de gestion et crée un point de défaillance unique.
-
Absence de verrouillage de l'état
Si deux membres de l'équipe exécutent Terraform simultanément, ils peuvent provoquer une condition de concurrence. L'écriture simultanée de plusieurs processus Terraform dans le même fichier d'état risque d'entraîner des conflits, une perte de données et une corruption du fichier d'état.
-
Exposition des données sensibles
Le fichier d'état stocke les données en texte clair. Les valeurs sensibles, telles que les identifiants de base de données et les mots de passe SSH, sont visibles par toute personne ayant accès au fichier.
Stockez le fichier d'état dans un emplacement centralisé et distant lorsque plusieurs personnes gèrent conjointement l'infrastructure. Lors des modifications de l'infrastructure, le fichier d'état distant se met à jour automatiquement, garantissant que chaque membre de l'équipe dispose de la dernière version de l'état.
Le stockage distant de l'état résout ces trois limitations :
-
Mises à jour automatiques
Après la configuration d'un backend distant, Terraform charge automatiquement l'état depuis l'emplacement distant à chaque exécution de
planou deapply, puis renvoie l'état mis à jour après chaqueapply. Cela élimine les erreurs liées à la gestion manuelle de l'état. -
Verrouillage de l'état
Lorsqu'une commande Terraform s'exécute, le backend distant verrouille le fichier d'état. Cela empêche la corruption due à des exécutions concurrentes de
terraform applypar plusieurs développeurs. -
Stockage sécurisé
Les buckets OSS prennent en charge le chiffrement en transit et au repos, et offrent un contrôle d'accès granulaire qui vous permet de restreindre les utilisateurs autorisés à lire ou modifier le fichier d'état.
Configuration du stockage distant de l'état
Alibaba Cloud prend en charge le stockage distant de l'état à l'aide de buckets Object Storage Service (OSS), avec un verrouillage du fichier d'état fourni par Tablestore. Avant de configurer le stockage distant de l'état, créez un bucket OSS pour stocker le fichier d'état et une instance Tablestore pour gérer le verrouillage.
-
Créez les ressources dépendantes
Ajoutez les ressources
alicloud_oss_bucket,alicloud_ots_instanceetalicloud_ots_tableà un fichier de configuration Terraform tel quemain.tf. Définissez le nom du bucket, le nom de l'instance Tablestore, le type d'instance et le nom de la table selon vos besoins. Exécutezterraform applypour créer les ressources. -
Configurez l'état distant
Ajoutez la configuration du backend dans un nouveau fichier nommé
backend.tf, puis exécutezterraform init. Terraform détecte le fichier d'état local existant et vous invite à le copier dans le bucket OSS ; saisissezyes. Une foisterraform initterminé, votre état Terraform est stocké dans le bucket OSS.
Pour simplifier cette configuration, utilisez le module Terraform Terraform module fourni par Alibaba Cloud.
Voici un extrait d'un fichier d'état stocké dans un bucket OSS :
{
"version": 4,
"terraform_version": "1.7.1",
"serial": 9,
"lineage": "5827f172-fc29-c293-cce7-7932f3537499",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "alicloud_oss_bucket",
"name": "this",
"provider": "provider[\"registry.terraform.io/hashicorp/alicloud\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_monitor": [
{
"status": "Disabled"
}
],
"acl": "private",
"bucket": "tf-oss-backend-for-demo",
Le fichier d'état enregistre les métadonnées de chaque ressource gérée, y compris son type, son nom et son fournisseur.
Bonnes pratiques pour l'état Terraform
-
Utilisez un état distant pour la collaboration en équipe
Utilisez un état distant pour verrouiller et versionner le fichier d'état lorsque vous travaillez en équipe. Utilisez OSS comme backend de stockage distant de l'état et Tablestore pour le verrouillage de l'état. Restreignez l'accès au bucket de stockage d'état au système de build et aux administrateurs disposant de privilèges élevés. Ajoutez
*.tfstateà votre fichier.gitignoreafin d'éviter que les fichiers d'état locaux ne soient accidentellement validés dans des systèmes de contrôle de version tels que GitHub ou GitLab. -
Évitez de stocker des données sensibles dans l'état
De nombreuses ressources et fournisseurs de données écrivent des valeurs sensibles, telles que les identifiants et les mots de passe, en texte clair dans le fichier d'état. Évitez de stocker des informations sensibles dans des ressources qui les exposent via l'état.
-
Chiffrez l'état
Chiffrez toujours le fichier d'état distant comme couche de sécurité supplémentaire. OSS prend en charge trois méthodes de chiffrement : KMS, AES256 et SM4. Utilisez une clé KMS personnalisée pour une protection accrue.
-
Ne modifiez jamais manuellement le fichier d'état
Le fichier d'état maintient la correspondance entre votre configuration Terraform et votre infrastructure Alibaba Cloud. Des modifications manuelles peuvent corrompre l'état et entraîner de graves pannes d'infrastructure.