Importa tus recursos de Google Cloud al estado de Terraform

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Terraform puede importar la infraestructura existente. Esto te permite tomar los recursos que creaste por otros medios y ponerlos en la administración de Terraform.

Puedes importar el estado de cualquier recurso de Google Cloud.

Importa recursos de forma manual

Terraform admite la importación de recursos mediante el subcomando terraform import. El comando import toma dos argumentos: la dirección del recurso y el ID de recurso. La dirección del recurso es un identificador que apunta a una instancia de recurso dentro de una configuración. El ID es un identificador que identifica un recurso en Google Cloud que se importa. El formato para el ID difiere según el tipo de recurso y se documenta para cada recurso que admite el proveedor. Recomendamos usar el identificador completo, que incluye el ID del proyecto cuando se admite.

Importa un recurso

  • Identifica la dirección del recurso que se importará.

    resource "google_storage_bucket" "sample" {
    name          = "my-bucket"
    project       = "sample-project"
    location      = "US"
    force_destroy = true
    }
    

    El siguiente es un recurso de muestra, como el bucket de Cloud Storage definido antes: google_storage_bucket.sample.

  • Consulta la documentación de importación del proveedor para el recurso google_storage_bucket a fin de identificar el formato del ID de recurso. En este caso, tiene el formato project/name, por lo que el ID de recurso de la muestra anterior es sample-project/my-bucket.

  • Crea la declaración de importación mediante la dirección del recurso y el ID de recurso como terraform import google_storage_bucket.sample sample-project/my-bucket y, luego, ejecútala.

    Resultado:

    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 recursos dentro de módulos

Los módulos encapsulan uno o más recursos dentro de una configuración de Terraform. Debido a que la importación requiere una dirección del recurso, cada recurso dentro de un módulo debe importarse de forma individual.

  • Identifica los recursos dentro de un módulo que se importarán.

    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 las direcciones de los recursos, puedes inspeccionar el contenido del módulo. Como alternativa, aplica la configuración y usa los errores que muestra el proveedor. Por ejemplo:

    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,
    

    Mediante el registro anterior, puedes identificar la dirección del recurso que se debe importar como module.gcs_bucket.google_storage_bucket.bucket.

  • Consulta la documentación de importación del proveedor para el recurso google_storage_bucket a fin de identificar el formato del ID de recurso. En este caso, tiene el formato project/name. El nombre se puede identificar en el resultado del plan.

    Resultado:

        module.gcs_bucket.google_storage_bucket.bucket will be created
      + resource "google_storage_bucket" "bucket" {
          + name                        = "my-bucket"
          + project                     = "sample-project"
          ...
        }
    

    Para la muestra anterior, el ID de recurso es sample-project/my-bucket.

  • Crea la declaración de importación mediante la dirección del recurso y el ID de recurso terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket y ejecútala.

    Resultado:

    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 recursos creados con la exportación de forma masiva

Google proporciona una herramienta que puedes usar para exportar los recursos de Google Cloud como opciones de configuración de Terraform y, luego, importar el estado de Terraform para esos recursos a fin de que puedas administrar la implementación en Terraform.

Antes de comenzar

  • Instala la CLI de gcloud para Config Connector.

    gcloud components install config-connector
    

    Config Connector te permite usar la herramienta de exportación masiva de Terraform de Google Cloud.

  • Habilita la API de Cloud Asset.

    gcloud services enable cloudasset.googleapis.com
    
  • Asegúrate de que el agente de servicio de Cloud Asset gcp-sa-cloudasset.iam.gserviceaccount.com tenga el rol 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
    

Genera código de Terraform para tus recursos

Ejecuta el comando gcloud beta resource-config bulk-export para enviar la configuración completa del proyecto a la ruta, entire-tf-output:

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

Crea módulos de Terraform a partir del código generado

Ejecuta el comando gcloud beta resource-config terraform generate-import apuntando al contenido en el directorio de salida:

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

Este comando genera módulos de Terraform y una secuencia de comandos de importación:

  • El archivo gcloud-export-modules.tf. Este archivo apunta a todos los módulos de los subrecursos. El contenido de este archivo se ve de la siguiente manera:

    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
    
  • Una secuencia de comandos de shell ejecutable con un nombre similar a terraform_import_20220331-19-12-33.sh. La secuencia de comandos de shell contiene una lista de comandos 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
    

    Los comandos terraform import sirven para importar los módulos creados por el comando generate-import al estado de Terraform.

Importa los módulos al estado de Terraform

  1. Inicialízalo:

    terraform init
    
  2. Ejecuta la secuencia de comandos:

    ./terraform_import_20220331-19-12-33.sh
    

    Resultado:

    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.
    

Próximos pasos