Armazene o estado do Terraform num contentor do Cloud Storage

Neste tutorial, vai aprender a armazenar o estado do Terraform num contentor do Cloud Storage.

Por predefinição, o Terraform armazena o estado localmente num ficheiro denominado terraform.tfstate. Esta configuração predefinida pode dificultar a utilização do Terraform para as equipas quando vários utilizadores executam o Terraform ao mesmo tempo e cada máquina tem a sua própria compreensão da infraestrutura atual.

Para ajudar a evitar estes problemas, esta página mostra como configurar um estado remoto que aponta para um contentor do Cloud Storage. O estado remoto é uma funcionalidade dos backends do Terraform.

Prepare o ambiente

  1. Clone o repositório do GitHub que contém amostras do Terraform:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
    
  2. Mude para o diretório de trabalho:

    cd terraform-docs-samples/storage/remote_terraform_backend_template
    

Reveja os ficheiros do Terraform

  1. Reveja o ficheiro main.tf:

    cat main.tf
    

    O resultado é semelhante ao seguinte

    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
    }

    Este ficheiro descreve os seguintes recursos:

    • random_id: este valor é anexado ao nome do contentor do Cloud Storage para garantir um nome único para o contentor do Cloud Storage.
    • google_storage_bucket: o contentor do Cloud Storage para armazenar o ficheiro de estado. Este contentor está configurado para ter as seguintes propriedades:
      • force_destroy está definido como false para garantir que o contentor não é eliminado se tiver objetos. Isto garante que as informações de estado no contentor não são eliminadas acidentalmente.
      • public_access_prevention está definido como enforced para garantir que o conteúdo do contentor não é exposto acidentalmente ao público.
      • uniform_bucket_level_access está definido como true para permitir o controlo do acesso ao contentor e ao respetivo conteúdo através de autorizações da IAM em vez de listas de controlo de acesso.
      • versioning está ativado para garantir que as versões anteriores do estado são preservadas no contentor.
    • local_file: um ficheiro local. O conteúdo deste ficheiro indica ao Terraform que deve usar o contentor do Cloud Storage como o back-end remoto assim que o contentor for criado.

Aprovisione o contentor do Cloud Storage

  1. Inicialize o Terraform:

    terraform init
    

    Quando executa o terraform init pela primeira vez, o contentor de armazenamento na nuvem que especificou no ficheiro main.tf ainda não existe. Por isso, o Terraform inicializa um back-end local para armazenar o estado no sistema de ficheiros local.

  2. Aplique a configuração para aprovisionar recursos descritos no ficheiro main.tf:

    terraform apply
    

    Quando lhe for pedido, introduza yes.

    Quando executa terraform apply pela primeira vez, o Terraform aprovisiona o contentor do Cloud Storage para armazenar o estado. Também cria um ficheiro local. O conteúdo deste ficheiro indica ao Terraform que use o contentor do Cloud Storage como o back-end remoto para armazenar o estado.

Migre o estado para o contentor do Cloud Storage

  1. Migre o estado do Terraform para o back-end remoto do Cloud Storage:

    terraform init -migrate-state
    

    O Terraform deteta que já tem um ficheiro de estado localmente e pede-lhe para migrar o estado para o novo contentor do Cloud Storage. Quando lhe for pedido, introduza yes.

Depois de executar este comando, o estado do Terraform é armazenado no contentor do Cloud Storage. O Terraform extrai o estado mais recente deste contentor antes de executar um comando e envia o estado mais recente para o contentor depois de executar um comando.