Gestion Distante du tfstate avec Terraform

Centralisez et sécurisez votre état Terraform avec un backend distant.

Introduction

Terraform utilise un fichier d'état (terraform.tfstate) pour suivre les ressources qu'il gère. Par défaut, ce fichier est stocké localement, ce qui pose des défis en termes de collaboration, sécurité et fiabilité.

Ce guide explique comment configurer un backend distant pour stocker et gérer le tfstate de manière sécurisée et collaborative, en utilisant HCP Terraform ou d'autres solutions.

Pourquoi un backend distant ?

Stocker le tfstate localement présente plusieurs risques :

  • Perte de données : Si le fichier est supprimé ou corrompu, Terraform ne peut plus gérer les ressources existantes.
  • Conflits de version : En équipe, les modifications locales peuvent entrer en conflit.
  • Modifications concurrentes : Sans verrouillage, deux utilisateurs peuvent appliquer des changements simultanément.
  • Sécurité : Le fichier local peut contenir des informations sensibles (mots de passe, clés API).

⚠️ Important : Un backend distant résout ces problèmes en centralisant le stockage du tfstate et en ajoutant des fonctionnalités comme le verrouillage d'état et l'historique des versions.

HCP Terraform

HCP Terraform (anciennement Terraform Cloud) est une solution SaaS proposée par HashiCorp pour gérer les états Terraform à distance. Elle offre les avantages suivants :

  • Stockage sécurisé : Le tfstate est stocké de manière chiffrée et redondante.
  • Verrouillage automatique : Empêche les modifications concurrentes.
  • Historique des versions : Accès à l'historique des plans et des applis.
  • Intégration VCS : Connexion native avec GitHub, GitLab, Bitbucket, etc.
  • Gestion des variables : Variables d'environnement et secrets centralisés.
  • Collaboration : Permet à plusieurs utilisateurs de travailler sur le même projet.

HCP Terraform est une alternative plus simple à mettre en place qu'un backend basé sur S3 + DynamoDB, bien que payante pour les fonctionnalités avancées.

Configuration du backend HCP Terraform

Pour configurer HCP Terraform comme backend distant, ajoutez le bloc suivant dans votre fichier main.tf :

terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "votre-organisation"

    workspaces {
      name = "votre-workspace"
    }
  }
}

Étapes détaillées :

  1. Créer un compte : Inscrivez-vous sur app.terraform.io et créez une organisation.
  2. Configurer un workspace : Dans HCP Terraform, créez un workspace pour votre projet.
  3. Ajouter la configuration du backend : Copiez le bloc ci-dessus dans votre main.tf et remplacez votre-organisation et votre-workspace.
  4. Initialiser Terraform : Exécutez terraform init pour migrer l'état local vers HCP Terraform.

Connexion à HCP Terraform

Il faut se connecter à HCP afin de récupérer un token, Le token Terraform (souvent appelé API token ou user token) sert à authentifier Terraform auprès de HCP Terraform (Terraform Cloud) — autrement dit, c’est la clé d’accès sécurisée qui permet à ton client Terraform (en local ou dans un pipeline CI/CD) d’interagir avec ton espace HCP.

$ terraform login

Terraform will request an API token for app.terraform.io using your browser.

If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
    /Users/lidobel3/.terraform.d/credentials.tfrc.json

Do you want to proceed?
  Only 'yes' will be accepted to confirm.

  Enter a value: yes


---------------------------------------------------------------------------------

Terraform must now open a web browser to the tokens page for app.terraform.io.

If a browser does not open this automatically, open the following URL to proceed:
    https://app.terraform.io/app/settings/tokens?source=terraform-login


---------------------------------------------------------------------------------

Generate a token using your browser, and copy-paste it into this prompt.

Terraform will store the token in plain text in the following file
for use by subsequent commands:
    /Users/lidobel3/.terraform.d/credentials.tfrc.json

Token for app.terraform.io:
  Enter a value: 


Retrieved token for user lidobel3


---------------------------------------------------------------------------------

                                          -                                
                                          -----                           -
                                          ---------                      --
                                          ---------  -                -----
                                           ---------  ------        -------
                                             -------  ---------  ----------
                                                ----  ---------- ----------
                                                  --  ---------- ----------
   Welcome to HCP Terraform!                       -  ---------- -------
                                                      ---  ----- ---
   Documentation: terraform.io/docs/cloud             --------   -
                                                      ----------
                                                      ----------
                                                       ---------
                                                           -----
                                                               -


   New to HCP Terraform? Follow these steps to instantly apply an example configuration:

   $ git clone https://github.com/hashicorp/tfc-getting-started.git
   $ cd tfc-getting-started
   $ scripts/setup.sh.

Répondez yes pour copier l'état local vers HCP Terraform.

⚠️ Attention : Après la migration, supprimez le fichier terraform.tfstate local pour éviter toute confusion.

Migration du tfstate vers HCP Terraform

Si vous avez déjà un tfstate local, Terraform vous guidera pour le migrer vers HCP Terraform lors de l'initialisation.

$ terraform init

Initializing HCP Terraform...
Do you wish to proceed?
  As part of migrating to HCP Terraform, Terraform can optionally copy
  your current workspace state to the configured HCP Terraform workspace.
  
  Answer "yes" to copy the latest state snapshot to the configured
  HCP Terraform workspace.
  
  Answer "no" to ignore the existing state and just activate the configured
  HCP Terraform workspace with its existing state, if any.
  
  Should Terraform migrate your existing state?

  Enter a value: yes

Initializing modules...
Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Reusing previous version of hashicorp/random from the dependency lock file
- Reusing previous version of hashicorp/tls from the dependency lock file
- Reusing previous version of hashicorp/local from the dependency lock file
- Using previously-installed hashicorp/aws v6.14.1
- Using previously-installed hashicorp/random v3.7.2
- Using previously-installed hashicorp/tls v4.1.0
- Using previously-installed hashicorp/local v2.5.3

HCP Terraform has been successfully initialized!

You may now begin working with HCP Terraform. Try running "terraform plan" to
see any changes that are required for your infrastructure.

If you ever set or change modules or Terraform Settings, run "terraform init"
again to reinitialize your working directory.

Répondez yes pour copier l'état local vers HCP Terraform.

⚠️ Attention : Après la migration, supprimez le fichier terraform.tfstate local pour éviter toute confusion.

Bonnes pratiques

1. Utiliser des workspaces

Les workspaces permettent de gérer plusieurs environnements (dev, staging, prod) avec un seul backend. Exemple :

terraform {
  backend "remote" {
    organization = "votre-organisation"
    workspaces {
      name = "prod"
    }
  }
}

2. Protéger les variables sensibles

Utilisez les variables sensibles de HCP Terraform pour stocker les mots de passe, clés API, etc. Exemple dans HCP Terraform :

variable "db_password" {
  type      = string
  sensitive = true
}

3. Activer le verrouillage d'état

Le state locking est activé par défaut dans HCP Terraform. Il empêche les modifications concurrentes et les corruptions du tfstate.

4. Sauvegarder régulièrement

Bien que HCP Terraform stocke l'historique, il est recommandé de sauvegarder régulièrement le tfstate localement (en cas de besoin).

Alternatives à HCP Terraform

Si HCP Terraform ne convient pas à vos besoins, voici d'autres solutions pour gérer le tfstate à distance :

  • Backend S3 + DynamoDB (AWS) : Solution populaire pour les utilisateurs AWS.
    terraform {
      backend "s3" {
        bucket         = "mon-bucket-tfstate"
        key            = "path/to/my/key"
        region         = "us-east-1"
        dynamodb_table = "ma-table-de-verrouillage"
      }
    }
  • Backend Azure Blob Storage : Pour les utilisateurs de Microsoft Azure.
    terraform {
      backend "azurerm" {
        resource_group_name  = "mon-groupe-de-ressources"
        storage_account_name = "moncompte"
        container_name       = "tfstate"
        key                  = "prod.terraform.tfstate"
      }
    }
  • Backend Google Cloud Storage : Pour les utilisateurs de Google Cloud.
    terraform {
      backend "gcs" {
        bucket = "mon-bucket-tfstate"
        prefix = "terraform/state"
      }
    }

Conclusion

La gestion distante du tfstate avec HCP Terraform (ou une alternative comme S3/DynamoDB) est essentielle pour :

  • Centraliser et sécuriser l'état de votre infrastructure.
  • Faciliter la collaboration en équipe.
  • Automatiser les déploiements avec des pipelines CI/CD.
  • Bénéficier d'un historique complet et d'un verrouillage d'état.

Pour aller plus loin, consultez la documentation officielle de Terraform.