Stocker l'état Terraform dans un bucket Cloud Storage

Dans ce tutoriel, vous allez apprendre à stocker l'état Terraform dans un bucket Cloud Storage.

Par défaut, Terraform stocke l'état localement dans un fichier nommé terraform.tfstate. Cette configuration par défaut peut rendre l'utilisation de Terraform difficile pour les équipes lorsque de multiples utilisateurs exécutent Terraform en même temps et que chaque ordinateur possède sa propre compréhension de l'infrastructure actuelle.

Pour vous aider à éviter de tels problèmes, cette page vous explique comment configurer un état distant qui pointe vers un bucket Cloud Storage. Un état distant est une fonctionnalité des backends Terraform.

Préparer l'environnement

  1. Clonez le dépôt GitHub contenant les exemples Terraform :

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
    
  2. Accédez au répertoire de travail :

    cd terraform-docs-samples/storage/remote_terraform_backend_template
    

Examiner les fichiers Terraform

  1. Examinez le fichier main.tf :

    cat main.tf
    

    Le résultat ressemble à ce qui suit :

    resource "random_id" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name     = "${random_id.default.hex}-terraform-remote-backend"
      location = "US"
    
      force_destroy               = false
      public_access_prevention    = "enforced"
      uniform_bucket_level_access = true
    
      versioning {
        enabled = true
      }
    }
    
    resource "local_file" "default" {
      file_permission = "0644"
      filename        = "${path.module}/backend.tf"
    
      # You can store the template in a file and use the templatefile function for
      # more modularity, if you prefer, instead of storing the template inline as
      # we do here.
      content = <<-EOT
      terraform {
        backend "gcs" {
          bucket = "${google_storage_bucket.default.name}"
        }
      }
      EOT
    }

    Ce fichier décrit les ressources suivantes :

    • random_id : cette valeur est ajoutée au nom du bucket Cloud Storage pour garantir un nom unique.
    • google_storage_bucket : bucket Cloud Storage permettant de stocker le fichier d'état. Ce bucket est configuré avec les propriétés suivantes :
      • force_destroy est défini sur false pour s'assurer que le bucket n'est pas supprimé s'il contient des objets. Cela permet de s'assurer que les informations sur l'état du bucket ne sont pas supprimées accidentellement.
      • public_access_prevention est défini sur enforced pour s'assurer que le contenu du bucket n'est pas accidentellement exposé au public.
      • uniform_bucket_level_access est défini sur true pour permettre de contrôler l'accès au bucket et à son contenu à l'aide des autorisations IAM au lieu des listes de contrôle des accès d'accès.
      • versioning est activé pour s'assurer que les versions antérieures de l'état sont conservées dans le bucket.
    • local_file : fichier local. Le contenu de ce fichier indique à Terraform d'utiliser le bucket Cloud Storage comme backend distant une fois le bucket créé.

Provisionner le bucket Cloud Storage

  1. Initialisez Terraform :

    terraform init
    

    Lorsque vous exécutez terraform init pour la première fois, le bucket Cloud Storage que vous avez spécifié dans le fichier main.tf n'existe pas encore. Terraform initialise donc un backend local pour stocker l'état dans le système de fichiers local.

  2. Appliquez la configuration pour provisionner les ressources décrites dans le fichier main.tf :

    terraform apply
    

    Lorsque vous y êtes invité, saisissez yes.

    Lorsque vous exécutez terraform apply pour la première fois, Terraform provisionne le bucket Cloud Storage pour stocker l'état. Il crée également un fichier local dont le contenu indique à Terraform d'utiliser le bucket Cloud Storage comme backend distant pour stocker l'état.

Migrer l'état vers un bucket Cloud Storage

  1. Migrez l'état Terraform vers le backend Cloud Storage distant :

    terraform init -migrate-state
    

    Terraform détecte que vous disposez déjà d'un fichier d'état local et vous invite à migrer l'état vers le nouveau bucket Cloud Storage. Lorsque vous y êtes invité, saisissez yes.

Une fois cette commande exécutée, votre état Terraform est stocké dans le bucket Cloud Storage. Terraform extrait le dernier état de ce bucket avant d'exécuter une commande et transfère le dernier état vers le bucket après l'exécution d'une commande.