Conéctate a Cloud SQL: Compute Engine, IP privada y proxy de Cloud SQL

1. Introducción

Última actualización: 2021-05-06

Consideraciones sobre la conexión

Existen muchos tipos de aplicaciones y frameworks. En este codelab, explicaremos cómo conectarse a Cloud SQL desde una aplicación que se ejecuta en una máquina virtual administrada en Google Compute Engine a través de una dirección IP privada interna con el proxy de Cloud SQL. Esta es una forma increíblemente segura de ejecutar una aplicación con estado en la nube. Minimizarás tu exposición a Internet, ya que solo usarás una IP privada y el proxy de SQL, que controla la conectividad SSL por ti.

Un caso de uso común sería, por ejemplo, una aplicación local que se trasladó para ejecutarse en la nube en lugar de hacerlo de forma local.

Qué compilarás

Este codelab es muy minimalista. La idea es guiarte por los aspectos básicos de la conexión, sin pensar demasiado en la aplicación en sí. En un mundo perfecto, conectarse a Cloud SQL sería igual que conectarse a cualquier otra instancia de una base de datos SQL, por lo que deberías poder tomar lo que crees en este codelab y aplicarlo a cualquier aplicación de producción.

Las instrucciones incluirán una guía para realizar las tareas en la consola de GCP, así como los equivalentes de los comandos de gcloud para usar en la CLI o la automatización.

Estos son los pasos individuales:

  • Crea una cuenta de servicio mínima para habilitar la conexión a la instancia de Cloud SQL
  • Crea una VM en Google Compute Engine (GCE)
  • Crea una instancia de Cloud SQL (en este instructivo, se usa Postgres, pero funciona de manera similar para MySQL o SQL Server).
  • Descarga y ejecuta el proxy de Cloud SQL en la instancia de GCE

Requisitos

  • Una cuenta de GCP en la que tengas permisos para habilitar APIs y crear servicios

2. Crea una cuenta de servicio

Las cuentas de servicio se usan para otorgar permisos a fin de usar distintos servicios dentro de tu proyecto de GCP. En este codelab, necesitamos uno para otorgar permiso al proxy de Cloud SQL para conectarse a nuestra instancia de Cloud SQL.

En la consola

Ve a la página de cuentas de servicio de IAM y haz clic en el botón f8393a08b37a422c.png que se encuentra en la parte superior de la página.

Asigna un nombre y un ID únicos a tu cuenta de servicio y haz clic en CREAR.

En la página siguiente, haz clic en el menú desplegable Seleccionar un rol. Filtra por "Cloud SQL" y selecciona el rol Cliente de Cloud SQL. Haz clic en CONTINUE.

Haz clic en LISTO.

Usa gcloud

Crea la cuenta de servicio:

gcloud iam service-accounts create <SERVICE_ACCOUNT_NAME> --display-name "<SERVICE_ACCOUNT_NAME> service account"

Esto crea la cuenta de servicio, pero actualmente no tiene ningún rol ni permiso asignado. Para asignar el rol adecuado, ejecuta el siguiente comando:

gcloud projects add-iam-policy-binding <GCP PROJECT ID> --member serviceAccount:<SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com --role roles/cloudsql.client

Por ejemplo, si tu cuenta de servicio se llama sa-test cuando la creaste y tu proyecto es my-project-test, el comando sería el siguiente:

gcloud projects add-iam-policy-binding my-project-test --member serviceAccount:sa-test@my-project-test.iam.gserviceaccount.com --role roles/cloudsql.client
gcloud iam service-accounts keys create service-account.json --iam-account <SERVICE_ACCOUNT_NAME>@<GCP PROJECT ID>.iam.gserviceaccount.com

3. Crea la VM de Compute Engine

Google Compute Engine es el servicio administrado en el que se ejecutará la máquina virtual que contendrá la aplicación desde la que queremos conectarnos. En este codelab, no compilaremos una aplicación, pero confirmaremos la conectividad ejecutando psql.

En la consola

Ve a la página de Google Compute Engine y haz clic en el botón 77c46cd1f51bed5c.png.

Aquí hay muchas opciones. Lo único que debes hacer es lo siguiente:

  1. Asigna un nombre a tu instancia
  2. Cambia Machine type a f1-micro.
  3. En Identidad y acceso a la API, cambia el menú desplegable de Service account de Default compute service account al que creaste en el paso anterior.
  4. Haz clic en Crear en la parte inferior de la página.

Usa gcloud

La cuenta de servicio es el nombre completo de la cuenta de servicio que creaste antes, por lo que tendrá el formato <NAME>@<PROJECT>.iam.gserviceaccount.com.

gcloud compute instances create <INSTANCE NAME> --machine-type=f1-micro --zone=us-central1-b --service-account=<SERVICE ACCOUNT FULL NAME>
gcloud compute zones list

4. Crea la instancia de Cloud SQL

Cloud SQL es nuestra oferta de bases de datos relacionales administradas. Admite MySQL, PostgreSQL y SQL Server. En este codelab, crearemos una base de datos de Postgres, pero las instrucciones son similares para las tres.

En la consola

Ve a la página Cloud SQL y haz clic en el botón 241836b315e11bf5.png.

Como mencioné, la mayor parte de este codelab es genérica para cualquier variante de SQL, pero para este codelab, elige PostgreSQL.

  1. Asigna un ID a tu instancia
  2. Ingresa una contraseña para el usuario predeterminado (el nombre de usuario será el predeterminado para la BD seleccionada, p. ej., root para MySQL o postgres para PostgreSQL).
  3. Si cambiaste la región de tu instancia de procesamiento, también debes cambiarla aquí para que coincida.
  4. Desplázate hacia abajo y haz clic en show configuration options.
  5. Expande la sección Connectivity.
  6. Desmarca la opción de Public IP y marca la casilla de verificación de Private IP.
  7. Asegúrate de que default esté seleccionado en el menú desplegable que aparece cuando se marca IP privada.
  8. Desplázate hacia abajo y haz clic en Crear.

Por lo general, la instancia tarda un par de minutos en iniciarse.

Usa gcloud

Como no tenemos ninguna instrucción agradable para habilitar las APIs desde aquí, tendremos que hacerlo de forma manual.

gcloud services enable servicenetworking.googleapis.com

A continuación, debemos habilitar la conectividad de servicio privada en nuestra red de VPC predeterminada. El primer paso para hacerlo es asignar un rango con nombre de direcciones IP para usar en nuestra instancia.

gcloud compute addresses create sql-codelab-allocation --global --purpose=VPC_PEERING --prefix-length=24 --network=default

A continuación, asignaremos ese rango de IPs a nuestros servicios internos (esto tarda aproximadamente un minuto).

gcloud services vpc-peerings update --service=servicenetworking.googleapis.com  --network=default     --project=<PROJECT ID> --ranges=sql-codelab-allocation --force

Por último, la creación de la instancia solo está disponible actualmente con la versión beta. La combinación de --no-assign-ip y --network=default es lo que habilita la conectividad de IP privada. En este momento, no es posible habilitar la IP privada y la IP pública al mismo tiempo, por lo que, si necesitas acceso público, deberás editar la instancia después de crearla. Este proceso tarda unos minutos en completarse.

gcloud beta sql instances create test-sql-codelab-00 --no-assign-ip --database-version=POSTGRES_11 --tier=db-f1-micro --region=us-central1 --network=default --root-password=<PASSWORD>

5. Configura y ejecuta el proxy de Cloud SQL

Una vez que nos conectemos a la VM, necesitaremos una cadena de conexión de la instancia. Primero, obtendremos esa información y, luego, nos conectaremos a la VM a través de SSH. Las instrucciones para estas partes se encontrarán en sus respectivas secciones para la consola y gcloud, y el resto serán comandos que se ejecutan desde el shell en la VM en su propia sección.

En la consola

Ve aquí y haz clic en el nombre de tu instancia de Cloud SQL.

Desplázate un poco hacia abajo y copia el Connection name en algún lugar para usarlo más adelante.

Ve a la página de la lista de instancias de Google Compute Engine y busca la fila con tu VM.

En la columna Connect, haz clic en el botón SSH para abrir una ventana separada que se conecte de forma segura a la máquina virtual.

Omite la sección Using gcloud para el resto de las instrucciones, ya que son las mismas para ambos.

Usa gcloud

Reemplaza <INSTANCE NAME> por el nombre de tu instancia de Cloud SQL:

gcloud sql instances describe <INSTANCE NAME> | grep connectionName

Guarda el nombre de conexión de la instancia para usarlo más adelante.

Deberás reemplazar <ZONE> por la zona que se usó cuando creaste la instancia. Si no lo cambiaste, se estableció en us-central1-b. También reemplaza <INSTANCE_NAME> por lo que especificaste antes.

gcloud compute ssh --zone <ZONE> <INSTANCE_NAME>

Una vez que te conectes a la VM

Primero, debemos descargar el proxy. Depende de tu sistema operativo. Si no cambiaste el SO durante la creación de la VM, será Linux y podrás usar lo siguiente:

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy

Si cambiaste el sistema operativo, puedes ir aquí para obtener el comando correcto para tu SO.

Para ejecutar el proxy, toma el nombre de conexión de la instancia que copiaste de los detalles de la instancia de Cloud SQL para reemplazar <INSTANCE_CONNECTION_NAME>. Ten en cuenta también que el número de puerto TCP puede cambiar si no usas una base de datos de Postgres o si cambiaste el puerto predeterminado en el que escucha la base de datos.

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

6. Prueba la conexión y finaliza el proceso

Como se mencionó anteriormente, si tienes una aplicación que deseas ejecutar en la instancia de GCE para probarla, también está bien. En este codelab, instalaremos psql y usaremos ese cliente para verificar que podemos conectarnos a nuestra base de datos.

En la sesión SSH de la VM, haz lo siguiente:

sudo apt-get install postgresql-client
psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

Luego, especifica la contraseña del usuario predeterminado que configuraste cuando creaste la instancia de Cloud SQL.

¡Felicitaciones! Si todo salió bien, deberías tener el mensaje de Postgres y poder ejecutar comandos en tu base de datos.

¿Qué sigue?

Consulta algunos codelabs sobre los siguientes temas:

Documentos de referencia