Terraform può importare l'infrastruttura esistente. In questo modo puoi portare le risorse che hai creato con altri mezzi sotto la gestione di Terraform.
Puoi importare lo stato per qualsiasirisorsa. Google Cloud
Terraform supporta diversi modi per importare le risorse:
- Una alla volta utilizzando il sottocomando
terraform import. - In blocco includendo un
importblocco nella configurazione (richiede Terraform versione 1.5 o successive). - In blocco utilizzando una Google Cloud funzionalità che consente di importare le risorse dopo aver eseguito un'esportazione collettiva.
Importare le risorse una alla volta
Il comando import accetta due argomenti: l'indirizzo e l'ID della risorsa.
L'indirizzo della risorsa
è un identificatore che punta a un'istanza di risorsa all'interno di una configurazione.
L'ID è un identificatore che identifica una risorsa in Google Cloud
fase di importazione. Il formato dell'ID varia in base al tipo di risorsa e
è documentato
per ogni risorsa supportata dal provider. Ti consigliamo di utilizzare l'identificatore completo, che include l'ID progetto quando è supportato.
Identifica l'indirizzo della risorsa da importare.
resource "google_storage_bucket" "sample" { name = "my-bucket" project = "sample-project" location = "US" force_destroy = true }Per una risorsa di esempio come il bucket Cloud Storage definito in precedenza, questo è
google_storage_bucket.sample.Per identificare il formato dell'ID risorsa, consulta la documentazione di importazione del provider per la risorsa
google_storage_bucket. In questo caso, ha il formatoproject/name, quindi l'ID risorsa per l'esempio precedente èsample-project/my-bucket.Costruisci l'istruzione
importutilizzando l'indirizzo e l'ID della risorsa, come segue:terraform import google_storage_bucket.sample sample-project/my-bucket
Output:
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.
Importare le risorse all'interno dei moduli
I moduli incapsulano una o più risorse all'interno di una configurazione Terraform. Poiché l'importazione richiede un indirizzo di risorsa, ogni risorsa all'interno di un modulo deve essere importata singolarmente.
Identifica le risorse all'interno di un modulo da importare.
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" }Per identificare gli indirizzi delle risorse, puoi esaminare i contenuti del modulo. In alternativa, applica la configurazione e utilizza gli errori rilevati dal provider. Ad esempio:
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,
Utilizzando il log precedente, puoi identificare l'indirizzo della risorsa da importare come
module.gcs_bucket.google_storage_bucket.bucket.Per identificare il formato dell'ID risorsa, consulta la documentazione di importazione del provider per la risorsa
google_storage_bucket. In questo caso, ha il formatoproject/name. Il nome può essere identificato dall'output del piano.Output:
module.gcs_bucket.google_storage_bucket.bucket will be created + resource "google_storage_bucket" "bucket" { + name = "my-bucket" + project = "sample-project" ... }Per l'esempio precedente, l'ID risorsa è
sample-project/my-bucket.Costruisci l'istruzione
importutilizzando l'indirizzo e l'ID della risorsa, come segue:terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
Output:
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.
Importare le risorse in blocco con un blocco import basato sulla configurazione
La versione 1.5 di Terraform consente di aggiungere un blocco import alla configurazione di Terraform. In questo modo, le operazioni di importazione possono essere visualizzate in anteprima durante l'operazione plan ed eseguite utilizzando l'operazione apply.
Puoi anche eseguire la generazione automatica del codice per le risorse importate anziché scrivere il codice manualmente.
Il blocco import accetta due parametri:
id: l'ID risorsa definito dal provider della risorsa cloud da importare.Per l'ID risorsa definito dal provider accettato, consulta la sezione Importa della risorsa nella documentazione del provider Google di Hashicorp. Ad esempio,
projects/{project}/global/networks/{name}è un ID risorsa per una rete VPC, come mostrato nellagoogle_compute_networkpagina di riferimento.to: l'indirizzo della risorsa Terraform da creare. In genere nel formato RESOURCE TYPE.NAME.
Ecco un esempio di blocco import per una rete Virtual Private Cloud:
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 hai creato manualmente il blocco di risorse, esegui terraform plan per visualizzare l'anteprima dell'operazione di importazione.
Se vuoi che Terraform generi i blocchi di risorse, utilizza il flag -generate-config-out per specificare il file in cui generare la configurazione.
Ad esempio:
terraform plan -generate-config-out=generated_resources.tf
Dopo aver esaminato il codice generato, esegui l'operazione terraform apply per importare la configurazione nello stato di Terraform.
Importare le risorse create dopo aver eseguito un'esportazione collettiva
L'esportazione collettiva consente di esportare le risorse Google Cloud come configurazioni Terraform e importare lo stato di Terraform per queste risorse in modo da poter gestire il deployment in Terraform.
Prima di iniziare
Prepara Cloud Shell.
Avvia Cloud Shell e imposta il progetto Google Cloud predefinito in cui vuoi generare il codice Terraform per le risorse di cui è stato eseguito il deployment.
Devi eseguire questo comando una sola volta per progetto e puoi eseguirlo in qualsiasi directory.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Le variabili di ambiente vengono sostituite se imposti valori espliciti in un file di configurazione Terraform.
In Cloud Shell, installa l'interfaccia a riga di comando (CLI) per Config Connector.
gcloud components install config-connector
Config Connector consente di utilizzare lo strumento di esportazione collettiva di Terraform di Google Cloud.
Se viene visualizzato
ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation, esegui invece il seguente comando:sudo apt-get install google-cloud-sdk-config-connector
Abilita l'API Cloud Asset.
gcloud services enable cloudasset.googleapis.com
Generare il codice Terraform per le risorse
Se non l'hai ancora fatto, crea la directory in cui vuoi generare la configurazione del progetto.
mkdir OUTPUT_DIRECTORY
Esegui il
gcloud beta resource-config bulk-exportcomando per generare l'intera configurazione del progetto nelOUTPUT_DIRECTORYpercorso:gcloud beta resource-config bulk-export \ --path=OUTPUT_DIRECTORY \ --project=PROJECT_ID \ --resource-format=terraform
Creare moduli Terraform dal codice generato
Esegui il gcloud beta resource-config terraform
generate-import
comando, puntando ai contenuti nella directory di output:
gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY
Questo comando genera moduli Terraform e uno script di importazione:
Il file
gcloud-export-modules.tf. Questo file punta a tutti i moduli delle risorse secondarie. Il contenuto di questo file è il seguente: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 così via.
Uno script shell eseguibile chiamato, ad esempio,
terraform_import_20220331-19-12-33.sh. Lo script shell contiene un elenco di comanditerraform 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 così via.
I comandi
terraform importservono per importare i moduli creati dal comandogenerate-importnello stato di Terraform.
Importare i moduli nello stato di Terraform
Inizializzalo:
terraform init
Esegui lo script:
./terraform_import_20220331-19-12-33.sh
Output:
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.