Terraform può importare l'infrastruttura esistente. Ciò ti consente di prendere risorse che hai creato con altri mezzi e passarle nella gestione di Terraform.
Puoi importare lo stato per qualsiasi risorsa Google Cloud.
Terraform supporta diversi modi per importare le risorse:
- Una volta alla volta utilizzando il sottocomando
terraform import
. - In blocco includendo un blocco
import
nella (richiede Terraform 1.5 o versioni successive). - In blocco utilizzando una funzionalità di Google Cloud che consente di eseguire l'importazione dopo aver eseguito un'esportazione collettiva.
Importa le risorse una alla volta
Il comando import
accetta due argomenti: indirizzo e 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
in 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'intero
, che, se supportato, include l'ID progetto.
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 un bucket Cloud Storage definito in precedenza, questo è
google_storage_bucket.sample
.Per identificare il formato dell'ID risorsa, consulta la sezione sull'importazione dei provider documentazione per la risorsa
google_storage_bucket
. In questo caso, si tratta moduloproject/name
, quindi l'ID risorsa dell'esempio precedente èsample-project/my-bucket
.Crea l'istruzione
import
utilizzando l'indirizzo e l'ID della risorsa, come che 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.
Importa 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 della risorsa, ogni risorsa all'interno di un modulo deve essere importati singolarmente.
Identificare 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 o il provider di servizi di terze parti. 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 che deve essere importato come
module.gcs_bucket.google_storage_bucket.bucket
.Per identificare il formato dell'ID risorsa, consulta la sezione sull'importazione dei provider documentazione per la risorsa
google_storage_bucket
. In questo caso, si tratta di il moduloproject/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
.Crea l'istruzione
import
utilizzando l'indirizzo e l'ID della risorsa, come che 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.
Importa le risorse in blocco con un blocco import
basato sulla configurazione
Terraform versione 1.5 consente di aggiungere un blocco import
a Terraform
configurazione. In questo modo puoi visualizzare l'anteprima delle operazioni di importazione durante plan
ed eseguita utilizzando l'operazione apply
.
Puoi anche creare automaticamente il 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 per nella documentazione del provider Google di Hashicorp. Ad esempio:
projects/{project}/global/networks/{name}
è un ID risorsa per rete VPC, come mostrato in pagina di riferimento digoogle_compute_network
.to
: la risorsa Terraform indirizzo da creare. Solitamente sotto forma 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 delle risorse, esegui terraform plan
per
visualizzare l'anteprima dell'operazione di importazione.
Se vuoi che Terraform generi automaticamente i blocchi di risorse, utilizza
-generate-config-out
per specificare il file per 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.
Importa le risorse create dopo aver eseguito un'esportazione collettiva
L'esportazione in blocco consente di esportare le risorse Google Cloud come configurazioni Terraform e importa lo stato di Terraform per queste risorse per poter gestire il deployment in Terraform.
Prima di iniziare
Preparare Cloud Shell.
Avvia Cloud Shell e imposta il progetto Google Cloud predefinito in cui vuoi generare il codice Terraform di cui è stato eseguito il deployment.
Devi eseguire questo comando una sola volta per progetto e puoi eseguirlo in qualsiasi .
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Le variabili di ambiente vengono sostituite se imposti valori espliciti in una di configurazione di Terraform.
In Cloud Shell, installa l'interfaccia a riga di comando (CLI) per Config Connector.
gcloud components install config-connector
Config Connector ti consente di utilizzare lo strumento di esportazione collettiva Terraform di Google Cloud.
Se vedi
ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation
, esegui questo comando:sudo apt-get install google-cloud-sdk-config-connector
Abilita l'API Cloud Asset.
gcloud services enable cloudasset.googleapis.com
Genera il codice Terraform per le tue risorse
Se non l'hai ancora fatto, crea la directory in cui vuoi restituisce la configurazione del progetto.
mkdir OUTPUT_DIRECTORY
Esegui
gcloud beta resource-config bulk-export
. per inviare l'intera configurazione del progetto al PercorsoOUTPUT_DIRECTORY
:gcloud beta resource-config bulk-export \ --path=OUTPUT_DIRECTORY \ --project=PROJECT_ID \ --resource-format=terraform
crea moduli Terraform dal codice generato
Esegui gcloud beta resource-config terraform
generate-import
.
che punta al contenuto della 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 rimanda a tutti i moduli dalle risorse secondarie. I contenuti di questo file hanno il seguente aspetto: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
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 import
consentono di importare i moduli creatigenerate-import
nello stato di Terraform.
Importa i moduli nello stato di Terraform
Inizializza:
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.