Armazenar o estado do Terraform em um bucket do Cloud Storage

Neste tutorial, você aprenderá a armazenar o estado do Terraform em um bucket do Cloud Storage.

Por padrão, o Terraform armazena o estado localmente em um arquivo chamado terraform.tfstate. Essa configuração padrão pode dificultar o uso do Terraform para as equipes, especialmente quando muitos usuários o executam ao mesmo tempo e cada máquina tem o próprio entendimento da infraestrutura atual.

Para ajudar a evitar esses problemas, esta página mostra como configurar um estado remoto que aponta para um bucket do Cloud Storage. O estado remoto é um recurso de back-ends do Terraform.

Custos

No Cloud Storage, há custos de armazenamento, operações de leitura e gravação, saída de rede e replicação.

O bucket do Cloud Storage neste tutorial tem o controle de versões de objetos ativado para manter o histórico das implantações. Ativar o controle de versões do objeto aumenta os custos de armazenamento, que podem ser reduzidos com a configuração do Gerenciamento do ciclo de vida de objetos para excluir versões mais antigas.

Antes de começar

  1. Verifique se você tem as permissões do Cloud Storage necessárias na conta de usuário:
    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    Acessar a página IAM

    Saiba mais sobre papéis e permissões.

    Como prática recomendada, recomendamos controlar o acesso ao bucket e aos arquivos de estado armazenados nele. Apenas um pequeno grupo de usuários (por exemplo, o administrador principal da nuvem e a pessoa que atua como administrador alternativo ou de backup) deve ter permissões de administrador para o bucket. Os outros desenvolvedores precisam ter permissões para gravar e ler apenas objetos no bucket.

  2. Iniciar o Cloud Shell.

    O Cloud Shell é uma máquina virtual do Compute Engine. As credenciais de serviço associadas a essa máquina virtual são automáticas. Por isso, não é necessário configurar ou fazer o download de uma chave de conta de serviço.

  3. Ative a API Cloud Storage:

    gcloud services enable storage.googleapis.com
    

Configurar o Terraform para armazenar o estado em um bucket do Cloud Storage

Nas etapas a seguir, você vai criar um bucket do Cloud Storage e altera a configuração do back-end para o novo bucket e o projeto do Google Cloud.

Crie o bucket

  1. Adicione o seguinte recurso do Terraform google_storage_bucket a um arquivo de configuração do Terraform, como main.tf.

    resource "random_id" "bucket_prefix" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name          = "${random_id.bucket_prefix.hex}-bucket-tfstate"
      force_destroy = false
      location      = "US"
      storage_class = "STANDARD"
      versioning {
        enabled = true
      }
      encryption {
        default_kms_key_name = google_kms_crypto_key.terraform_state_bucket.id
      }
      depends_on = [
        google_project_iam_member.default
      ]
    }

    No snippet de código, o campo location está codificado para US (o que significa que um bucket multirregional nos EUA foi criado). É possível alterar esse campo para um local de sua escolha.

  2. Execute terraform apply para criar o bucket de armazenamento.

Altere a configuração do back-end

  1. Adicione o texto a seguir a um novo arquivo de configuração do Terraform chamado backend.tf.

    terraform {
     backend "gcs" {
       bucket  = "BUCKET_NAME"
       prefix  = "terraform/state"
     }
    }
    

    Atualize BUCKET_NAME para corresponder ao nome do novo bucket do Cloud Storage.

  2. Execute terraform init para configurar o back-end do Terraform.

    O Terraform detecta que você já tem um arquivo de estado localmente e solicita que você o copie para o novo bucket do Cloud Storage. Insira yes.

Depois da execução desse comando, o estado do Terraform é armazenado no bucket do Cloud Storage. O Terraform extrai o estado mais recente desse bucket antes de executar um comando e o envia para o bucket depois da execução.

Próximas etapas