Importa tus recursos de Google Cloud al estado de Terraform

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.

Terraform admite varias formas de importar recursos:

Importar recursos, uno a la vez

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.

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

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

  • Construye la declaración import mediante la dirección y el ID del recurso de la siguiente manera:

    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.
    

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.

  • Para identificar el formato de ID del recurso, consulta la documentación de importación del proveedor del recurso google_storage_bucket. 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.

  • Construye la declaración import mediante la dirección y el ID del recurso de la siguiente manera:

    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.
    

Importa recursos de forma masiva con un bloque import basado en la configuración

La versión 1.5 de Terraform te permite agregar un bloque import a la configuración de Terraform. Esto permite que se obtenga una vista previa de las operaciones de importación durante la operación plan y que se ejecuten con la operación apply.

También puedes realizar la generación automática de código para los recursos importados en lugar de escribir el código de forma manual.

El bloque import toma dos parámetros:

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

    Para el ID de recurso definido por el proveedor aceptado, consulta la sección Importar para el recurso en la documentación del proveedor de Google de Hashicorp. Por ejemplo, projects/{project}/global/networks/{name} es un ID de recurso para una red de VPC, como se muestra en la página de referencia de google_compute_network.

  • to: la dirección de recursos de Terraform que se creará. Por lo general, con el formato RESOURCE TYPE.NAME.

A continuación, se muestra 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 creaste el bloque de recursos de forma manual, ejecuta terraform plan para obtener una vista previa de la operación de importación.

Si deseas que Terraform genere los bloques de recursos por ti, usa la marca -generate-config-out para especificar el archivo con el que se genera 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.

Importa recursos creados después de una exportación masiva

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

Antes de comenzar

  • Prepara Cloud Shell

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

    Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

  • En Cloud Shell, instala la interfaz de línea de comandos (CLI) para 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 en su lugar:

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

    gcloud services enable cloudasset.googleapis.com
    

Genera código de Terraform para tus recursos

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

    mkdir OUTPUT_DIRECTORY
    
  2. Ejecuta el comando gcloud beta resource-config bulk-export para enviar la configuración completa del proyecto a la ruta OUTPUT_DIRECTORY:

    gcloud beta resource-config bulk-export \
       --path=OUTPUT_DIRECTORY \
       --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 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 subrecursos. El contenido de este archivo se ve de la siguiente manera:

    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í de forma sucesiva…

  • 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.OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    

    Y así de forma sucesiva…

    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