Exporta tus recursos de Google Cloud al formato de Terraform

Implementaste recursos en Google Cloud y ahora debes administrar la infraestructura como código (IaC) con Terraform. Google proporciona una herramienta que puedes usar para generar código de Terraform en relación con recursos en un proyecto, organización o carpeta.

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
    
  • Asegúrate de que el agente de servicio de Cloud Asset (gcp-sa-cloudasset.iam.gserviceaccount.com) tenga el rol roles/servicenetworking.serviceAgent:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/servicenetworking.serviceAgent
    
  • Asegúrate de que el agente de servicio de Cloud Asset (gcp-sa-cloudasset.iam.gserviceaccount.com) tenga el rol roles/storage.objectAdmin:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/storage.objectAdmin
    

Limitaciones

Algunos tipos de recursos no son compatibles con la exportación al formato de Terraform, aunque sí son compatibles con el proveedor de Terraform de Google. A fin de obtener una lista de los tipos de recursos admitidos para la exportación al formato de Terraform, ejecuta el comando gcloud beta resource-config list-resource-types.

Exporta toda la configuración del proyecto al código de HCL de Terraform

Con el comando gcloud beta resource-config bulk-export --resource-format=terraform, se exportan los recursos configurados en el proyecto, la carpeta o la organización y, luego, los imprime en la pantalla en formato de código HCL.

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

Escribe el resultado en una estructura de directorios

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

    mkdir OUTPUT_DIRECTORY
    
  2. Exporta toda la configuración del proyecto al directorio:

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

    La marca --path especifica la ubicación para generar el código HCL.

Después de ejecutar el comando, el código HCL para cada recurso se envía a un archivo .tf separado en la siguiente estructura de directorios:

OUTPUT_DIRECTORY/projects/PROJECT_ID/RESOURCE_TYPE

Escribe el resultado en un solo archivo

Si no deseas imprimir el resultado en la pantalla ni crear archivos .tf separados, puedes escribir todo el resultado en un solo archivo, como se muestra en este ejemplo:

gcloud beta resource-config bulk-export --resource-format=terraform >> gcp_resources.tf

Filtra el resultado

Filtra el resultado del comando de exportación masiva mediante la especificación de los tipos de recursos.

Enumera los tipos de recursos admitidos para filtrar

A fin de obtener una lista de los tipos de recursos admitidos para la exportación al formato de Terraform, ejecuta el comando gcloud beta resource-config list-resource-types:

gcloud beta resource-config list-resource-types

De manera opcional, escribe el resultado en un archivo:

gcloud beta resource-config list-resource-types >> strings.txt

En la salida, el tipo de recurso de las VM de Compute Engine aparece de la siguiente forma:

KRM KIND: ComputeInstance

Puedes ignorar el prefijo KRM KIND:.

Exporta un solo tipo de recurso

Usa una string, como ComputeInstance, a fin de exportar tipos de recursos específicos para tu proyecto en formato de código HCL:

gcloud beta resource-config bulk-export \
  --resource-types=RESOURCE_TYPE \
  --project=PROJECT_ID \
  --resource-format=terraform

La marca --resource-types especifica el tipo de recurso que se mostrará.

Exporta varios tipos de recursos

Exporta instancias de VM y reglas de firewall en formato de código HCL:

gcloud beta resource-config bulk-export \
  --resource-types=ComputeFirewall,ComputeInstance \
  --project=PROJECT_ID \
  --resource-format=terraform

Usa un archivo a fin de especificar los tipos de recursos que deseas exportar

  1. Crea un directorio llamado tf-output.

    cd && mkdir tf-output && cd tf-output
    
  2. Crea un archivo llamado types.txt y agrega una lista de tipos de recursos. Por ejemplo:

    ComputeBackendBucket
    ComputeBackendService
    ComputeForwardingRule
    
  3. Ejecuta el comando gcloud beta resource-config bulk-export con la marca --resource-types-file:

    gcloud beta resource-config bulk-export \
     --resource-types-file=types.txt \
     --path=tf-output \
     --project=PROJECT_ID \
     --resource-format=terraform
    

Si el proyecto no contiene ningún tipo de recurso en particular, el comando funciona correctamente, pero no se muestra nada para ese tipo de recurso.

Soluciona problemas

Si ves el siguiente error, haz lo siguiente:

“Permiso denegado durante la exportación. Asegúrate de que la API de Cloud Asset Inventory esté habilitada”.

Asegúrate de haber seguido las instrucciones de la sección Antes de comenzar.

Próximos pasos