Exportar recursos do Google Cloud para o formato Terraform

Você implantou recursos no Google Cloud e agora precisa gerenciar a infraestrutura como código (IaC, na sigla em inglês) com o Terraform. O Google oferece uma ferramenta que pode ser usada para gerar o código do Terraform para recursos em um projeto, uma pasta ou organização.

Antes de começar

  • Preparar o Cloud Shell

    Inicie o Cloud Shell e defina o projeto padrão do Google Cloud em que você quer gerar o código do Terraform para os recursos implantados.

    Você só precisa executar esse comando uma vez por projeto, e ele pode ser executado em qualquer diretório.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    As variáveis de ambiente serão substituídas se você definir valores explícitos no arquivo de configuração do Terraform.

  • No Cloud Shell, instale a interface de linha de comando (CLI) para o Config Connector.

    gcloud components install config-connector
    

    O Config Connector permite que você use a ferramenta de exportação em massa do Terraform do Google Cloud.

    Se você vir ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation, execute o seguinte comando:

    sudo apt-get install google-cloud-sdk-config-connector
    
  • Ative a API Cloud Asset.

    gcloud services enable cloudasset.googleapis.com
    
  • Crie uma conta de serviço para usar nessa exportação:

    gcloud beta services identity create --service=cloudasset.googleapis.com
    
  • Verifique se o Agente de serviço de recursos do Cloud (gcp-sa-cloudasset.iam.gserviceaccount.com) tem o papel roles/servicenetworking.serviceAgent:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/servicenetworking.serviceAgent
    
  • Verifique se o Agente de serviço de recursos do Cloud (gcp-sa-cloudasset.iam.gserviceaccount.com) tem o papel roles/storage.objectAdmin:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/storage.objectAdmin
    

Limitações

Alguns tipos de recursos não são compatíveis com a exportação para o formato do Terraform, mesmo que sejam compatíveis com o provedor do Terraform do Google. Para consultar uma lista de tipos de recursos compatíveis com a exportação para o formato do Terraform, execute o comando gcloud beta resource-config list-resource-types.

Exportar toda a configuração do projeto para o código HCL do Terraform

O comando gcloud beta resource-config bulk-export --resource-format=terraform exporta os recursos configurados no projeto, na pasta ou na organização e os exibe na tela no formato do código HCL.

gcloud beta resource-config bulk-export \
  --project=PROJECT_ID \
  --resource-format=terraform

Gravar a saída em uma estrutura de diretórios

  1. Se ainda não fez isso, crie o diretório onde você quer gerar a configuração do projeto:

    mkdir OUTPUT_DIRECTORY
    
  2. Exporte toda a configuração do projeto para o diretório:

    gcloud beta resource-config bulk-export \
     --path=OUTPUT_DIRECTORY \
     --project=PROJECT_ID \
     --resource-format=terraform
    

    A sinalização --path especifica a localização para gerar o código HCL.

Depois de executar o comando, o código HCL de cada recurso é enviado para um arquivo .tf separado na seguinte estrutura de diretório:

OUTPUT_DIRECTORY/projects/PROJECT_ID/RESOURCE_TYPE

Gravar a saída em um único arquivo

Se você não quiser imprimir a saída na tela ou criar arquivos .tf separados, grave toda a saída em um único arquivo, conforme mostrado neste exemplo:

gcloud beta resource-config bulk-export \
  --resource-format=terraform \
  --project=PROJECT_ID \
  >> gcp_resources.tf

Filtrar a saída

Filtre a saída do comando de exportação em massa especificando tipos de recurso.

Listar os tipos de recursos suportados para filtrar

Para consultar uma lista de tipos de recursos compatíveis com a exportação para o formato do Terraform, execute o comando gcloud beta resource-config list-resource-types:

gcloud beta resource-config list-resource-types

Como opção, grave a saída em um arquivo:

gcloud beta resource-config list-resource-types >> strings.txt

Na saída, o tipo de recurso para as VMs do Compute Engine é listado como:

KRM KIND: ComputeInstance

Ignore o prefixo KRM KIND:.

Exportar um único tipo de recurso

Use uma string, como ComputeInstance, para exportar tipos de recursos específicos para seu projeto no formato de código HCL:

gcloud beta resource-config bulk-export \
  --resource-types=RESOURCE_TYPE \
  --project=PROJECT_ID \
  --resource-format=terraform

A sinalização --resource-types especifica o tipo de recurso a ser gerado.

Exportar vários tipos de recursos

Exporte instâncias de VM e regras de firewall no formato de código HCL:

gcloud beta resource-config bulk-export \
  --resource-types=ComputeFirewall,ComputeInstance \
  --project=PROJECT_ID \
  --resource-format=terraform

Usar um arquivo para especificar os tipos de recursos a serem exportados

  1. Crie um diretório chamado tf-output.

    cd && mkdir tf-output && cd tf-output
    
  2. Crie um arquivo chamado types.txt e adicione uma lista de tipos de recursos. Exemplo:

    ComputeBackendBucket
    ComputeBackendService
    ComputeForwardingRule
    
  3. Execute o comando gcloud beta resource-config bulk-export com a sinalização --resource-types-file.

    gcloud beta resource-config bulk-export \
     --resource-types-file=types.txt \
     --path=tf-output \
     --project=PROJECT_ID \
     --resource-format=terraform
    

Se o projeto não tiver nenhum tipo de recurso específico, o comando será bem-sucedido, mas nada será gerado para esse tipo de recurso.

Solução de problemas

Caso aconteça o seguinte erro:

"Permissão negada durante a exportação. Verifique se a API de Inventário de recursos do Cloud está ativada."

Verifique se você seguiu as instruções na seção Antes de começar.

Próximas etapas