Prácticas recomendadas para convertir a Terraform
Estado
En el archivo de estado, se almacena información sobre los recursos que administra Terraform. De forma predeterminada, Terraform almacena el state de forma local en el disco. Si almacenas el estado de forma remota, puedes permitir la colaboración distribuida, proteger la información sensible y ejecutar Terraform en integración continua (CI).
Después de convertir tu plantilla de Deployment Manager a Terraform y, de manera opcional, importar los recursos, te recomendamos que sigas los pasos para almacenar el estado de forma remota en Cloud Storage.
Módulos
Si deseas reducir la complejidad, aplicar la coherencia y promover la reutilización de tu configuración, puedes usar módulos de Terraform para encapsular colecciones de recursos.
Para usar módulos, puedes realizar una de las siguientes acciones:
Crea un módulo personalizado a partir de los recursos exportados por DM Convert. Esto te brinda la mayor flexibilidad.
Usa un módulo publicado de la colección de módulos oficiales de Google Cloud o de Terraform Registry.
En la mayoría de los casos de uso, te recomendamos usar un módulo publicado.
Cómo crear un módulo personalizado
Después de convertir la configuración, identifica qué recursos deseas trasladar a un módulo.
Transfiere la configuración de esos recursos a un directorio de módulos y convierte las variables necesarias en parámetros.
En el siguiente ejemplo, se muestra cómo mover
google_bigquery_dataset
ygoogle_bigquery_table
a un módulo:# bq-module/main.tf resource "google_bigquery_dataset" "bigquerydataset" { provider = google-beta default_table_expiration_ms = 36000000 location = "us-west1" dataset_id = var.dataset_id project = var.project_id } resource "google_bigquery_table" "bigquerytable" { provider = google-beta labels = { data-source = "external" schema-type = "auto-junk" } dataset_id = var.dataset_id project = var.project_id table_id = var.table_id depends_on = [ google_bigquery_dataset.bigquerydataset ] }
# bq-module/variables.tf variable "project_id" { description = "Project ID" type = string } variable "dataset_id" { description = "Dataset ID" type = string } variable "table_id" { description = "Table ID" type = string }
En el archivo
main.tf
exportado, reemplaza la configuración original por el módulo que creaste.En el siguiente ejemplo, se muestra este reemplazo con el módulo creado en el ejemplo del paso anterior.
# main.tf module "bq" { source = "./bq-module" project_id = "PROJECT_ID" dataset_id = "bigquerydataset" table_id = "bigquerytable" }
Para inicializar el módulo local, ejecuta el siguiente comando:
terraform init
Traslada el estado de Terraform asociado con los recursos a la instancia del módulo.
Para mover el módulo del ejemplo del paso anterior, ejecuta el siguiente comando:
terraform state mv google_bigquery_dataset.bigquerydataset module.bq.google_bigquery_dataset.bigquerydataset terraform state mv google_bigquery_table.bigquerytable module.bq.google_bigquery_table.bigquerytable
Para este ejemplo, el resultado del traslado es el siguiente:
Move "google_bigquery_dataset.bigquerydataset" to "module.bq.google_bigquery_dataset.bigquerydataset" Successfully moved 1 object(s). Move "google_bigquery_table.bigquerytable" to "module.bq.google_bigquery_table.bigquerytable" Successfully moved 1 object(s).
Ejecuta el siguiente comando para validar que no haya cambiado ningún recurso:
terraform plan
El siguiente es un ejemplo del resultado que recibes después de ejecutar el comando:
No changes. Your infrastructure matches the configuration.
Cómo usar un módulo publicado
Después de convertir la configuración, identifica un módulo publicado y los recursos que deseas trasladar.
Identifica las opciones de configuración para el módulo mediante la lectura de su documentación.
Crea una instancia del módulo con tu configuración de recursos actual.
Por ejemplo, si deseas mover
google_bigquery_dataset
ygoogle_bigquery_table
al módulo de BigQuery oficial, en el siguiente ejemplo se muestra cómo se vería tu módulo:module "bq" { source = "terraform-google-modules/bigquery/google" version = "~> 5.0" project_id = "PROJECT_ID" dataset_id = "bigquerydataset" location = "us-west1" deletion_protection = true tables = [ { table_id = "bigquerytable", friendly_name = "bigquerytable" time_partitioning = null, range_partitioning = null, expiration_time = null, clustering = [], schema = null, labels = { data-source = "external" schema-type = "auto-junk" }, } ] }
Para inicializar el módulo local, ejecuta el siguiente comando:
terraform init
Lee el código fuente del módulo para identificar direcciones de recursos dentro del módulo ascendente y crea los comandos move.
terraform state mv google_bigquery_dataset.bigquerydataset module.bq.google_bigquery_dataset.main terraform state mv google_bigquery_table.bigquerytable 'module.bq.google_bigquery_table.main["bigquerytable"]'
Para ver cualquier cambio en la configuración, ejecuta el siguiente comando:
terraform plan
Si el módulo publicado que seleccionaste tiene una configuración predeterminada diferente a la de tu configuración, es posible que veas diferencias destacadas en el resultado de la ejecución del comando.
Activación
Te recomendamos que uses un sistema de integración continua (CI), como Cloud Build, Jenkins o GitHub Actions, para automatizar la ejecución de Terraform a gran escala. Para obtener más información, consulta Administra la infraestructura como código con Terraform, Cloud Build y GitOps.
Si deseas iniciar la creación de activadores y simplificar la autenticación, puedes usar el plano del lugar de trabajo de Cloud Build.
Estructuración
Cada configuración convertida de DM Convert es una configuración raíz única asignada a un único archivo de estado. No recomendamos configurar un archivo de estado único para contener una gran cantidad de recursos. Después de convertir la configuración, te recomendamos que te asegures de que la configuración nueva siga las prácticas recomendadas para los módulos raíz.