arrow_back

Compila un sistema resiliente y asíncrono con Cloud Run y Pub/Sub

Acceder Unirse
Pon a prueba tus conocimientos y compártelos con nuestra comunidad
done
Obtén acceso a más de 700 labs prácticos, insignias de habilidad y cursos

Compila un sistema resiliente y asíncrono con Cloud Run y Pub/Sub

Lab 1 hora universal_currency_alt 5 créditos show_chart Intermedio
info Es posible que este lab incorpore herramientas de IA para facilitar tu aprendizaje.
Pon a prueba tus conocimientos y compártelos con nuestra comunidad
done
Obtén acceso a más de 700 labs prácticos, insignias de habilidad y cursos

GSP650

Labs de autoaprendizaje de Google Cloud

Logotipo de Pet Theory

Descripción general

Para los labs del curso Serverless Cloud Run Development, leerás el caso de una empresa ficticia y ayudarás a los personajes con su plan de migración a una tecnología sin servidores.

Hace doce años, Liliana fundó la cadena de clínicas veterinarias Pet Theory. Con el paso del tiempo, abrieron más clínicas y surgió la necesidad de buscar soluciones de automatización. La manera en que Pet Theory procesa los resultados de las pruebas médicas que recibe del laboratorio es demasiado lenta y propensa a errores, por lo que Liliana desea mejorarla.

Actualmente, Patricio, el administrador de TI de Pet Theory, procesa los resultados de las pruebas de forma manual. Siempre que recibe los resultados de una prueba, Patricio sigue dos pasos: primero, redacta y envía un correo electrónico al dueño de la mascota en cuestión y, luego, transcribe los resultados en un mensaje de texto que envía a dicho cliente desde su teléfono.

Patricio está trabajando con Rita, una asesora de software, para diseñar un sistema más escalable. Quieren crear una solución que no requiera tanto mantenimiento continuo y decidieron optar por la tecnología sin servidores.

Objetivos

En este lab, aprenderás a hacer lo siguiente:

  • Crear un tema de Pub/Sub y una suscripción
  • Crear un servicio de Cloud Run que reciba solicitudes HTTP y publique mensajes en Cloud Pub/Sub
  • Crear un servicio de Cloud Run que reciba mensajes de Cloud Pub/Sub
  • Crear una suscripción a Pub/Sub que active un servicio de Cloud Run
  • Probar la resiliencia de un sistema

Requisitos previos

Para este lab, se da por sentado que el usuario tiene conocimientos previos sobre los entornos de shell y la consola de Cloud. Además, como este lab forma parte de una serie, haber realizado otros anteriores podría ser útil, aunque no es obligatorio:

Configuración y requisitos

Nota: Para realizar este lab, accede a la consola de Google Cloud como Username 1. De lo contrario, encontrarás errores durante el lab.

Antes de hacer clic en el botón Comenzar lab

Lee estas instrucciones. Los labs son cronometrados y no se pueden pausar. El cronómetro, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.

Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.

Para completar este lab, necesitarás lo siguiente:

  • Acceso a un navegador de Internet estándar (se recomienda el navegador Chrome)
Nota: Usa una ventana de navegador privada o de Incógnito para ejecutar este lab. Así evitarás cualquier conflicto entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.
  • Tiempo para completar el lab: Recuerda que, una vez que comienzas un lab, no puedes pausarlo.
Nota: Si ya tienes un proyecto o una cuenta personal de Google Cloud, no los uses en este lab para evitar cargos adicionales en tu cuenta.

Cómo iniciar tu lab y acceder a la consola de Google Cloud

  1. Haga clic en el botón Comenzar lab. Si debe pagar por el lab, se abrirá una ventana emergente para que seleccione su forma de pago. A la izquierda, se encuentra el panel Detalles del lab, que tiene estos elementos:

    • El botón Abrir la consola de Google Cloud
    • El tiempo restante
    • Las credenciales temporales que debe usar para el lab
    • Otra información para completar el lab, si es necesaria
  2. Haz clic en Abrir la consola de Google Cloud (o haz clic con el botón derecho y selecciona Abrir el vínculo en una ventana de incógnito si ejecutas el navegador Chrome).

    El lab inicia recursos y abre otra pestaña en la que se muestra la página de acceso.

    Sugerencia: Ordene las pestañas en ventanas separadas, una junto a la otra.

    Nota: Si ves el diálogo Elegir una cuenta, haz clic en Usar otra cuenta.
  3. De ser necesario, copia el nombre de usuario a continuación y pégalo en el diálogo Acceder.

    {{{user_0.username | "Username"}}}

    También puedes encontrar el nombre de usuario en el panel Detalles del lab.

  4. Haz clic en Siguiente.

  5. Copia la contraseña que aparece a continuación y pégala en el diálogo Te damos la bienvenida.

    {{{user_0.password | "Password"}}}

    También puedes encontrar la contraseña en el panel Detalles del lab.

  6. Haz clic en Siguiente.

    Importante: Debes usar las credenciales que te proporciona el lab. No uses las credenciales de tu cuenta de Google Cloud. Nota: Usar tu propia Cuenta de Google podría generar cargos adicionales.
  7. Haga clic para avanzar por las páginas siguientes:

    • Acepta los Términos y Condiciones.
    • No agregues opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
    • No te registres para obtener pruebas gratuitas.

Después de un momento, se abrirá la consola de Google Cloud en esta pestaña.

Nota: Para ver un menú con una lista de productos y servicios de Google Cloud, haz clic en el menú de navegación que se encuentra en la parte superior izquierda. Ícono del menú de navegación

Activa Cloud Shell

Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud. Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.

  1. Haz clic en Activar Cloud Shell Ícono de Activar Cloud Shell en la parte superior de la consola de Google Cloud.

Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu PROJECT_ID. El resultado contiene una línea que declara el PROJECT_ID para esta sesión:

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con la función de autocompletado con tabulador.

  1. Puedes solicitar el nombre de la cuenta activa con este comando (opcional):
gcloud auth list
  1. Haz clic en Autorizar.

  2. Ahora, el resultado debería verse de la siguiente manera:

Resultado:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. Puedes solicitar el ID del proyecto con este comando (opcional):
gcloud config list project

Resultado:

[core] project = <project_ID>

Resultado de ejemplo:

[core] project = qwiklabs-gcp-44776a13dea667a6 Nota: Para obtener toda la documentación de gcloud, consulta la guía con la descripción general de gcloud CLI en Google Cloud.

Configura tu región y zona

Algunos recursos de Compute Engine se encuentran en regiones y zonas. Una región es una ubicación geográfica específica donde puedes ejecutar tus recursos. Cada región tiene una o más zonas.

Ejecuta los siguientes comandos de gcloud en la consola de Cloud para establecer la región y la zona predeterminadas de tu lab:

gcloud config set compute/zone "{{{project_0.default_zone|ZONE}}}" export ZONE=$(gcloud config get compute/zone) gcloud config set compute/region "{{{project_0.default_region|REGION}}}" export REGION=$(gcloud config get compute/region)

Situación

En Pet Theory, quieren automatizar el proceso utilizado para compartir los resultados de las pruebas de los clientes. Tienen cada vez más consultas y se les dificulta procesarlas, por lo que Liliana le pidió a Rita que los ayudara.

Liliana

Liliana, fundadora de Pet Theory

Hola Rita:

Gracias por organizar el portal de seguros.

Quisiera saber si se puede hacer algo respecto de los resultados de las pruebas médicas, ya que necesitamos una manera más eficiente de enviárselos a nuestros clientes.

Liliana

Rita

Rita, asesora de software

Hola Liliana:

Por supuesto. Déjeme ver qué puedo hacer. Tengo algunas ideas que podrían mejorar la situación.

Rita

Tarea 1: Arquitectura

Pet Theory recurre a una empresa externa para realizar las pruebas médicas. Una vez que el laboratorio completa una prueba médica, comparte los resultados con Pet Theory.

Para ello, la empresa envía una solicitud HTTP(S) POST al extremo web correspondiente de Pet Theory. En la siguiente ilustración, se puede consultar un esquema de la arquitectura general.

Diagrama de arquitectura del sistema de Pet Theory

Tras analizar el proceso general seguido en Pet Theory, Rita considera que se puede diseñar un sistema que les permita hacer lo siguiente:

  1. Recibir la solicitud HTTP POST y confirmar su recepción al laboratorio médico
  2. Enviar los resultados de la prueba por correo electrónico al cliente
  3. Enviar un mensaje de texto (SMS) y un correo electrónico con los resultados de la prueba al cliente

El diseño de Rita aísla cada una de las actividades anteriores y requiere lo siguiente:

  • Un servicio que cree la solicitud y la respuesta de los resultados médicos
  • Un servicio que envíe los resultados de la prueba por correo electrónico al cliente
  • Un servicio que envíe un mensaje de texto (SMS) al cliente
  • El uso de Pub/Sub para la comunicación entre servicios
  • El uso de una infraestructura sin servidores para la arquitectura de la aplicación

Por medio del empleo de funciones de un solo uso, Rita pretende desarrollar un código que sea más fácil de escribir y que contenga menos errores.

Rita

Rita, asesora de software

Hola Patricio:

Liliana me pidió crear un prototipo para agilizar el procesamiento de las historias clínicas.

Para comenzar, quisiera pedirte que configures un tema de Pub/Sub llamado new-lab-report.

Rita

Patricio

Patricio, administrador de TI

Hola Rita:

Parece ser un proyecto grandioso. Puedo hacer lo que me pides esta misma mañana, ya que ambas actividades se pueden configurar muy rápido en Google Cloud.

Patricio

Crea un tema de Pub/Sub

Ayuda a Patricio a crear un tema de Pub/Sub llamado new-lab-report.

Se destaca Cloud Pub/Sub en el diagrama de arquitectura

Cuando un servicio publica un mensaje de Pub/Sub, se debe etiquetar dicho mensaje con un tema. El servicio que se está por crear consumirá el informe de laboratorio y publicará un mensaje para cada informe encontrado.

Primero, debes crear un tema que se pueda utilizar para esta tarea.

  1. Ejecuta el siguiente comando para crear un tema de Pub/Sub:
gcloud pubsub topics create new-lab-report

Todos los servicios suscritos al tema “new-lab-report” podrán consumir los mensajes que publique el servicio de informes de laboratorio. En el diagrama anterior, puedes ver dos consumidores de este tipo: el servicio de correo electrónico y el servicio de SMS.

  1. A continuación, habilita Cloud Run para ejecutar tu código en la nube:
gcloud services enable run.googleapis.com

Haz clic en Revisar mi progreso para verificar el objetivo.

Crear un tema de Pub/Sub

No olvides avisarle a Rita que el tema de Pub/Sub ya está listo para su uso.

Patricio

Patricio, administrador de TI

Hola Rita:

Ya hice lo que me pediste.

Si tienes tiempo, me gustaría ver paso a paso cómo se crea este prototipo. ¿Crees que podríamos trabajar juntos en este proyecto?

Patricio

Rita

Rita, asesora de software

Hola Patricio:

¡Genial! Gracias por hacerlo tan rápido. Fijaré un horario y comenzaremos con la compilación.

Rita

Tarea 2: Compila el servicio de informes de laboratorio

Ayuda a Rita a configurar el nuevo servicio de informes de laboratorio.

Se destaca el servicio de informes de laboratorio en el diagrama de arquitectura

Se compilará este servicio con fines de prototipado, por lo que solo realizará dos tareas:

  1. Recibir la solicitud HTTPS POST correspondiente al informe de laboratorio y que contiene los datos de dicho informe
  2. Publicar un mensaje en Pub/Sub

Agrega el código del servicio de informes de laboratorio

  1. En Cloud Shell, clona el repositorio que se necesita para este lab:
git clone https://github.com/rosera/pet-theory.git
  1. Accede al directorio lab-service:
cd pet-theory/lab05/lab-service
  1. Instala los siguientes paquetes que se necesitarán para recibir solicitudes HTTPS entrantes y publicar mensajes en Pub/Sub:
npm install express npm install body-parser npm install @google-cloud/pubsub

Con estos comandos, se actualiza el archivo package.json para indicar las dependencias que requiere este servicio.

Ahora, debes editar el archivo package.json para que Cloud Run sepa cómo iniciar tu código.

  1. Abre el archivo package.json.

  2. En la sección de “scripts” del archivo package.json, agrega la línea de código "start": "node index.js", en la línea 7 (como se muestra a continuación) y, luego, guarda el archivo:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, Nota: Asegúrate de agregar el código tal como se te proporciona, incluyendo la coma final:

"start": "node index.js",

De lo contrario, encontrarás errores durante la implementación.
  1. Crea un nuevo archivo llamado index.js y agrégale este código:
const {PubSub} = require('@google-cloud/pubsub'); const pubsub = new PubSub(); const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { try { const labReport = req.body; await publishPubSubMessage(labReport); res.status(204).send(); } catch (ex) { console.log(ex); res.status(500).send(ex); } }) async function publishPubSubMessage(labReport) { const buffer = Buffer.from(JSON.stringify(labReport)); await pubsub.topic('new-lab-report').publish(buffer); } Estas dos líneas realizan el trabajo principal del servicio:

const labReport = req.body;

await publishPubSubMessage(labReport);

Específicamente, estas líneas:

  • Extraen el informe de laboratorio de la solicitud POST.
  • Publican un mensaje de Pub/Sub con los datos del informe de laboratorio que se acaba de publicar.
  1. Ahora, crea un archivo llamado Dockerfile y agrégale el siguiente código:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Este archivo define cómo empaquetar el servicio de Cloud Run en un contenedor.

Implementa el servicio lab-report-service

  1. Crea un archivo llamado deploy.sh y pega allí estos comandos:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service gcloud run deploy lab-report-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --allow-unauthenticated \ --max-instances=1
  1. En Cloud Shell, ejecuta lo siguiente para que este archivo sea ejecutable:
chmod u+x deploy.sh
  1. Llegó la hora de implementar el servicio de informes de laboratorio. Ejecuta la secuencia de comandos de implementación:
./deploy.sh

Debido a cuestiones de tiempo, es posible que recibas un mensaje de error la primera vez que ejecutes este comando. De ser así, solo vuelve a ejecutar deploy.sh.

Una vez que se haya completado correctamente la implementación, verás un mensaje similar a este:

Service [lab-report-service] revision [lab-report-service-00001] has been deployed and is serving traffic at https://lab-report-service-[hash].a.run.app

Buen trabajo. Se implementó el servicio de informes de laboratorio, que consumirá los resultados médicos del laboratorio a través de HTTP. Ahora, puedes probar si funciona correctamente el servicio nuevo.

Haz clic en Revisar mi progreso para verificar el objetivo.

Implementar el servicio de informes de laboratorio: compilar

Haz clic en Revisar mi progreso para verificar el objetivo.

Implementar el servicio de informes de laboratorio: crear revisión

Prueba el servicio de informes de laboratorio

Para validar el servicio de informes de laboratorio, simula tres solicitudes HTTPS POST realizadas por el laboratorio, cada una con un informe de laboratorio. A los fines de la prueba, los informes de laboratorio creados solo incluirán un ID.

  1. Primero, coloca la URL que dirige al informe en una variable de entorno para que sea más fácil trabajar con ella.
export LAB_REPORT_SERVICE_URL=$(gcloud run services describe lab-report-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Confirma que se haya capturado LAB_REPORT_SERVICE_URL:
echo $LAB_REPORT_SERVICE_URL
  1. Crea un nuevo archivo llamado post-reports.sh y agrégale el siguiente código:
curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 12}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 34}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 56}" \ $LAB_REPORT_SERVICE_URL &

La secuencia de comandos anterior utilizará el comando curl para publicar tres IDs distintos en la URL del servicio de informes de laboratorio. Se ejecutará cada comando individualmente en segundo plano.

  1. Haz que la secuencia de comandos post-reports.sh sea ejecutable:
chmod u+x post-reports.sh
  1. Ahora, prueba el extremo del servicio de informes de laboratorio. Para ello, publica allí tres informes de laboratorio con la secuencia de comandos antes mencionada:
./post-reports.sh

Esta secuencia de comandos publicó tres informes de laboratorio en tu servicio de informes de laboratorio. Revisa los registros para ver los resultados.

  1. En la consola de Cloud, haz clic en el Menú de navegación (Ícono del menú de navegación) > Cloud Run.

  2. Ahora deberías ver el servicio lab-report-service que acabas de implementar en la lista Servicios. Haz clic en él.

  3. En la página siguiente, se muestran detalles sobre tu servicio lab-report-service. Haz clic en la pestaña Registros.

En la página Registros, se incluyen los resultados de los tres informes de prueba que acabas de publicar con la secuencia de comandos. Con suerte, se devolverá el código HTTP 204, como se ilustra a continuación. Este código significa que está todo bien y que no hay contenido. Si no ves ninguna entrada, desplázate hacia arriba y hacia abajo con la barra de desplazamiento de la derecha. Eso volverá a cargar el registro.

La próxima tarea consiste en escribir los servicios de correo electrónico y SMS, que se activarán cuando el servicio de informes de laboratorio publique un mensaje de Pub/Sub en el tema “new-lab-report”.

Tarea 3: Servicio de correo electrónico

Ayuda a Rita a configurar el nuevo servicio de correo electrónico.

Se destaca el servicio de correo electrónico en el diagrama de arquitectura

Agrega el código del servicio de correo electrónico

  1. Accede al directorio del servicio de correo electrónico:
cd ~/pet-theory/lab05/email-service
  1. Instala estos paquetes para que el código pueda procesar las solicitudes HTTPS entrantes:
npm install express npm install body-parser

El comando anterior actualizará el archivo package.json, que describe la aplicación y sus dependencias. Se debe indicar a Cloud Run cómo ejecutar el código. Para ello, agrega la instrucción start.

  1. Abre el archivo package.json.

  2. En la sección “scripts”, agrega la línea "start": "node index.js", como se muestra a continuación y guarda el archivo:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, Nota: Asegúrate de agregar el código tal como se te proporciona, incluyendo la coma final:

"start": "node index.js",

De lo contrario, encontrarás errores durante la implementación.
  1. Crea un nuevo archivo llamado index.js y agrégale lo siguiente:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`Email Service: Report ${labReport.id} trying...`); sendEmail(); console.log(`Email Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`Email Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendEmail() { console.log('Sending email'); }

Se ejecutará este código cuando Pub/Sub publique un mensaje en el servicio y hará lo siguiente:

  • Decodificará el mensaje de Pub/Sub y, luego, intentará llamar a la función sendEmail().
  • Si se completa correctamente el primer paso y no se arroja ninguna excepción, devolverá el código de estado 204 para indicar a Pub/Sub que se procesó el mensaje.
  • Si existe una excepción, devolverá el código de estado 500 para indicar a Pub/Sub que no se procesó el mensaje y que debe volver a publicarlo en el servicio más tarde.

Tras asegurarse de que funcione la comunicación entre los servicios, Rita agregará código a la función sendEmail() para efectivamente enviar el correo electrónico.

  1. Ahora, crea un archivo llamado Dockerfile y agrégale el siguiente código:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Este archivo define cómo empaquetar el servicio de Cloud Run en un contenedor.

Implementa el servicio de correo electrónico

  1. Crea un nuevo archivo llamado deploy.sh y agrégale lo siguiente:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/email-service gcloud run deploy email-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/email-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. Haz que deploy.sh sea ejecutable:
chmod u+x deploy.sh
  1. Implementa el servicio de correo electrónico:
./deploy.sh

Cuando la implementación esté lista, verás un mensaje similar al siguiente:

Service [email-service] revision [email-service-00001] has been deployed and is serving traffic at https://email-service-[hash].a.run.app

Se implementó correctamente el servicio de correo electrónico. Ahora, debes asegurarte de que se active cuando haya un mensaje de Pub/Sub disponible.

Haz clic en Revisar mi progreso para verificar el objetivo.

Implementar el servicio de correo electrónico: compilar

Haz clic en Revisar mi progreso para verificar el objetivo.

Implementar el servicio de correo electrónico: crear revisión

Configura Pub/Sub para activar el servicio de correo electrónico

Siempre que se publique un nuevo mensaje de Pub/Sub con el tema “new-lab-report”, se debería activar el servicio de correo electrónico. Para que eso suceda, configura una cuenta de servicio que procese automáticamente las solicitudes asociadas con este servicio.

En el diagrama de arquitectura, se destaca el flujo de Cloud Pub/Sub al servicio de correo electrónico

  1. Crea una cuenta de servicio nueva destinada a activar los servicios que responden a los mensajes de Pub/Sub:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"

Haz clic en Revisar mi progreso para verificar el objetivo.

Crear una cuenta de servicio
  1. Otorga permiso a la nueva cuenta de servicio para invocar el servicio de correo electrónico:
gcloud run services add-iam-policy-binding email-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

A continuación, configura Pub/Sub para que invoque el servicio de SMS cuando se publique un nuevo mensaje de “new-lab-report”.

  1. Coloca el número de proyecto en una variable de entorno para facilitar el acceso:
PROJECT_NUMBER=$(gcloud projects list --filter="qwiklabs-gcp" --format='value(PROJECT_NUMBER)')

A continuación, habilita el proyecto para crear tokens de autenticación de Pub/Sub.

  1. Ejecuta el siguiente código:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator
  1. Coloca la URL del servicio de correo electrónico en otra variable de entorno:
EMAIL_SERVICE_URL=$(gcloud run services describe email-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Confirma que se haya capturado EMAIL_SERVICE_URL:
echo $EMAIL_SERVICE_URL
  1. Crea una suscripción a Pub/Sub para el servicio de correo electrónico.
gcloud pubsub subscriptions create email-service-sub --topic new-lab-report --push-endpoint=$EMAIL_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

Buen trabajo. Ya se configuró el servicio para que responda a los mensajes de Cloud Pub/Sub. El siguiente paso es validar el código para confirmar que cumple con los requisitos.

Haz clic en Revisar mi progreso para verificar el objetivo.

Crear la suscripción a Pub/Sub

Prueba los servicios de informes de laboratorio y de correo electrónico juntos

  1. Con la secuencia de comandos que creaste anteriormente, vuelve a publicar datos en los informes de laboratorio:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Luego, abre el registro (Menú de navegación > Cloud Run). Verás los dos servicios de Cloud Run, email-service y lab-report-service, en tu cuenta.

  2. Haz clic en email-service y, luego, en Registros.
    Verás el resultado de este servicio activado por Pub/Sub. Si no ves los mensajes que esperas, es posible que debas desplazarte hacia arriba y hacia abajo con la barra de desplazamiento para que el registro se actualice.

Buen trabajo. El servicio de correo electrónico ahora puede escribir información en el registro siempre que se procese un mensaje de la cola de temas de Cloud Pub/Sub. La última tarea consiste en escribir el servicio de SMS.

Tarea 4: Servicio de SMS

Ayuda a Rita a configurar el nuevo servicio de SMS.

Se destaca el servicio de SMS en el diagrama de arquitectura

Agrega el código del servicio de SMS

  1. Crea un directorio para el servicio de SMS:
cd ~/pet-theory/lab05/sms-service
  1. Instala los paquetes necesarios para recibir las solicitudes HTTPS entrantes:
npm install express npm install body-parser
  1. Abre el archivo package.json.

  2. En la sección “scripts”, agrega la línea "start": "node index.js", como se muestra a continuación y guarda el archivo:

... "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, ... Nota: Asegúrate de agregar el código tal como se te proporciona, incluyendo la coma final:

"start": "node index.js",

De lo contrario, encontrarás errores durante la implementación.
  1. Crea un nuevo archivo llamado index.js y agrégale lo siguiente:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`SMS Service: Report ${labReport.id} trying...`); sendSms(); console.log(`SMS Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`SMS Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendSms() { console.log('Sending SMS'); }
  1. Ahora, crea un archivo llamado Dockerfile y agrégale el siguiente código:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Este archivo define cómo empaquetar el servicio de Cloud Run en un contenedor. Ahora que ya se creó el código, el paso siguiente es implementar el servicio.

Implementa el servicio de SMS

  1. Crea un archivo llamado deploy.sh y agrégale el siguiente código:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service gcloud run deploy sms-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. Haz que deploy.sh sea ejecutable:
chmod u+x deploy.sh
  1. Implementa el servicio de SMS:
./deploy.sh

Cuando la implementación esté lista, se mostrará un mensaje similar al siguiente:

Service [sms-service] revision [sms-service-00001] has been deployed and is serving traffic at https://sms-service-[hash].a.run.app

Se implementó correctamente el servicio de SMS, pero aún no está vinculado al servicio de Cloud Pub/Sub. Corrígelo en la próxima sección.

Haz clic en Revisar mi progreso para verificar el objetivo.

Implementar el servicio de SMS

Configura Cloud Pub/Sub para activar el servicio de SMS

Tal como sucede con el servicio de correo electrónico, se debe configurar la vinculación entre Cloud Pub/Sub y el servicio de SMS para que se puedan consumir los mensajes.

En el diagrama de arquitectura, se destaca el flujo de Cloud Pub/Sub al servicio de SMS

  1. Configura los permisos necesarios para que Pub/Sub pueda activar el servicio de SMS:
gcloud run services add-iam-policy-binding sms-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

A continuación, configura Pub/Sub para que invoque el servicio de SMS cuando se publique un nuevo mensaje de "new-lab-report".

  1. Para ello, lo primero que debes hacer es colocar la dirección URL del servicio de SMS en una variable de entorno:
SMS_SERVICE_URL=$(gcloud run services describe sms-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Confirma que se haya capturado SMS_SERVICE_URL:

    echo $SMS_SERVICE_URL
  2. Luego, crea la suscripción a Pub/Sub:

gcloud pubsub subscriptions create sms-service-sub --topic new-lab-report --push-endpoint=$SMS_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
  1. Vuelve a ejecutar la secuencia de comandos de prueba para publicar tres informes de laboratorio en el servicio de informes de laboratorio:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Luego, abre el registro (Menú de navegación > Cloud Run). Verás los tres servicios de Cloud Run, email-service, lab-report-service y sms-service, en tu cuenta.

  2. Haz clic en sms-service y, luego, en Registros. Verás el resultado de este servicio activado por Pub/Sub.

Se creó y probó correctamente el sistema prototípico, pero Patricio está preocupado porque no se probó la resiliencia como parte del proceso de validación inicial.

Tarea 5: Prueba la resiliencia del sistema

¿Qué sucede si deja de funcionar uno de los servicios? Eso ya le sucedió a Patricio, puesto que es una situación que se da con frecuencia.

Ayuda a Rita a investigar cómo garantizar que el sistema pueda lidiar con este tipo de situaciones. Ella desea probar qué sucede cuando falla un servicio y, para ello, implementará una versión con errores del servicio de correo electrónico.

  1. Regresa al directorio email-service:
cd ~/pet-theory/lab05/email-service

Agrega texto no válido a la aplicación del servicio de correo electrónico para provocar un error.

  1. Edita el archivo index.js y agrega la línea de throw a la función sendEmail(), como se muestra a continuación. Se arrojará una excepción, como si no funcionara el servidor de correo electrónico:
... function sendEmail() { throw 'Email server is down'; console.log('Sending email'); } ...

Agregar este código provocará una falla en el servicio cuando se lo invoque.

  1. Implementa esta versión con errores del servicio de correo electrónico:
./deploy.sh
  1. Cuando se haya completado correctamente la implementación del servicio de correo electrónico, vuelve a publicar datos en los informes de laboratorio y, luego, observa detenidamente el estado del registro de email-service:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Abre los registros del servicio de correo electrónico para ver la información sobre el servicio de correo electrónico deficiente: Menú de navegación > Cloud Run.

  2. Cuando veas los tres servicios de Cloud Run en tu cuenta, haz clic en email-service.

Si bien se invocará el servicio de correo electrónico, este fallará una y otra vez. Si te desplazas un poco hacia atrás en los registros, encontrarás la causa raíz: “Email server is down”. También podrás ver que el servicio devuelve el código de estado 500 y que Pub/Sub sigue reintentando llamar al servicio.

Si observas los registros del servicio de SMS, verás que este funciona correctamente.

Ahora, corrige el error en el servicio de correo electrónico para restablecer la aplicación.

  1. Abre el archivo index.js, quita la línea de throw que ingresaste anteriormente y, luego, guarda el archivo.

La función sendEmail del archivo index.js ahora debería verse similar a lo siguiente:

function sendEmail() { console.log('Sending email'); }
  1. Implementa la versión corregida del servicio de correo electrónico:
./deploy.sh
  1. Cuando la implementación haya finalizado, haz clic en el ícono de actualización, ubicado en la esquina superior derecha.

Verás que finalmente se enviaron los correos electrónicos correspondientes a los informes 12, 34 y 56, que el servicio de correo electrónico devolvió el código de estado 204 y que Pub/Sub dejó de invocar el servicio. No se perdió ningún dato. Pub/Sub siguió reintentando hasta que pudo completar correctamente la tarea. Esta es la base de un sistema sólido.

Conclusiones

  1. Si los servicios se comunican entre sí de forma asíncrona a través de Pub/Sub en lugar de llamarse directamente unos a otros, el sistema puede ser más resiliente.
  2. El activador del servicio de informes de laboratorio es independiente de otros servicios gracias al uso de Pub/Sub. Por ejemplo, si los clientes también quisieran recibir los resultados de laboratorio a través de otro servicio de mensajería, este se podría agregar sin necesidad de actualizar el servicio de informes de laboratorio.
  3. Cloud Pub/Sub se encargó de los reintentos, de modo que los servicios no debieron hacerlo. Los servicios solo se necesitan para devolver un código de estado: correcto o fallido.
  4. Además, gracias a los reintentos de Pub/Sub, si deja de funcionar un servicio, el sistema puede "repararse" automáticamente cuando el servicio vuelve a estar en línea.

¡Felicitaciones!

Con tu ayuda, Rita logró compilar un sistema prototípico resiliente. El servicio puede enviar automáticamente un correo electrónico y un mensaje de texto (SMS) a cada cliente. Si dejan de funcionar temporalmente los servicios individuales, el sistema implementará un mecanismo de reintentos para que no se pierda ningún dato. Rita recibe varios elogios bien merecidos.

Liliana

Liliana, fundadora de Pet Theory

Hola Rita:

No alcanzan las palabras para agradecerte por tu arduo trabajo y liderazgo.

En muy poco tiempo, se renovaron por completo nuestros sistemas esenciales.

El viernes, haremos una pequeña reunión para celebrar, y sería grandioso si pudieras asistir como nuestra invitada de honor.

Liliana

MacarenaMacarena, directora general

Rita:

Recibí comentarios muy positivos sobre tu trabajo en Pet Theory. Se te considera un recurso sumamente valioso en el equipo.

Ahora que finalizaste esta asignación, quisiera ofrecerte un puesto de mayor nivel en un proyecto nuevo.

Macarena

Directora general

Computer Consulting Inc.

Próximos pasos y más información

Capacitación y certificación de Google Cloud

Recibe la formación que necesitas para aprovechar al máximo las tecnologías de Google Cloud. Nuestras clases incluyen habilidades técnicas y recomendaciones para ayudarte a avanzar rápidamente y a seguir aprendiendo. Para que puedas realizar nuestros cursos cuando más te convenga, ofrecemos distintos tipos de capacitación de nivel básico a avanzado: a pedido, presenciales y virtuales. Las certificaciones te ayudan a validar y demostrar tus habilidades y tu conocimiento técnico respecto a las tecnologías de Google Cloud.

Última actualización del manual: 1 de febrero de 2024

Prueba más reciente del lab: 20 de septiembre de 2023

Copyright 2024 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.

Este contenido no está disponible en este momento

Te enviaremos una notificación por correo electrónico cuando esté disponible

¡Genial!

Nos comunicaremos contigo por correo electrónico si está disponible