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:
- Uno a la vez mediante el subcomando
terraform import
. - De forma masiva mediante la inclusión de un bloque
import
en la configuración (requiere la versión 1.5 de Terraform o una posterior). - De forma masiva mediante una función de Google Cloud que te permite importar recursos después de realizar una exportación masiva.
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 formatoproject/name
, por lo que el ID de recurso de la muestra anterior essample-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 formatoproject/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 degoogle_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
Si aún no lo hiciste, crea el directorio en el que deseas generar la configuración del proyecto.
mkdir OUTPUT_DIRECTORY
Ejecuta el comando
gcloud beta resource-config bulk-export
para enviar la configuración completa del proyecto a la rutaOUTPUT_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 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í de forma sucesiva…
Los comandos
terraform import
sirven para importar los módulos creados por el comandogenerate-import
al estado de Terraform.
Importa 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.