Importar recursos do Google Cloud para o estado do Terraform

O Terraform pode importar a infraestrutura atual. Isso permite que você use recursos criados por outros meios e os transfira para o gerenciamento do Terraform.

É possível importar o estado de qualquer recurso do Google Cloud.

O Terraform é compatível com várias maneiras de importar recursos:

Importar recursos individualmente

O comando import usa dois argumentos: o endereço e o ID do recurso. O endereço do recurso é um identificador que aponta para uma instância de recurso em uma configuração. O ID é um identificador de um recurso do Google Cloud que está sendo importado. O formato do ID é diferente com base no tipo de recurso e é documentado para cada recurso compatível com o provedor. Recomendamos o uso do identificador completo, que inclui o ID do projeto quando compatível.

  • Identifique o endereço do recurso que será importado.

    resource "google_storage_bucket" "sample" {
     name          = "my-bucket"
     project       = "sample-project"
     location      = "US"
     force_destroy = true
    }
    

    Para um exemplo de recurso, como o bucket do Cloud Storage definido anteriormente, ele é google_storage_bucket.sample.

  • Para identificar o formato do ID do recurso, consulte a documentação de importação do provedor sobre o recurso google_storage_bucket. Nesse caso, ele está no formato project/name, portanto, o ID do recurso para o exemplo anterior é sample-project/my-bucket.

  • Crie a instrução import usando o endereço e o ID do recurso, da seguinte forma:

    terraform import google_storage_bucket.sample sample-project/my-bucket
    

    Saída:

    terraform import google_storage_bucket.sample sample-project/my-bucket
    google_storage_bucket.sample: Importing from ID "sample-project/my-bucket"...
    google_storage_bucket.sample: Import prepared!
    Prepared google_storage_bucket for import
    google_storage_bucket.sample: Refreshing state... [id=sample-project/my-bucket]
    Import successful!
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

Importar recursos dentro de módulos

Os módulos encapsulam um ou mais recursos em uma configuração do Terraform. Como a importação exige um endereço de recurso, cada recurso dentro de um módulo precisa ser importado individualmente.

  • Identifique os recursos em um módulo que serão importados.

    module "gcs_bucket" {
     source  = "terraform-google-modules/cloud-storage/google//modules/simple_bucket"
     version = "~> 3.4"
    
     name       = "my-bucket"
     project_id = "sample-project"
     location   = "us-east1"
    }
    

    Para identificar endereços de recursos, inspecione o conteúdo do módulo. Como alternativa, aplique a configuração e use os erros exibidos pelo provedor. Exemplo:

    terraform apply
    module.gcs_bucket.google_storage_bucket.bucket: Creating...
    ╷
    │ Error: googleapi: Error 409: Your previous request to create the named bucket succeeded and you already own it., conflict
    │
    │   with module.gcs_bucket.google_storage_bucket.bucket,
    

    Ao usar o registro anterior, é possível identificar o endereço do recurso que precisa ser importado como module.gcs_bucket.google_storage_bucket.bucket.

  • Para identificar o formato do ID do recurso, consulte a documentação de importação do provedor sobre o recurso google_storage_bucket. Nesse caso, ele está no formato project/name. O nome pode ser identificado na saída do plano.

    Saída:

    module.gcs_bucket.google_storage_bucket.bucket will be created
    + resource "google_storage_bucket" "bucket" {
        + name                        = "my-bucket"
        + project                     = "sample-project"
        ...
      }
    

    No exemplo anterior, o ID do recurso é sample-project/my-bucket.

  • Crie a instrução import usando o endereço e o ID do recurso, da seguinte forma:

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    

    Saída:

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    module.gcs_bucket.google_storage_bucket.bucket: Importing from ID "sample-project/my-bucket"...
    module.gcs_bucket.google_storage_bucket.bucket: Import prepared!
    Prepared google_storage_bucket for import
    module.gcs_bucket.google_storage_bucket.bucket: Refreshing state... [id=sample-project/my-bucket]
    Import successful!
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

Importe recursos em massa com um bloco import orientado para a configuração

O Terraform versão 1.5 permite adicionar um bloco import à configuração do Terraform. Isso permite que as operações de importação sejam visualizadas durante a operação plan e executadas usando a operação apply.

Também é possível fazer a geração automática de código para recursos importados em vez de escrever o código manualmente.

O bloco import usa dois parâmetros:

  • id: o ID do recurso da nuvem definido pelo provedor para o recurso a ser importado.

    Para o código de recurso definido pelo provedor aceito, consulte a seção Importar do recurso na documentação do provedor do Google da Hashicorp. Por exemplo, projects/{project}/global/networks/{name} é um ID de recurso para uma rede VPC, conforme mostrado na página de referência google_compute_network.

  • to: o endereço de recurso do Terraform a ser criado. Normalmente no formato RESOURCE TYPE.NAME.

Veja um exemplo de um bloco import para uma rede de nuvem privada virtual:

import {
  # Provider-defined resource ID of the cloud resource to be imported
  id = "projects/PROJECT_ID/global/networks/my-network"

  # Terraform resource address to be created
  to = google_compute_network.my_network
}

Se você tiver criado manualmente o bloco de recursos, execute terraform plan para visualizar a operação de importação.

Se você quiser que o Terraform gere os blocos de recursos, use a sinalização -generate-config-out para especificar o arquivo que gerará a configuração.

Exemplo:

 terraform plan -generate-config-out=generated_resources.tf

Depois de revisar o código gerado, execute a operação terraform apply para importar a configuração para o estado do Terraform.

Importar recursos criados após uma exportação em massa

A exportação em massa permite exportar recursos do Google Cloud como configurações do Terraform e importar o estado do Terraform para esses recursos para que você possa gerenciar a implantação no Terraform.

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
    

Gerar código do Terraform para seus recursos

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

    mkdir OUTPUT_DIRECTORY
    
  2. Execute o comando gcloud beta resource-config bulk-export para gerar a configuração inteira do projeto para o caminho: OUTPUT_DIRECTORY:

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

Criar módulos do Terraform a partir do código gerado

Execute o comando gcloud beta resource-config terraform generate-import, apontando para o conteúdo no diretório de saída:

gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY

Este comando gera módulos do Terraform e um script de importação:

  • O arquivo gcloud-export-modules.tf. Esse arquivo aponta para todos os módulos dos sub-recursos. O conteúdo do arquivo é assim:

    provider "google" {
     project = "PROJECT_ID"
    }
    
    module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall" {
     source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeBackendService-global" {
     source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeBackendService/global"
    }
    

    E assim por diante.

  • Um script de shell executável chamado terraform_import_20220331-19-12-33.sh. O script de shell contém uma lista de comandos terraform import:

    #!/bin/sh
    # Terraform Import Script generated by gcloud cli
    
    terraform import module.OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    

    E assim por diante.

    Os comandos terraform import são usados para importar os módulos criados pelo comando generate-import para o estado do Terraform.

Importar os módulos para o estado do Terraform

  1. Inicialize-o:

    terraform init
    
  2. Execute o script:

    ./terraform_import_20220331-19-12-33.sh
    

    Saída:

    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Importing from ID
    "projects/PROJECT_ID/zones/us-central1-a/instances/instance-1"...
    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Import prepared!
     Prepared google_compute_instance for import
    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Refreshing state...
    [id=projects/PROJECT_ID/zones/us-central1-a/instances/instance-1]
    
    Import successful!
    
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

Próximas etapas