Importe os seus recursos Google Cloud para o estado do Terraform

O Terraform pode importar infraestrutura existente. Isto permite-lhe usar recursos que criou por outros meios e colocá-los sob a gestão do Terraform.

Pode importar o estado de qualquer recurso Google Cloud .

O Terraform suporta várias formas de importar recursos:

Importe recursos um de cada vez

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 numa configuração. O ID é um identificador que identifica um recurso no ficheiro CSV que está a ser importado. Google CloudO formato do ID difere consoante o tipo de recurso e está documentado para cada recurso suportado pelo fornecedor. Recomendamos que use o identificador completo, que inclui o ID do projeto quando suportado.

  • Identifique a morada do recurso a importar.

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

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

  • Para identificar o formato do ID do recurso, consulte a documentação de importação do fornecedor para o recurso google_storage_bucket. Neste caso, tem o formato project/name, pelo que o ID do recurso para o exemplo anterior é sample-project/my-bucket.

  • Construa a declaraçã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.
    

Importe recursos nos módulos

Os módulos encapsulam um ou mais recursos numa configuração do Terraform. Uma vez que a importação requer um endereço de recurso, cada recurso num módulo tem de ser importado individualmente.

  • Identifique os recursos num módulo a importar.

    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 os endereços dos recursos, pode inspecionar o conteúdo do módulo. Em alternativa, aplique a configuração e use os erros apresentados pelo fornecedor. Por 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 registo anterior, pode identificar o endereço do recurso que tem de 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 fornecedor para o recurso google_storage_bucket. Neste caso, tem o formato project/name. O nome pode ser identificado a partir do resultado 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"
        ...
      }
    

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

  • Construa a declaraçã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 import bloco baseado na configuração

A versão 1.5 do Terraform permite-lhe adicionar um bloco import à sua configuração do Terraform. Isto permite que as operações de importação sejam pré-visualizadas durante a operação plan e executadas através da operação apply.

Também pode 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 definido pelo fornecedor do recurso da nuvem a ser importado.

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

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

Segue-se 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 criou manualmente o bloco de recursos, execute terraform plan para pré-visualizar a operação de importação.

Se quiser que o Terraform gere os blocos de recursos por si, use a flag -generate-config-out para especificar o ficheiro para gerar a configuração.

Por exemplo:

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

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

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

A exportação em massa permite-lhe exportar Google Cloud recursos como configurações do Terraform e importar o estado do Terraform para esses recursos para que possa gerir a sua implementação no Terraform.

Antes de começar

  • Prepare o Cloud Shell.

    Inicie o Cloud Shell e defina o projeto Google Cloud predefinido onde quer gerar código do Terraform para os recursos implementados.

    Só tem de executar este comando uma vez por projeto e pode executá-lo em qualquer diretório.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    As variáveis de ambiente são substituídas se definir valores explícitos num ficheiro de configuração do Terraform.

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

    gcloud components install config-connector
    

    O Config Connector permite-lhe usar a ferramenta de exportação em massa do Terraform Google Cloud.

    Se 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 em alternativa:

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

    gcloud services enable cloudasset.googleapis.com
    

Gere código Terraform para os seus recursos

  1. Se ainda não o fez, crie o diretório onde quer produzir a configuração do projeto.

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

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

Crie 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 ficheiro gcloud-export-modules.tf. Este ficheiro aponta para todos os módulos dos sub-recursos. O conteúdo deste ficheiro tem o seguinte aspeto:

    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 sucessivamente.

  • Um script de shell executável com um nome semelhante a 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 sucessivamente.

    Os comandos terraform import destinam-se a importar os módulos criados pelo comando generate-import para o estado do Terraform.

Importe 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.
    

Passos seguintes