Cómo ejecutar automáticamente un microservicio multipais en CloudRun con Cloud Scheduler de GCP

Una manera sencilla de agendar la ejecución de tus microservicios, sin preocuparte de la infraestructura.

Oliver Fierro
GDG Cloud Santiago
6 min readSep 5, 2020

--

Nuestra aventura de hoy consiste en implementar un mecanismo que permita agendar en forma recurrente, la ejecución de un microservicio multitenant, que limpia los datos de una base de datos, según el país.

Este componente ya está desplegado en CloudRun, y para cumplir el objetivo planteado utilizaremos Cloud Scheduler de Google Cloud Platform.

Una recomendación.

En los capítulos anteriores vimos cómo armar una solución multitenant. Allí podrás revisar el contexto, problemática y requerimiento sobre el cual nos hemos basado para implementar la solución definitiva. Aquí te dejo los artículos, por si te los perdiste:

Integrando CloudRun con Secret Manager: https://medium.com/gdgcloudsantiago/gcp-cloudrun-en-acci%C3%B3n-15c615a1f593

Implementado una solución multitenant utilizando CloudRun, Secret Manager y CloudSql:

https://medium.com/gdgcloudsantiago/implementado-una-aplicaci%C3%B3n-multitenant-en-gcp-utilizando-cloudrun-con-cloudsql-y-secret-manager-7d6c3a35aa8e

Vamos con todo!

Requerimiento:

Implementar un mecanismo que cada cierto tiempo ejecute un microservicio que se encargue de borrar las órdenes de compra confirmadas de los clientes, las cuales tengan una antigüedad mayor a x días, para un país en particular.

Requisitos Técnicos

Google Cloud Platform

  • Una cuenta personal de Google Cloud
  • SDK de Google Cloud

Nota: Nos basaremos en el microservicio implementado en el capitulo anterior. Por lo tanto no necesitaremos herramientas de desarrollo propiamente tal.

Playa Choshuenco, Lago Panguipulli, Chile

Diseño de la Solución

La solución consiste en utilizar algunos productos de la familia serverless de GCP para agendar la ejecución de nuestro microservicio, el cual tiene como funcionalidad la limpieza de órdenes de compra antiguas, almacenadas en una base de datos por cada país. Utilizaremos Cloud Scheduler.

El diseño de la solución completa, lo podemos ver a continuación:

Nuestro microservicio esta ejecutándose en CloudRun y apunta a una base de datos CloudSql. Ejecutaremos con cierta frecuencia este microservicio a través de Cloud Scheduler, teniendo en consideración que nuestro microservicio es multitenant, es decir, soporta la interacción con las instancias de bases de datos de cada país.

Recuerde que tenemos 2 instancias de CloudSql (cada una con una base de datos), una que representa a los clientes de Chile y otra a los clientes de Argentina.

Además considere que nuestro microservicio expone un servicio Rest con el path /order y verbo http DELETE. Exige en la cabecera http el paso del parámetro del país (X-TENANT-ID)

Puerto Fuy, zarpe de barcaza hacia Puerto Pirehueico, Chile

Implementación de la Solución

Obtención de url del servicio CloudRun

Lo primero que debemos hacer es conocer la URL que expone nuestro microservicio en CloudRun.

Para esto debes ir a la consola de GCP y seleccionar tu servicio:

CloudRun -> Servicio (click sobre tu servicio)

A la derecha del nombre del servicio, encontrarás la URL de éste (https), la cual comienza por el nombre del servicio, seguido de un valor autogenerado más el sufijo “a.run.app”.

En este caso, nuestro servicio es “order-clean-service” y la url es:

https://order-clean-service-xxxxxxxx.a.run.app

Copia la URL

Configuración de Jobs en Cloud Scheduler

Cabe destacar que aun no es posible configurar todas las características de una url a través de la consola de GCP. Por esto, utilizaremos gcloud.

  • Ve a la consola de GCP, opción Cloud Scheduler.
  • Abre un terminal Cloud Shell:
Cloud Shell
  • Crea el Job de agendamiento

Ahora vamos a crear el agendamiento, utilizando solamente el comando gcloud.

Arma la siguiente linea de comando de acuerdo a tus datos, cópiala en CloudShell y dale “Enter”.

gcloud scheduler jobs create http [NOMBRE_JOB] --schedule=’[SCHEDULE_COMBINATION]'--uri=https://[URL_CLOUD_RUN]/[SERVICE_PATH] --headers=[PARAM_1]=’[VALUE1]’ --http-method=[HTTP_METHOD]

Donde:

[NOMBRE_JOB]: Nombre del job. Tú lo defines.
[SCHEDULE_COMBINATION]: Combinación de parámetros del agendamiento. Formato string tipo unix-cron (* * * * *)
[URL_CLOUD_RUN]/[SERVICE_PATH]: La URL de tu servicio desplegado en CloudRun, incluyendo el path del servicio Rest expuesto.
[PARAM_1]=’[VALUE1]’: Parámetros que van en el header http. En este caso, necesitaremos especificar el identificador del tenant, según el país. Tenemos un parámetro para este fin llamado X-TENANT-ID. Nuestro valor dependerá del pais para el cual se invocará el microservicio ('CL' o 'AR').
[HTTP_METHOD]: Verbo http permitido, segun lo que exponga el servicio REST. En este caso, expondremos el verbo Http DELETE. Las alternativas pueden ser: GET, POST, PUT, PATCH, DELETE

Crear Job para Chile:

gcloud scheduler jobs create http orderDataCleanCL --schedule=’0 9 * * 1' --uri=https://order-clean-service-xxxxxxxx.a.run.app/order --headers=X-TENANT-ID=’CL’ --http-method=DELETE

Crear Job para Argentina:

gcloud scheduler jobs create http orderDataCleanAR --schedule=’0 9 * * 1' --uri=https://order-clean-service-yyyyyyyy-uc.a.run.app/order --headers=X-TENANT-ID=’AR’ --http-method=DELETE

En nuestro ejemplo, el job se ejecutará a las 9:00 AM todos los Lunes (‘0 9 * * 1’).

Para saber que configuración agregar en el parámetro “schedule”, te dejo el siguiente tips:

 Campo              Formato de valores válidos    
------------------ --------------------------------
Minuto 0-59
Hora 0-23
Día del mes 1-31
Mes 1-12
Día de la semana De 0 a 6 (de domingo a sábado)

Ejecutamos las lineas de comandos, una por cada país, con su nombre de job respectivo (en este caso, orderDataCleanCL y orderDataCleanAR):

Job para Chile
Job para Argentina

Cuando finalice la ejecución de cada comando, aparecerán dos nuevos jobs en la consola:

Ejecución de job

Forzar ejecución del job

En la consola de GCP, opción CloudScheduler podrás encontrar una lista de tus servicios agendados.

Cloud Scheduler -> Servicios (click sobre tu servicio)

Sobre cada servicio, a la derecha existe un botón que dice “RUN NOW”.

Presiona “RUN NOW” para uno de tus Jobs. Por ejemplo, para orderDataCleanCL.

Revisa que la columna “Result” sea Success. En caso de falla dirá Failed.

Para ver el log de la ejecución del Job ve a la columna “Logs”, link View

Log en StackDriver

Si todo va bien, el job ya fue ejecutado y con ello, la llamada a tu servicio en CloudRun.

Chequear ejecución del servicio

Si quieres ver cómo se ejecutó tu servicio, ve a la opción CloudRun de la consola de GCP, dale click sobre el nombre de tu servicio y luego sobre la pestaña LOGS.

CloudRun -> Servicio (click sobre tu servicio) -> LOGS

En estos momentos, el microservicio ya se debe haber iniciado. Si tienes un log descriptivo, podrás ver los detalles de la funcionalidad ejecutada.

Ejecución programada de job

Para esta opción, sólo tenemos que esperar a que se cumpla el periodo de ejecución configurado y Cloud Scheduler ejecutará automáticamente tu job y con ello tu microservicio.

Hemos aprendido a crear un job que se ejecuta en forma recurrente con CloudScheduler, ejecutarlo manualmente y revisar el status de la ejecución.

Hemos llegado al final y tenemos nuestra recompensa…

Cascadas en Huilo-Huilo, reserva biológica. Panguipulli, Chile

Nos vemos en la próxima aventura.

Código Fuente: https://github.com/oliverfierro77/gcp-cloudrun-multitenant

Oliver Fierro

--

--

Oliver Fierro
GDG Cloud Santiago

Cloud Architect & Tech Lead | Speaker & Writter | Co-organizer @GDG Cloud Santiago Chile