Importar recursos de Google Cloud al estado de Terraform

Terraform puede importar infraestructura. Esto te permite usar recursos que hayas creado de otra forma y gestionarlos con Terraform.

Puede importar el estado de cualquier Google Cloud recurso.

Terraform admite varias formas de importar recursos:

Importar recursos de uno en uno

El comando import usa dos argumentos: la dirección y el ID del 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 está importando. El formato del ID varía en función del tipo de recurso y se documenta para cada recurso admitido por el proveedor. Te recomendamos que utilices el identificador completo, que incluye el ID de proyecto cuando sea posible.

  • Identifique la dirección del recurso que se va a importar.

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

    En el caso de un recurso de ejemplo, como el segmento de Cloud Storage definido anteriormente, sería google_storage_bucket.sample.

  • Para identificar el formato del ID de recurso, consulta la documentación de importación de proveedores del recurso google_storage_bucket. En este caso, tiene el formato project/name, por lo que el ID de recurso del ejemplo anterior es sample-project/my-bucket.

  • Crea la instrucción import con la dirección y el ID del recurso, como se indica a continuación:

    terraform import google_storage_bucket.sample sample-project/my-bucket
    

    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.
    

Importar recursos en módulos

Los módulos encapsulan uno o varios recursos en una configuración de Terraform. Como la importación requiere una dirección de recurso, cada recurso de un módulo debe importarse por separado.

  • Identifica los recursos de un módulo que quieras importar.

    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 de los módulos. También puede aplicar la configuración y usar los errores que haya detectado 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,
    

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

  • Para identificar el formato del ID de recurso, consulta la documentación de importación de proveedores del recurso google_storage_bucket. En este caso, tiene la forma 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"
        ...
      }
    

    En el ejemplo anterior, el ID de recurso es sample-project/my-bucket.

  • Crea la instrucción import con la dirección y el ID del recurso, como se indica a continuación:

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    

    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.
    

Importar recursos en bloque con un bloque import basado en la configuración

La versión 1.5 de Terraform te permite añadir un bloque import a tu configuración de Terraform. Esto permite previsualizar las operaciones de importación durante la operación plan y ejecutarlas con la operación apply.

También puedes generar código automáticamente para los recursos importados en lugar de escribirlo manualmente.

El bloque import usa dos parámetros:

  • id: ID de recurso definido por el proveedor del recurso en la nube que se va a importar.

    Para ver el ID de recurso definido por el proveedor aceptado, consulta la sección Import (Importar) del recurso en la documentación del proveedor de Google de HashiCorp. Por ejemplo, projects/{project}/global/networks/{name} es un ID de recurso de una red de VPC, tal como se muestra en la google_compute_networkpágina de referencia.

  • to: la dirección del recurso de Terraform que se va a crear. Normalmente, tiene el formato RESOURCE TYPE.NAME.

Aquí tienes un ejemplo de un bloque import para una red de nube privada virtual:

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
}

Si has creado manualmente el bloque de recursos, ejecuta terraform plan para previsualizar la operación de importación.

Si quieres que Terraform genere los bloques de recursos, usa la marca -generate-config-out para especificar el archivo en el que se generará la configuración.

Por ejemplo:

 terraform plan -generate-config-out=generated_resources.tf

Después de revisar el código generado, ejecuta la operación terraform apply para importar la configuración al estado de Terraform.

Importar recursos creados después de hacer una exportación en bloque

La exportación en bloque te permite exportar Google Cloud recursos como configuraciones de Terraform e importar el estado de Terraform de esos recursos para que puedas gestionar tu implementación en Terraform.

Antes de empezar

  • Prepara Cloud Shell.

    Inicia Cloud Shell y define el proyecto Google Cloud predeterminado en el que quieras generar el código de Terraform para los recursos implementados.

    Solo tienes que ejecutar este comando una vez por proyecto y puedes hacerlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Las variables de entorno se anulan si se definen valores explícitos en un archivo de configuración de Terraform.

  • En Cloud Shell, instala la interfaz de línea de comandos (CLI) de Config Connector.

    gcloud components install config-connector
    

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

    Si ves ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation, ejecuta el siguiente comando:

    sudo apt-get install google-cloud-sdk-config-connector
    
  • Habilita la API Cloud Asset.

    gcloud services enable cloudasset.googleapis.com
    

Generar código de Terraform para tus recursos

  1. Si aún no lo has hecho, crea el directorio en el que quieras generar la configuración del proyecto.

    mkdir OUTPUT_DIRECTORY
    
  2. Ejecuta el comando gcloud beta resource-config bulk-export para mostrar toda la configuración del proyecto en la ruta OUTPUT_DIRECTORY:

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

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

Ejecuta el comando gcloud beta resource-config terraform generate-import señalando el contenido del directorio de salida:

gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY

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 recursos secundarios. El contenido de este archivo tiene este aspecto:

    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"
    }
    

    ...y así sucesivamente.

  • Una secuencia de comandos de shell ejecutable con un nombre similar a este: 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.OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    

    ...y así sucesivamente.

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

Importar 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.
    

Pasos siguientes