En esta página se ofrece información y ejemplos sobre cómo conectarse a una instancia de Cloud SQL desde un servicio que se ejecuta en Cloud Build.
Cloud SQL es un servicio de base de datos totalmente gestionado que te permite configurar, mantener y gestionar tus bases de datos relacionales en la nube.
Cloud Build es un servicio que ejecuta tus compilaciones en la infraestructura de Google Cloud .
Configurar una instancia de Cloud SQL
- Habilita la API Admin de Cloud SQL en el Google Cloud proyecto desde el que te conectas, si aún no lo has hecho:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. - Crea una instancia de Cloud SQL para PostgreSQL. Te recomendamos que elijas una
ubicación de instancia de Cloud SQL en la misma región que tu servicio de Cloud Run para mejorar la latencia, evitar algunos costes de redes y reducir los riesgos de fallos entre regiones.
De forma predeterminada, Cloud SQL asigna una dirección IP pública a una instancia nueva. También puedes asignar una dirección IP privada. Para obtener más información sobre las opciones de conectividad de ambos, consulta la página Información general sobre la conexión.
- Cuando crees la instancia, puedes elegir la
jerarquía de certificados de servidor (CA) de la instancia y, a continuación, configurar la jerarquía
como
serverCaMode
de la instancia. Debes seleccionar la opción de AC por instancia (GOOGLE_MANAGED_INTERNAL_CA
) como modo de AC del servidor para las instancias a las que quieras conectarte desde aplicaciones web.
Configurar un repositorio de Artifact Registry
- Si aún no lo has hecho, habilita la API de Artifact Registry en el Google Cloud proyecto desde el que te vas a conectar:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. - Crea un registro de artefactos de Docker. Para mejorar la latencia, reducir el riesgo de fallos entre regiones y evitar costes de red adicionales, te recomendamos que elijas una ubicación de Artifact Registry en la misma región que tu servicio de Cloud Run.
Configurar Cloud Build
Los pasos para configurar Cloud Build dependen del tipo de dirección IP que hayas asignado a tu instancia de Cloud SQL.IP pública (predeterminada)
Asegúrate de que tu
cuenta de servicio de Cloud Build tenga los roles y permisos de IAM necesarios para conectarse a la instancia de Cloud SQL.
La cuenta de servicio de Cloud Build aparece en la página Gestión de identidades y accesos de la consola Google Cloud como Principal
[YOUR-PROJECT-NUMBER]@cloudbuild.gserviceaccount.com
.
Para ver esta cuenta de servicio en la Google Cloud consola, selecciona la casilla Incluir asignaciones de roles proporcionadas por Google.
Tu cuenta de servicio de Cloud Build necesita el
Cloud SQL Client
rol de gestión de identidades y accesos.
Si la cuenta de servicio de Cloud Build pertenece a un proyecto diferente al de la instancia de Cloud SQL, se deben añadir la API Cloud SQL Admin y el rol a ambos proyectos.
IP privada
Para conectarte a tu instancia de Cloud SQL a través de una IP privada, Cloud Build debe estar en la misma red de VPC que tu instancia de Cloud SQL. Para configurarlo, sigue estos pasos:
- Configura una conexión privada entre la red de VPC de tu instancia de Cloud SQL y la red del productor de servicios.
- Crea un grupo privado de Cloud Build.
Una vez configurada, tu aplicación podrá conectarse directamente mediante la dirección IP privada y el puerto 5432
de tu instancia cuando se ejecute la compilación en el grupo.
Conectar a Cloud SQL
Después de configurar Cloud Build, puedes conectarte a tu instancia de Cloud SQL.
IP pública (predeterminada)
En el caso de las rutas de IP pública, Cloud Build admite sockets Unix y TCP.
Puedes usar el proxy de autenticación de Cloud SQL en un paso de Cloud Build para permitir conexiones a tu base de datos. Esta configuración:
- Compila el contenedor y lo envía a Artifact Registry.
- Crea un segundo contenedor y copia el archivo binario del proxy de autenticación de Cloud SQL.
- No es necesario enviar los contenedores creados por Cloud Build a ningún registro, ya que se descartan cuando se completa la compilación.
- Con el segundo contenedor, se inicia el proxy de autenticación de Cloud SQL y se ejecutan los comandos de migración.
steps: - id: install-proxy name: gcr.io/cloud-builders/wget entrypoint: sh args: - -c - | wget -O /workspace/cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/2.18.2 chmod +x /workspace/cloud-sql-proxy - id: migrate waitFor: ['install-proxy'] name: YOUR_CONTAINER_IMAGE_NAME entrypoint: sh env: - "DATABASE_NAME=${_DATABASE_NAME}" - "DATABASE_USER=${_DATABASE_USER}" - "DATABASE_PORT=${_DATABASE_PORT}" - "INSTANCE_CONNECTION_NAME=${_INSTANCE_CONNECTION_NAME}" secretEnv: - DATABASE_PASS args: - "-c" - | /workspace/cloud-sql-proxy ${_INSTANCE_CONNECTION_NAME} --port ${_DATABASE_PORT} & sleep 2; # Cloud SQL Proxy is now up and running, add your own logic below to connect python migrate.py # For example options: dynamic_substitutions: true substitutions: _DATABASE_USER: myuser _DATABASE_NAME: mydatabase _INSTANCE_CONNECTION_NAME: ${PROJECT_ID}:us-central1:myinstance _DATABASE_PORT: '5432' _DATABASE_PASSWORD_KEY: database_password _AR_REPO_REGION: us-central1 _AR_REPO_NAME: my-docker-repo _IMAGE_NAME: ${_AR_REPO_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO_NAME}/sample-sql-proxy availableSecrets: secretManager: - versionName: projects/$PROJECT_ID/secrets/${_DATABASE_PASSWORD_KEY}/versions/latest env: "DATABASE_PASS"
El ejemplo de código de Cloud Build muestra cómo se puede ejecutar una secuencia de comandos migrate.py
hipotética después de desplegar la aplicación de ejemplo anterior para actualizar su base de datos de Cloud SQL mediante el proxy de autenticación de Cloud SQL y Cloud Build.
Para ejecutar este código de ejemplo de Cloud Build, debes seguir estos pasos:
- Crea un nombre de carpeta
sql-proxy
- Crea un archivo
Dockerfile
en la carpetasql-proxy
con la siguiente línea de código como contenido:FROM gcr.io/gcp-runtimes/ubuntu_20_0_4
- Crea un archivo
cloudbuild.yaml
en la carpetasql-proxy
. - Actualiza el archivo
cloudbuild.yaml
:- Copia el código de ejemplo de Cloud Build anterior y pégalo en el archivo
cloudbuild.yaml
. - Sustituye los siguientes valores de marcador de posición por los valores que se usan en tu proyecto:
mydatabase
myuser
myinstance
- Copia el código de ejemplo de Cloud Build anterior y pégalo en el archivo
- Crea un secreto llamado
database_password
en Secret Manager.- Para que la cuenta de servicio de Cloud Build pueda acceder a este secreto, debes concederle el rol Lector de secretos de Secret Manager en Gestión de Identidades y Accesos (IAM). Para obtener más información, consulta Usar secretos de Secret Manager.
- Crea un archivo de script migrate.py en la carpeta
sql-proxy
.- La secuencia de comandos puede hacer referencia a las siguientes variables de entorno y al secreto creado en el archivo
cloudbuild.yaml
mediante los siguientes ejemplos:os.getenv('DATABASE_NAME')
os.getenv('DATABASE_USER')
os.getenv('DATABASE_PASS')
os.getenv('INSTANCE_CONNECTION_NAME')
- Para hacer referencia a las mismas variables desde una secuencia de comandos de Bash (por ejemplo,
migrate.sh
), usa los siguientes ejemplos:$DATABASE_NAME
$DATABASE_USER
$DATABASE_PASS
$INSTANCE_CONNECTION_NAME
- La secuencia de comandos puede hacer referencia a las siguientes variables de entorno y al secreto creado en el archivo
- Ejecuta el siguiente comando
gcloud builds submit
para crear un contenedor con el proxy de autenticación de Cloud SQL, iniciar el proxy de autenticación de Cloud SQL y ejecutar la secuencia de comandosmigrate.py
:gcloud builds submit --config cloudbuild.yaml
IP privada
En las rutas de IP privada, tu aplicación se conecta directamente a tu instancia a través de grupos privados. Este método usa TCP para conectarse directamente a la instancia de Cloud SQL sin usar el proxy de autenticación de Cloud SQL.
Conectarse con TCP
Conéctate mediante la dirección IP privada de tu instancia de Cloud SQL como host y el puerto 5432
.
Python
Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.
Java
Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.
Nota:
- NOMBRE_CONEXIÓN_CLOUD_SQL debe representarse como <MI-PROYECTO>:<REGIÓN-INSTANCIA>:<NOMBRE-INSTANCIA>.
- Si usas el argumento ipTypes=PRIVATE, se obligará a SocketFactory a conectarse con la IP privada asociada a una instancia.
- Consulta los requisitos de la versión de la fábrica de sockets JDBC para el archivo pom.xml.
Node.js
Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.
Go
Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.
C#
Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.
Ruby
Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.
PHP
Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.
Después, puedes crear un paso de Cloud Build para ejecutar el código directamente.
El ejemplo de código de Cloud Build anterior muestra cómo se puede ejecutar una hipotética secuencia de comandos migrate después de desplegar la aplicación de ejemplo anterior para actualizar su base de datos de Cloud SQL mediante Cloud Build. Para ejecutar este código de ejemplo de Cloud Build, debes seguir estos pasos:
- Crea un nombre de carpeta
sql-private-pool
- Crea un archivo
Dockerfile
en la carpetasql-private-pool
con la siguiente línea de código como contenido:FROM gcr.io/gcp-runtimes/ubuntu_20_0_4
- Crea un archivo
cloudbuild.yaml
en la carpetasql-private-pool
. - Actualiza el archivo
cloudbuild.yaml
:- Copia el código de Cloud Build de ejemplo que aparece arriba y pégalo en el archivo
cloudbuild.yaml
. - Sustituye los siguientes valores de marcador de posición por los valores que se usan en tu proyecto:
mydatabase
myuser
databasehost
, con el formatohost:port
.
- Copia el código de Cloud Build de ejemplo que aparece arriba y pégalo en el archivo
- Crea un secreto llamado
database_password
en Secret Manager.- Para que la cuenta de servicio de Cloud Build pueda acceder a este secreto, debes concederle el rol Lector de secretos de Secret Manager en Gestión de identidades y accesos. Para obtener más información, consulta Usar secretos de Secret Manager.
- Crea un archivo de script migrate.py en la carpeta
sql-proxy
.- La secuencia de comandos puede hacer referencia a las siguientes variables de entorno y al secreto creado en el archivo
cloudbuild.yaml
mediante los siguientes ejemplos:os.getenv('DATABASE_NAME')
os.getenv('DATABASE_USER')
os.getenv('DATABASE_PASS')
os.getenv('DATABASE_HOST')
- Para hacer referencia a las mismas variables desde una secuencia de comandos de Bash (por ejemplo,
migrate.sh
), usa los siguientes ejemplos:$DATABASE_NAME
$DATABASE_USER
$DATABASE_PASS
$DATABASE_HOST
- La secuencia de comandos puede hacer referencia a las siguientes variables de entorno y al secreto creado en el archivo
- Ejecuta el siguiente comando
gcloud builds submit
para crear un contenedor con el proxy de autenticación de Cloud SQL, iniciar el proxy de autenticación de Cloud SQL y ejecutar la secuencia de comandosmigrate.py
:gcloud builds submit --config cloudbuild.yaml
Prácticas recomendadas y otra información
Puedes usar el proxy de autenticación de Cloud SQL cuando pruebes tu aplicación de forma local. Consulta la guía de inicio rápido para usar el proxy de autenticación de Cloud SQL para obtener instrucciones detalladas.
También puedes hacer pruebas con el proxy de Cloud SQL a través de un contenedor de Docker.
Migraciones de esquemas de bases de datos
Si configuras Cloud Build para que se conecte a Cloud SQL, podrás ejecutar tareas de migración de esquemas de bases de datos en Cloud Build con el mismo código que desplegarías en cualquier otra plataforma sin servidor.
Usar Secret Manager
Puedes usar Secret Manager para incluir información sensible en tus compilaciones.