Exportar recursos de Google Cloud al formato de Terraform

Has desplegado recursos en Google Cloudy ahora necesitas gestionar tu infraestructura como código (IaC) con Terraform. Google proporciona una herramienta que puedes usar para generar código de Terraform para los recursos de un proyecto, una carpeta o una organización.

Roles

Para obtener los permisos que necesitas para exportar recursos a Terraform, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en la organización, la carpeta o el proyecto:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

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
    
  • Crea una cuenta de servicio para usarla en esta exportación:

    gcloud beta services identity create --service=cloudasset.googleapis.com
    
  • Asegúrate de que el agente de servicio de recursos de Cloud (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 recursos de Cloud (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 se pueden exportar al formato Terraform, aunque sean compatibles con el proveedor de Google de Terraform. Para ver una lista de los tipos de recursos que se pueden exportar al formato de Terraform, ejecuta el comando gcloud beta resource-config list-resource-types.

Exportar toda la configuración del proyecto a código HCL de Terraform

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

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

Escribir la salida en una estructura de directorios

  1. Si aún no lo has hecho, crea el directorio en el que quieras 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 en la que se va a generar el código HCL.

Después de ejecutar el comando, el código HCL de cada recurso se genera en un archivo .tf independiente en la siguiente estructura de directorios:

OUTPUT_DIRECTORY/projects/PROJECT_ID/RESOURCE_TYPE

Escribir la salida en un solo archivo

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

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

Filtrar el resultado

Filtra la salida del comando de exportación en bloque especificando tipos de recursos.

Lista de los tipos de recursos admitidos por los que se va a filtrar.

Para ver una lista de los tipos de recursos que se pueden exportar al formato de Terraform, ejecuta el comando gcloud beta resource-config list-resource-types:

gcloud beta resource-config list-resource-types

También puedes escribir la salida en un archivo:

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

En la salida, el tipo de recurso de las VMs de Compute Engine se indica de la siguiente manera:

KRM KIND: ComputeInstance

Puedes ignorar el prefijo KRM KIND:.

Exportar un solo tipo de recurso

Usa una cadena, como ComputeInstance, para exportar tipos de recursos específicos de 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 va a mostrar.

Exportar varios tipos de recursos

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

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

Usar un archivo para especificar los tipos de recursos que se van a exportar

  1. Crea un directorio llamado tf-output.

    cd && mkdir tf-output && cd tf-output
    
  2. Crea un archivo llamado types.txt y añade 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 recurso de un tipo concreto, el comando se ejecutará correctamente, pero no se mostrará nada para ese tipo de recurso.

Solución de problemas

Si aparece el siguiente error:

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

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

Pasos siguientes