Importa le risorse Google Cloud nello stato di Terraform

Terraform può importare l'infrastruttura esistente. In questo modo puoi prendere le risorse che hai creato con altri mezzi e metterle sotto la gestione di Terraform.

Puoi importare lo stato di qualsiasi risorsa Google Cloud.

Terraform supporta diversi modi per importare le risorse:

Importa 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 rimanda a un'istanza della 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 ed è documentato per ogni risorsa supportata dal provider. Ti consigliamo di utilizzare l'identificatore completo, che include l'ID progetto, se 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, si tratta di google_storage_bucket.sample.

  • Per identificare il formato dell'ID risorsa, consulta la documentazione sull'importazione del provider per la risorsa google_storage_bucket. In questo caso, è del tipo project/name, quindi l'ID risorsa per il sample precedente è sample-project/my-bucket.

  • Costruisci l'istruzione import utilizzando 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 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 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 fornitore. 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 documentazione sull'importazione del provider per la risorsa google_storage_bucket. In questo caso, è del tipo project/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 import utilizzando 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 collettivamente le risorse con un blocco import basato sulla configurazione

La versione 1.5 di Terraform ti consente di aggiungere un blocco import alla configurazione Terraform. In questo modo è possibile visualizzare l'anteprima delle operazioni di importazione durante l'operazione plan e di eseguirle 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 relativa alla risorsa nella documentazione del provider Google di Hashicorp. Ad esempio, projects/{project}/global/networks/{name} è un ID risorsa per una rete VPC, come mostrato nella pagina di riferimento google_compute_network.

  • to: l'indirizzo della risorsa Terraform da creare. Di solito nella 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 di risorse, esegui terraform plan per visualizzare l'anteprima dell'operazione di importazione.

Se vuoi che sia Terraform a generare i blocchi di risorse, utilizza il flag -generate-config-out per specificare il file da 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 Terraform.

Importare le risorse create dopo un'esportazione collettiva

L'esportazione collettiva ti consente di esportare le risorse Google Cloud come configurazioni Terraform e di importare lo stato di Terraform per queste risorse in modo da poter gestire il tuo 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 farlo 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 ti 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
    

Genera il codice Terraform per le risorse

  1. Se non l'hai ancora fatto, crea la directory in cui vuoi emettere la configurazione del progetto.

    mkdir OUTPUT_DIRECTORY
    
  2. Esegui il comando gcloud beta resource-config bulk-export per visualizzare l'intera configurazione del progetto nel percorso OUTPUT_DIRECTORY:

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

Creare moduli Terraform dal codice generato

Esegui il comando gcloud beta resource-config terraform generate-import indicando i 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. I contenuti di questo file sono i seguenti:

    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 denominato ad esempio terraform_import_20220331-19-12-33.sh. Lo script shell contiene un elenco di comandi 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 così via.

    I comandi terraform import servono per importare i moduli creati dal comando generate-import nello stato di Terraform.

Importa i moduli nello stato di Terraform

  1. Inizializzalo:

    terraform init
    
  2. 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.
    

Passaggi successivi