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:
- De uno en uno con el subcomando
terraform import
. - De forma masiva: incluye un bloque
import
en la configuración (requiere Terraform 1.5 o una versión posterior). - En bloque mediante una Google Cloud función que te permite importar recursos después de hacer una exportación en bloque.
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 formatoproject/name
, por lo que el ID de recurso del ejemplo anterior essample-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 formaproject/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 lagoogle_compute_network
pá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
Si aún no lo has hecho, crea el directorio en el que quieras generar la configuración del proyecto.
mkdir OUTPUT_DIRECTORY
Ejecuta el comando
gcloud beta resource-config bulk-export
para mostrar toda la configuración del proyecto en la rutaOUTPUT_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 comandosterraform 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 comandogenerate-import
al estado de Terraform.
Importar los módulos al estado de Terraform
Inicialízalo:
terraform init
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.