Importa le tue risorse Google Cloud nello stato di Terraform

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Terraform può importare l'infrastruttura esistente. Questo consente di prendere le risorse che hai creato con altri mezzi e trasferirle nella gestione Terraform.

Puoi importare lo stato per qualsiasi risorsa Google Cloud.

Importa manualmente le risorse

Terraform supporta l'importazione delle risorse utilizzando il sottocomando terraform import. Il comando import accetta due argomenti: l'indirizzo e l'ID della risorsa. L'indirizzo delle risorse è un identificatore che rimanda a un'istanza di risorsa all'interno di una configurazione. L'ID è un identificatore che identifica una risorsa in Google Cloud che viene importata. 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.

Importa una risorsa

  • 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 definita in precedenza, si tratta di google_storage_bucket.sample.

  • Consulta la documentazione di importazione del provider per la risorsa google_storage_bucket per identificare il formato dell'ID risorsa. In questo caso, ha il formato project/name, quindi l'ID risorsa per l'esempio precedente è sample-project/my-bucket.

  • Crea l'istruzione di importazione utilizzando l'indirizzo e l'ID della risorsa come terraform import google_storage_bucket.sample sample-project/my-bucket, quindi eseguila.

    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 risorse all'interno dei moduli

I moduli incapsulano una o più risorse all'interno di una configurazione Terraform. Poiché l'importazione richiede un indirizzo per la risorsa, ogni risorsa all'interno di un modulo deve essere importata individualmente.

  • Identifica le risorse 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 dei moduli. 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 che deve essere importato come module.gcs_bucket.google_storage_bucket.bucket.

  • Consulta la documentazione di importazione del provider per la risorsa google_storage_bucket per identificare il formato dell'ID risorsa. In questo caso, è nel formato 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"
          ...
        }
    

    Nell'esempio precedente, l'ID risorsa è sample-project/my-bucket.

  • Crea l'istruzione di importazione utilizzando l'indirizzo e l'ID della risorsa terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket ed eseguila.

    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 create utilizzando l'esportazione collettiva

Google fornisce uno strumento che puoi utilizzare per esportare le risorse Google Cloud come configurazioni Terraform e importare lo stato Terraform per le risorse, in modo da poter gestire il tuo deployment in Terraform.

Prima di iniziare

  • Installa l'interfaccia a riga di comando gcloud per Config Connector.

    gcloud components install config-connector
    

    Config Connector permette di utilizzare lo strumento di esportazione collettiva Terraform di Google Cloud.

  • Abilitare l'API Cloud Asset.

    gcloud services enable cloudasset.googleapis.com
    
  • Assicurati che l'agente di servizio Cloud Asset gcp-sa-cloudasset.iam.gserviceaccount.com abbia il ruolo roles/servicenetworking.serviceAgent.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/servicenetworking.serviceAgent
    

    Per ottenere l'ID e il numero del progetto, vai alla console Google Cloud.

Genera codice Terraform per le risorse

Esegui il comando gcloud beta resource-config bulk-export per restituire l'intera configurazione del progetto al percorso entire-tf-output:

gcloud beta resource-config bulk-export \
  --path=entire-tf-output \
  --project=PROJECT_ID \
  --resource-format=terraform

Crea moduli Terraform dal codice generato

Esegui il comando gcloud beta resource-config terraform generate-import, puntando ai contenuti nella directory di output:

gcloud beta resource-config terraform generate-import entire-tf-output

Il comando seguente 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 "entire-tf-output-projects-PROJECT_ID-ComputeFirewall" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "entire-tf-output-projects-PROJECT_ID-ComputeBackendService-global" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeBackendService/global"
    }
    
    ...and so on
    
  • Uno script shell eseguibile denominato 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.entire-tf-output-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    
    ...and so on
    

    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