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:
- Uma de cada vez através do subcomando
terraform import
. - Em massa, incluindo um bloco
import
na configuração (requer a versão 1.5 ou posterior do Terraform). - Em massa, através de uma Google Cloud funcionalidade que lhe permite importar recursos depois de fazer uma exportação em massa.
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 formatoproject/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 formatoproject/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 nagoogle_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
Se ainda não o fez, crie o diretório onde quer produzir a configuração do projeto.
mkdir OUTPUT_DIRECTORY
Execute o comando
gcloud beta resource-config bulk-export
para gerar a configuração completa do projeto no caminhoOUTPUT_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 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 sucessivamente.
Os comandos
terraform import
destinam-se a importar os módulos criados pelo comandogenerate-import
para o estado do Terraform.
Importe 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.