Archivia lo stato di Terraform in un bucket Cloud Storage


In questo tutorial imparerai ad archiviare lo stato di Terraform in un ambiente Cloud Storage di sincronizzare la directory di una VM con un bucket.

Per impostazione predefinita, Terraform archivia lo stato localmente in un file denominato terraform.tfstate. Questa configurazione predefinita può rendono difficile l'utilizzo di Terraform per i team quando più utenti eseguono Terraform allo stesso tempo e ogni macchina ha una propria comprensione del processo dell'infrastruttura.

Per aiutarti a evitare questi problemi, in questa pagina viene illustrato come configurare un stato remoto che punta a una nel bucket Cloud Storage. Lo stato remoto è una funzionalità Backend Terraform.

Obiettivi

Questo tutorial illustra come svolgere le seguenti operazioni:

  • Utilizzare Terraform per eseguire il provisioning di un bucket Cloud Storage da archiviare lo stato di Terraform.
  • Aggiungi modelli nel file di configurazione Terraform da cui eseguire la migrazione dello stato il 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 basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

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

Il bucket Cloud Storage in questo tutorial ha oggetto Controllo delle versioni abilitato per mantenere la cronologia dei tuoi deployment di machine learning. Abilitando il controllo delle versioni degli oggetti aumenta i costi di archiviazione, mitigare il ciclo di vita degli oggetti 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

    Terraform è preinstallato su Cloud Shell.

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

    • Installa Terraform.
    • Crea credenziali di autenticazione locali per il tuo Account Google:

      gcloud auth application-default login
  3. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  4. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  5. Attiva l'API Cloud Storage.

    gcloud services enable storage.googleapis.com
  6. Concedi i ruoli al tuo Account Google. Esegui questo comando una volta per ciascuno dei seguenti ruoli IAM: roles/storage.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Sostituisci PROJECT_ID con l'ID progetto.
    • Sostituisci EMAIL_ADDRESS con il tuo indirizzo email.
    • Sostituisci ROLE con ogni singolo ruolo.
  7. In alternativa, puoi creare una ruolo IAM personalizzato che contiene le seguenti autorizzazioni:

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

    Come best practice, consigliamo l'accesso al bucket e allo stato che i file archiviati lì sono controllati. Solo un gruppo ridotto di utenti (ad esempio, l'amministratore principale del cloud e la persona che agisce in qualità di amministratore di backup) deve disporre delle autorizzazioni di amministratore per il bucket. La altri sviluppatori dovrebbero disporre delle autorizzazioni solo per scrivere e leggere 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
    }

    In questo file vengono descritte le seguenti risorse:

    • erandom_id: viene aggiunto al nome del bucket Cloud Storage per un nome univoco per il bucket Cloud Storage.
    • google_storage_bucket: il bucket Cloud Storage da archiviare il file di stato. Questo bucket è configurato in modo da avere quanto segue proprietà:
      • force_destroy è impostato su false per garantire che il bucket non sia se contiene oggetti. Ciò garantisce che lo stato le informazioni nel bucket non vengano eliminate accidentalmente.
      • public_access_prevention è impostato su enforced per garantire che i contenuti dei bucket non siano involontariamente esposti al pubblico.
      • uniform_bucket_level_access è impostato su true per consentire il controllo l'accesso al bucket e ai suoi contenuti Autorizzazioni IAM anziché elenchi di controllo dell'accesso.
      • versioning è abilitato per garantire che le versioni precedenti dello stato vengono conservati nel bucket.
    • local_file: un file locale. I contenuti di questo file indicano a Terraform utilizzare il bucket Cloud Storage come backend remoto una volta viene creato un bucket.

Esegui il provisioning del bucket Cloud Storage

  1. Inizializza Terraform:

    terraform init
    

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

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

    terraform apply
    

    Quando richiesto, inserisci yes.

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

Esegui la 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 in locale e ti chiede per eseguire la migrazione dello stato nel nuovo bucket Cloud Storage. Quando richiesto, inserisci yes.

Dopo aver eseguito questo comando, lo stato di Terraform viene archiviato nel bucket Cloud Storage. Terraform esegue il pull dello stato più recente da questo bucket prima di eseguire un comando ed esegue il push dello stato più recente al bucket dopo eseguendo 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 utilizzati in questa pagina, procedi nel seguente modo.

  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