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

1. Introducción

Última actualización: 6/5/2021

Piensa en la conexión

Existen muchos tipos de aplicaciones y frameworks. En este codelab, analizaremos la conexión a Cloud SQL desde una aplicación que se ejecuta en una máquina virtual administrada en Google Compute Engine mediante una dirección IP privada interna con el proxy de Cloud SQL. Esta es una forma muy segura de ejecutar una aplicación con estado en la nube. Estás minimizando la exposición a Internet restringiendo al uso exclusivo de una IP privada y del proxy de SQL que controla la conectividad SSL por ti.

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

Qué compilarás

Este codelab es muy minimalista. La idea es explicarte los detalles de la pieza de conexión, sin pensar demasiado en la aplicación en sí. En un mundo ideal, conectarse a Cloud SQL es como conectarse a cualquier otra instancia de una base de datos SQL, por lo que deberías poder aplicar lo que creaste en este codelab y aplicarlo a cualquier aplicación de producción.

Las instrucciones incluirán una explicación sobre cómo realizar las tareas en GCP Console y también los equivalentes de comandos de gcloud para usar en la CLI o la automatización.

Los pasos individuales son los siguientes:

  • 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 las 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 otorgarle al proxy de Cloud SQL permiso de 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 Selecciona un rol. Filtra por "Cloud SQL" y selecciona el rol de 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, por el momento, no tiene ningún rol o 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

P.ej., 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 ejecutaremos psql para confirmar la conectividad.

En la consola

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

Aquí hay muchas opciones, pero 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 por el 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 anteriormente, por lo que tendrá el siguiente 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 Postgres, pero las instrucciones son similares para los 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érico 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 de la base de datos seleccionada, p.ej., root para MySQL o postgres para PostgreSQL)
  3. Si cambiaste la región de la instancia de procesamiento, también deberías cambiar la región para que coincida.
  4. Desplázate hacia abajo y haz clic en la show configuration options.
  5. Expandir la sección Connectivity
  6. Desmarca la opción Public IP y marca la casilla de verificación Private IP.
  7. Asegúrate de que default esté seleccionado en el menú desplegable que aparece cuando se marcó la IP privada.
  8. Desplázate hacia abajo y haz clic en Crear.

Por lo general, la instancia tarda unos minutos en iniciarse.

Usa gcloud

Como no tenemos instrucciones útiles para habilitar las APIs desde aquí, tendremos que hacerlo manualmente.

gcloud services enable servicenetworking.googleapis.com

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

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

A continuación, asignaremos ese rango de IP a nuestros servicios internos (esto toma alrededor de 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 en 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 hay forma de 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 instancia. Primero lo tomaremos y, luego, nos conectaremos a la VM mediante SSH. Las instrucciones para estas partes se encontrarán en las secciones correspondientes de Console frente a gcloud. Luego, el resto serán comandos ejecutados desde la shell de 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 alguna parte 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 y se abrirá una ventana separada que se conecta de forma segura a la máquina virtual.

Pasa la sección Using gcloud para el resto de las instrucciones, ya que es igual para ambas.

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 tarde.

Deberás reemplazar <ZONE> por la zona que se usó cuando creaste la instancia. Si no lo cambiaste, se configuró como us-central1-b. Y reemplazar también la <INSTANCE_NAME> con lo que especificaste anteriormente.

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

Una vez conectado 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 puedes 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, aquí puedes usar el comando adecuado para obtener el proxy de tu SO.

Para ejecutar el proxy, toma el nombre de la conexión de la instancia que copiaste de los detalles de la instancia de Cloud SQL para reemplazar <INSTANCE_CONNECTION_NAME>. Además, ten en cuenta 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 la base de datos escucha.

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

6. Prueba la conexión y finaliza

Como se mencionó anteriormente, si tienes una aplicación que quieras probar en la instancia de GCE, no hay problema. En este codelab, instalaremos psql y usaremos ese cliente para verificar que podemos conectarnos a nuestra base de datos.

Desde la sesión de SSH en 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 prompt de Postgres y puedes ejecutar comandos en tu base de datos.

¿Qué sigue?

Consulta algunos codelabs sobre los siguientes temas:

Documentos de referencia