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:
- Um por vez usando o subcomando
terraform import
. - Em massa, incluindo um bloco
import
na configuração (requer versão 1.5 ou posterior do Terraform). - Em massa, usando um recurso do Google Cloud que permite importar recursos após uma exportação em massa.
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 formatoproject/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 formatoproject/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ênciagoogle_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
Se ainda não fez isso, crie o diretório onde você quer gerar a configuração do projeto:
mkdir OUTPUT_DIRECTORY
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 comandosterraform 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 comandogenerate-import
para o estado do Terraform.
Importar os módulos para o estado do Terraform
Inicialize-o:
terraform init
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.