1. Descripción general
Cloud Run es una plataforma sin servidores completamente administrada que te permite ejecutar contenedores sin estado que se pueden invocar a través de solicitudes HTTP. En este codelab, se mostrará cómo conectar una aplicación de Node.js en Cloud Run a una base de datos de Cloud SQL para PostgreSQL.
Qué aprenderás
En este lab, aprenderás a hacer lo siguiente:
- Crea una instancia de Cloud SQL para PostgreSQL
- Implementa una aplicación en Cloud Run que se conecte a tu base de datos de Cloud SQL
Qué aprenderás
- Crea una instancia de Cloud SQL para PostgreSQL
- Implementa una aplicación en Cloud Run que se conecte a tu base de datos de Cloud SQL
2. Requisitos previos
- Si aún no tienes una Cuenta de Google, debes crear una.
- Usa una cuenta personal en lugar de una cuenta de trabajo o de institución educativa. Es posible que las cuentas de trabajo o de instituciones educativas tengan restricciones que te impidan habilitar las APIs necesarias para este lab.
3. Configura el proyecto
- Accede a la consola de Google Cloud.
- Habilita la facturación en la consola de Cloud.
- Completar este lab debería costar menos de USD 1 en recursos de Cloud.
- Puedes seguir los pasos que se indican al final de este lab para borrar recursos y evitar cargos adicionales.
- Los usuarios nuevos son aptos para la prueba gratuita de USD 300.
- Crea un proyecto nuevo o elige reutilizar uno existente.
4. Abrir el editor de Cloud Shell
- Navega al Editor de Cloud Shell.
- Si la terminal no aparece en la parte inferior de la pantalla, ábrela:
- Haz clic en el menú de opciones
.
- Haz clic en Terminal.
- Haz clic en Terminal nueva.
- Haz clic en el menú de opciones
- En la terminal, configura tu proyecto con este comando:
- Formato:
gcloud config set project [PROJECT_ID]
- Ejemplo:
gcloud config set project lab-project-id-example
- Si no recuerdas el ID de tu proyecto, haz lo siguiente:
- Puedes enumerar todos los IDs de tu proyecto con lo siguiente:
gcloud projects list | awk '/PROJECT_ID/{print $2}'
- Puedes enumerar todos los IDs de tu proyecto con lo siguiente:
- Formato:
- Si se te solicita autorización, haz clic en Autorizar para continuar.
- Deberías ver el siguiente mensaje:
Si ves unUpdated property [core/project].
WARNING
y se te preguntaDo you want to continue (Y/N)?
, es probable que hayas ingresado el ID del proyecto de forma incorrecta. PresionaN
, presionaEnter
y vuelve a intentar ejecutar el comandogcloud config set project
.
5. Habilita las APIs
En la terminal, habilita las APIs:
gcloud services enable \
compute.googleapis.com \
sqladmin.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
networkconnectivity.googleapis.com \
servicenetworking.googleapis.com \
cloudaicompanion.googleapis.com
Si se te solicita autorización, haz clic en Autorizar para continuar.
Este comando puede tardar unos minutos en completarse, pero, en algún momento, debería mostrar un mensaje de éxito similar al siguiente:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. Configura una cuenta de servicio
Crea y configura una cuenta de servicio de Google Cloud que Cloud Run pueda usar para que tenga los permisos correctos para conectarse a Cloud SQL.
- Ejecuta el comando
gcloud iam service-accounts create
de la siguiente manera para crear una cuenta de servicio nueva:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account"
- Ejecuta el comando gcloud projects add-iam-policy-binding de la siguiente manera para agregar el rol de escritor de registros a la cuenta de servicio de Google Cloud que acabas de crear.
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/logging.logWriter"
7. Crea una base de datos de Cloud SQL
- Crea una política de conexión de servicio para permitir la conectividad de red de Cloud Run a Cloud SQL con Private Service Connect
gcloud network-connectivity service-connection-policies create quickstart-policy \ --network=default \ --project=${GOOGLE_CLOUD_PROJECT} \ --region=us-central1 \ --service-class=google-cloud-sql \ --subnets=https://www.googleapis.com/compute/v1/projects/${GOOGLE_CLOUD_PROJECT}/regions/us-central1/subnetworks/default
- Genera una contraseña única para tu base de datos
export DB_PASSWORD=$(openssl rand -base64 20)
- Ejecuta el comando
gcloud sql instances create
para crear una instancia de Cloud SQLgcloud sql instances create quickstart-instance \ --project=${GOOGLE_CLOUD_PROJECT} \ --root-password=${DB_PASSWORD} \ --database-version=POSTGRES_17 \ --tier=db-perf-optimized-N-2 \ --region=us-central1 \ --ssl-mode=ENCRYPTED_ONLY \ --no-assign-ip \ --enable-private-service-connect \ --psc-auto-connections=network=projects/${GOOGLE_CLOUD_PROJECT}/global/networks/default
Este comando puede tardar unos minutos en completarse.
- Ejecuta el comando
gcloud sql databases create
para crear una base de datos de Cloud SQL dentro dequickstart-instance
.gcloud sql databases create quickstart_db \ --instance=quickstart-instance
8. Prepara la solicitud
Prepara una aplicación de Node.js que responda a las solicitudes HTTP.
- En Cloud Shell, crea un directorio nuevo llamado
helloworld
y, luego, cambia a ese directorio:mkdir helloworld cd helloworld
- Inicializa un archivo
package.json
como un módulo.npm init -y npm pkg set type="module" npm pkg set main="index.mjs" npm pkg set scripts.start="node index.mjs"
- Instala
pg
para interactuar con la base de datos de PostgreSQL.npm install pg
- Instala Express para aceptar solicitudes HTTP entrantes.
npm install express
- Crea un archivo
index.mjs
con el código de la aplicación. Este código puede hacer lo siguiente:- Acepta solicitudes HTTP
- Conéctate a la base de datos
- Almacena la hora de la solicitud HTTP en la base de datos
- Devuelve las horas de las últimas cinco solicitudes
cat > index.mjs << "EOF" import express from 'express'; import pg from 'pg'; const { Pool } = pg; const pool = new Pool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, ssl: { require: true, rejectUnauthorized: false, // required for self-signed certs // https://node-postgres.com/features/ssl#self-signed-cert } }); const app = express(); app.get('/', async (req, res) => { await pool.query('INSERT INTO visits(created_at) VALUES(NOW())'); const {rows} = await pool.query('SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5'); console.table(rows); // prints the last 5 visits res.send(rows); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, async () => { console.log('process.env: ', process.env); await pool.query(`CREATE TABLE IF NOT EXISTS visits ( id SERIAL NOT NULL, created_at timestamp NOT NULL, PRIMARY KEY (id) );`); console.log(`helloworld: listening on port ${port}`); }); EOF
Con este código, se crea un servidor web básico que escucha en el puerto definido por la variable de entorno PORT. La aplicación ya está lista para implementarse.
9. Implementa la aplicación en Cloud Run
- Ejecuta el siguiente comando para implementar tu aplicación en Cloud Run:
gcloud run deploy helloworld \ --region=us-central1 \ --source=. \ --set-env-vars DB_NAME="quickstart_db" \ --set-env-vars DB_USER="postgres" \ --set-env-vars DB_PASSWORD=${DB_PASSWORD} \ --set-env-vars DB_HOST="$(gcloud sql instances describe quickstart-instance --project=${GOOGLE_CLOUD_PROJECT} --format='value(settings.ipConfiguration.pscConfig.pscAutoConnections.ipAddress)')" \ --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --network=default \ --subnet=default \ --allow-unauthenticated
- Si se te solicita, presiona
Y
yEnter
para confirmar que deseas continuar:Do you want to continue (Y/n)? Y
Después de unos minutos, la aplicación debería proporcionarte una URL para que la visites.
Navega a la URL para ver tu aplicación en acción. Cada vez que visites la URL o actualices la página, verás las cinco visitas más recientes que se muestran como JSON.
10. Felicitaciones
En este lab, aprendiste a hacer las siguientes tareas:
- Crea una instancia de Cloud SQL para PostgreSQL
- Implementa una aplicación en Cloud Run que se conecte a tu base de datos de Cloud SQL
Limpia
Cloud SQL no tiene un nivel gratuito y se te cobrará si continúas usándolo. Puedes borrar tu proyecto de Cloud para evitar que se generen cargos adicionales.
Si bien Cloud Run no cobra cuando el servicio no se usa, es posible que se te cobre por el almacenamiento de la imagen del contenedor en Artifact Registry. Si borras tu proyecto de Cloud, se detendrá la facturación de todos los recursos que usaste en ese proyecto.
Si lo deseas, borra el proyecto:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
También te recomendamos que borres los recursos innecesarios del disco de CloudShell. Puedes hacer lo siguiente:
- Borra el directorio del proyecto del codelab:
rm -rf ~/task-app
- Advertencia. No podrás deshacer esta acción. Si quieres borrar todo en Cloud Shell para liberar espacio, puedes borrar todo el directorio principal. Asegúrate de que todo lo que quieras conservar esté guardado en otro lugar.
sudo rm -rf $HOME
Sigue aprendiendo
- Implementa una aplicación de pila completa de Next.js en Cloud Run con Cloud SQL para PostgreSQL mediante el conector de Node.js de Cloud SQL
- Implementa una aplicación de pila completa de Angular en Cloud Run con Cloud SQL para PostgreSQL usando el conector de Node.js de Cloud SQL
- Implementa una aplicación de Angular de pila completa en Cloud Run con Firestore usando el SDK de Admin para Node.js
- Implementa una aplicación de Next.js de pila completa en Cloud Run con Firestore usando el SDK de Admin de Node.js