Memorizzare lo stato di Terraform in un bucket Cloud Storage

In questo tutorial, imparerai come archiviare lo stato di Terraform in un bucket Cloud Storage.

Per impostazione predefinita, Terraform archivia lo stato localmente in un file denominato terraform.tfstate. Questa configurazione predefinita può rendere difficile l'utilizzo di Terraform per i team quando più utenti eseguono Terraform contemporaneamente e ogni macchina ha la propria comprensione dell'infrastruttura attuale.

Per aiutarti a evitare questi problemi, questa pagina mostra come configurare uno stato remoto che punta a un bucket Cloud Storage. Lo stato remoto è una funzionalità dei backend Terraform.

Obiettivi

Questo tutorial mostra come:

  • Utilizza Terraform per eseguire il provisioning di un bucket Cloud Storage per archiviare lo stato di Terraform.
  • Aggiungi i modelli nel file di configurazione Terraform per eseguire la migrazione dello stato dal backend locale al bucket Cloud Storage.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Cloud Storage comporta costi per archiviazione, operazioni di lettura e scrittura, traffico in uscita dalla rete e replica.

Il bucket Cloud Storage in questo tutorial ha la gestione delle versioni degli oggetti abilitata per conservare la cronologia delle tue implementazioni. L'attivazione del controllo delle versioni degli oggetti aumenta i costi di archiviazione, che puoi mitigare configurando la gestione del ciclo di vita degli oggetti per eliminare le versioni precedenti dello stato.

Prima di iniziare

  1. Nella console Google Cloud , attiva Cloud Shell.

    Attiva Cloud Shell

    Cloud Shell è preinstallato con Terraform.

  2. Se utilizzi una shell locale, segui questi passaggi:

  3. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  4. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  5. Abilita l'API Cloud Storage:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    gcloud services enable storage.googleapis.com
  6. Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM: roles/storage.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    Sostituisci quanto segue:

    In alternativa, puoi creare un ruolo IAM personalizzato che contenga le seguenti autorizzazioni:

    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    Come best practice, ti consigliamo di controllare l'accesso al bucket e ai file di stato archiviati. Solo un piccolo gruppo di utenti (ad esempio, l'amministratore cloud principale e la persona che funge da amministratore alternativo o di backup) deve disporre delle autorizzazioni di amministratore per il bucket. Gli altri sviluppatori devono disporre delle autorizzazioni per scrivere e leggere solo gli oggetti nel bucket.

Prepara l'ambiente

  1. Clona il repository GitHub contenente gli esempi di Terraform:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
    
  2. Passa alla directory di lavoro:

    cd terraform-docs-samples/storage/remote_terraform_backend_template
    

Esamina i file Terraform

  1. Esamina il file main.tf:

    cat main.tf
    

    L'output è simile al seguente:

    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
    }

    Questo file descrive le seguenti risorse:

    • random_id: questo valore viene aggiunto al nome del bucket Cloud Storage per garantire un nome univoco per il bucket Cloud Storage.
    • google_storage_bucket: il bucket Cloud Storage in cui archiviare il file di stato. Questo bucket è configurato per avere le seguenti proprietà:
      • force_destroy è impostato su false per garantire che il bucket non venga eliminato se contiene oggetti. In questo modo, le informazioni sullo stato nel bucket non vengono eliminate accidentalmente.
      • public_access_prevention è impostato su enforced per assicurarsi che i contenuti del bucket non vengano esposti accidentalmente al pubblico.
      • uniform_bucket_level_access è impostato su true per consentire il controllo dell'accesso al bucket e ai relativi contenuti utilizzando le autorizzazioni IAM anziché controllo dell'accesso dell'accesso.
      • versioning è abilitato per garantire che le versioni precedenti dello stato vengano conservate nel bucket.
    • local_file: un file locale. Il contenuto di questo file indica a Terraform di utilizzare il bucket Cloud Storage come backend remoto una volta creato il bucket.

Esegui il provisioning del bucket Cloud Storage

  1. Inizializza Terraform:

    terraform init
    

    Quando esegui terraform init per la prima volta, il bucket Cloud Storage specificato nel file main.tf non esiste ancora, quindi Terraform inizializza un backend locale per archiviare lo stato nel file system locale.

  2. Applica la configurazione per eseguire il provisioning delle risorse descritte nel file main.tf:

    terraform apply
    

    Quando richiesto, inserisci yes.

    Quando esegui terraform apply per la prima volta, Terraform esegue il provisioning del bucket Cloud Storage per l'archiviazione dello stato. Crea anche un file locale; i contenuti di questo file indicano a Terraform di utilizzare il bucket Cloud Storage come backend remoto per archiviare lo stato.

Migrazione dello stato al bucket Cloud Storage

  1. Esegui la migrazione dello stato di Terraform al backend Cloud Storage remoto:

    terraform init -migrate-state
    

    Terraform rileva che hai già un file di stato localmente e ti chiede di eseguire la migrazione dello stato al nuovo bucket Cloud Storage. Quando richiesto, inserisci yes.

Dopo aver eseguito questo comando, lo stato di Terraform viene archiviato nel bucket Cloud Storage. Terraform estrae l'ultimo stato da questo bucket prima di eseguire un comando e lo inserisce nel bucket dopo l'esecuzione di un comando.

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa pagina, segui questi passaggi.

  1. Apri il file main.tf.

  2. Nella risorsa google_storage_bucket.default, aggiorna il valore di force_destroy a true.

  3. Applica la configurazione aggiornata:

    terraform apply
    

    Quando richiesto, inserisci yes.

  4. Elimina il file di stato:

    rm backend.tf
    
  5. Riconfigura il backend in modo che sia locale:

    terraform init -migrate-state
    

    Quando richiesto, inserisci yes.

  6. Esegui questo comando per eliminare le risorse Terraform:

    terraform destroy
    

    Quando richiesto, inserisci yes.

Passaggi successivi