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.
Objetivos
Este tutorial mostra como fazer o seguinte:
- Usar o Terraform para provisionar um bucket do Cloud Storage para armazenar o estado do Terraform.
- Adicione modelos no arquivo de configuração do Terraform para migrar o estado a partir do back-end local para o bucket do Cloud Storage.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
O Cloud Storage incorre 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
-
In the Google Cloud console, activate Cloud Shell.
O Cloud Shell vem pré-instalado com o Terraform.
Se você estiver usando um shell local, siga estas etapas:
- Instale o Terraform.
-
Create local authentication credentials for your user account:
gcloud auth application-default login
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Storage API:
gcloud services enable storage.googleapis.com
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/storage.admin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For examples, see Represent workforce pool users in IAM policies. - Replace
ROLE
with each individual role.
Como alternativa, é possível criar um papel personalizado do IAM que contenha as seguintes permissões:
storage.buckets.create
storage.buckets.list
storage.objects.get
storage.objects.create
storage.objects.delete
storage.objects.update
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.
- Replace
Prepare o ambiente
Clone o repositório do GitHub que contém exemplos do Terraform:
git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
Mude para o diretório de trabalho:
cd terraform-docs-samples/storage/remote_terraform_backend_template
Revisar os arquivos do Terraform
Revise o arquivo
main.tf
:cat main.tf
A saída será assim
Este arquivo descreve os seguintes recursos:
random_id
: é anexado ao nome do bucket do Cloud Storage para garantir um nome exclusivo.google_storage_bucket
: o bucket do Cloud Storage a ser armazenado o arquivo de estado. Esse bucket está configurado para ter as seguintes propriedades:force_destroy
é definido comofalse
para garantir que o bucket não seja excluído se houver objetos nele. Isso garante que o estado as informações armazenadas no bucket não sejam excluídas acidentalmente.public_access_prevention
é definido comoenforced
para garantir que o conteúdo do bucket não sejam expostos ao público acidentalmente.uniform_bucket_level_access
está definido comotrue
para permitir o controle do acesso ao bucket e ao conteúdo dele usando permissões do IAM em vez de listas de controle de acesso.- O
versioning
é ativado para garantir que versões anteriores do estado sejam preservadas no bucket.
local_file
: um arquivo local. O conteúdo desse arquivo instrui o Terraform a usar o bucket do Cloud Storage como back-end remoto depois que o bucket for criado.
Provisionar o bucket do Cloud Storage
Inicialize o Terraform:
terraform init
Quando você executa
terraform init
pela primeira vez, o bucket do Cloud Storage especificado no arquivomain.tf
ainda não existe, portanto, o Terraform inicializa um back-end local para armazenar o estado no sistema de arquivos local.Aplique a configuração para provisionar os recursos descritos no arquivo
main.tf
:terraform apply
Quando solicitado, digite
yes
.Quando você executa
terraform apply
pela primeira vez, o Terraform provisiona o bucket do Cloud Storage para armazenar o estado. Ele também cria um arquivo local. O conteúdo desse arquivo instrui o Terraform a usar o bucket do Cloud Storage como o back-end remoto para armazenar o estado.
Migrar o estado para o bucket do Cloud Storage
Migre o estado do Terraform para o back-end remoto do Cloud Storage:
terraform init -migrate-state
O Terraform detecta se você já tem um arquivo de estado localmente e solicita a migração do estado para o novo bucket do Cloud Storage. Quando solicitado, digite
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.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Excluir o projeto
Para evitar cobranças na sua conta Google Cloud pelos recursos usados nesta página, siga estas etapas.
Abra o arquivo
main.tf
.No recurso
google_storage_bucket.default
, atualize o valor deforce_destroy
paratrue
.Aplique a configuração atualizada:
terraform apply
Quando solicitado, digite
yes
.Exclua o arquivo de estado:
rm backend.tf
Reconfigure o back-end para ser local:
terraform init -migrate-state
Quando solicitado, digite
yes
.Execute o seguinte comando para excluir os recursos do Terraform:
terraform destroy
Quando solicitado, digite
yes
.