Activa trabajos de Cloud Run con Cloud Scheduler

1. Descripción general

En este lab, crearás un trabajo de Cloud Run y configurarás un trabajo de Cloud Scheduler. Implementarás el servicio de menú de Cymbal Eats con la secuencia de comandos de configuración. Crearás un trabajo de Cloud Run que realizará llamadas a la API del servicio de menú de Cymbal Eats. Ejecutarás el trabajo con Google Cloud CLI y configurarás un programa para el trabajo. Verificarás la ejecución revisando los registros y realizando llamadas a la API del servicio de menú para confirmar que se borraron los elementos del menú.

¿Qué son los trabajos de Cloud Run?

Un trabajo de Cloud Run ejecuta un contenedor que no entrega solicitudes web, sino que ejecuta tareas operativas o procesamiento de datos. El contenedor ejecutará la tarea y saldrá cuando termine.

Trabajo de servicio de limpieza

El trabajo del servicio de limpieza recuperará los elementos del menú con el estado Failed y los borrará. Cuando se crean elementos de menú nuevos, las imágenes se analizan con la API de Vision para detectar si se trata de un elemento de comida o no. En el caso de las imágenes que no pasen esta validación, el estado de los elementos del menú se actualizará a Failed y, luego, el trabajo de limpieza los borrará.

d74200f0bd14d350.png

Qué aprenderás

En este lab, aprenderás a realizar las siguientes tareas:

  • Crea trabajos de Cloud Run
  • Ejecuta trabajos de Cloud Run
  • Crea trabajos de Cloud Scheduler
  • Verifica la ejecución de los trabajos

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.
  • Es útil tener experiencia previa en Cloud Run y Cloud Scheduler, pero no es un requisito.

2. Configuración y requisitos

Configuración del proyecto de Cloud

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usará el mismo durante todo el proyecto.
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Configuración del entorno

Para activar Cloud Shell, haz clic en el ícono que se encuentra a la derecha de la barra de búsqueda.

eb0157a992f16fa3.png

En Cloud Shell, ejecuta el siguiente comando para clonar el código de la aplicación desde este repo y ve al directorio que contiene el servicio de menú:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

Implementa el servicio de menú en Cloud Run con la secuencia de comandos de configuración. El servicio de menú es un microservicio basado en Java compilado con el framework de Quarkus que usa la base de datos de Cloud SQL Postgres para su backend. El servicio de menú es una dependencia del tiempo de ejecución para el trabajo de Cloud Run que crearás en los siguientes pasos.

./setup.sh

La implementación tardará alrededor de 10 minutos en crear todos los componentes necesarios.

Continúa con los siguientes pasos después de ejecutar el comando anterior.

3. Explora el código del trabajo de Cloud Run

Haz clic en el ícono de signo más para abrir una pestaña nueva en Cloud Shell.

45f480cd1b9a995.png

Ve al directorio que contiene el servicio de limpieza y revisa los archivos que componen el trabajo:

cd ~/cymbal-eats/cleanup-service

El servicio de limpieza en este directorio contiene un Dockerfile que define la imagen del contenedor para el trabajo del servicio de limpieza con las dependencias requeridas(httpie, jq).

Dockerfile

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

La secuencia de comandos de limpieza real, que se indica a continuación, contiene comandos para obtener una lista de elementos del menú con estado de error y borrarlos realizando llamadas a la API del servicio de menú.

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

Ten en cuenta lo siguiente sobre la secuencia de comandos:

  • Las variables de entorno FAILED_ITEM_AGE y MENU_SERVICE_URL se establecerán durante la implementación y el trabajo de Cloud Run las pasará.
  • FAILED_ITEM_AGE: Cantidad de minutos antes de que se borre el elemento con errores.
  • MENU_SERVICE_URL: URL del servicio del menú de Cymbal Eats.

4. Crea un trabajo de Cloud Run

A continuación, compilarás una imagen de contenedor y la publicarás en Artifact Registry.

Esta imagen de contenedor se usará para crear un trabajo de Cloud Run.

Habilita las APIs de servicio:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

Establece las variables de entorno:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

Crea un repositorio nuevo de Artifact Registry para almacenar imágenes de Docker para el trabajo de limpieza:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

Compila la imagen de contenedor con Cloud Build y envíala a Artifact Registry con un solo comando:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

Resultado de ejemplo:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

Una vez que se complete la publicación, navega a Artifact Registry y revisa la imagen publicada:

fb95ae38baa7c543.png

Regresa a la segunda pestaña de Cloud Shell. Ejecuta el siguiente comando para describir el servicio de menú y guardar la URL en la variable de entorno. Esta variable de entorno se usará para configurar el trabajo de Cloud Run.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

Crea un trabajo de Cloud Run para limpiar los elementos de menú fallidos que tengan más de 1 minuto [configurado por FAILED_ITEM_AGE].

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Resultado de ejemplo:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

Navega a la SECCIÓN DE TRABAJOS de Cloud Run en la consola y revisa el trabajo creado.

Haz clic en el trabajo y explora las pestañas disponibles: HISTORIAL, REGISTROS, CONFIGURACIÓN y YAML.

b12c8e312de3b66.png

Verifica que se hayan establecido las variables de entorno. Para ello, revisa la sección CONFIGURATION del trabajo en la consola:

724c2919d05349c8.png

(Opcional) Si deseas cambiar las variables Failed Item Age o Menu Service URL, después de crear el trabajo de Cloud Run, puedes usar el comando update:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Para validar el trabajo, ejecuta el trabajo de Cloud Run con el siguiente comando:

gcloud beta run jobs execute cleanup-service --region=$REGION

Resultado de ejemplo:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

Cambia a la pestaña REGISTROS para revisar el resultado del trabajo. Deberías ver la antigüedad del elemento con error y la URL del servicio de menú en los registros.

518cb00036a2561f.png

5. Configura un programa para el trabajo de Cloud Run

Cloud Scheduler es un programador de trabajos cron de nivel empresarial completamente administrado. Permite programar casi cualquier trabajo, desde trabajos por lotes y de macrodatos hasta operaciones de infraestructura de nube y mucho más.

Una práctica recomendada de seguridad cuando se trabaja con un trabajo de Cloud Scheduler es ejecutar cada trabajo con credenciales independientes. En este paso, crearás una cuenta de servicio para que la use el trabajo del programador de limpieza.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

El trabajo de Cloud Scheduler necesitará permisos para realizar llamadas a los trabajos de Cloud Run.

Otorga el rol Cloud Run Invoker a la cuenta de servicio que se usa en el trabajo de Cloud Scheduler:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

A continuación, configurarás una programación para ejecutar el trabajo del servicio de limpieza.

Cloud Scheduler admite varios tipos de destinos.

  • HTTP
  • Pub/Sub
  • HTTP de App Engine

Crearás un trabajo de Scheduler con el tipo de destino HTTP.

Para fines de demostración, programarás la ejecución cada 5 minutos.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

Revisa el parámetro uri que se usa para llamar al trabajo de Cloud Run:

  • REGION y PROJECT_ID: Región de Cloud Run y el ID del proyecto en el que se implementa el trabajo del servicio de limpieza
  • cleanup-service: Nombre del trabajo de Cloud Run

Navega a Cloud Scheduler en la consola para revisar el trabajo de Scheduler creado:

3bc9120df7fc6ed.png

Revisa las opciones disponibles en el menú Acciones.

7945908025dd2f2b.png

6. Prueba el trabajo de Cloud Run

Con los extremos del servicio de menú, revisa los elementos del menú existentes y su estado:

curl ${MENU_SERVICE_URL}/menu | jq

Resultado:

Verás 3 elementos de menú en el estado Ready.

Cambia el estado del elemento de menú 1 a Failed:

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

Espera 1 minuto. Para que se borre el elemento del menú, debe tener 1 minuto de antigüedad, según lo establece el parámetro FAILED_ITEM_AGE.

Puedes esperar la próxima ejecución programada o forzar la ejecución del trabajo desde la consola.

Existen varias formas de activar un trabajo, ya sea a través de la IU o desde la línea de comandos.

Para este ejemplo, ejecuta el comando en Cloud Shell(opción 3) para activar el trabajo.

  1. En Cloud Scheduler, selecciona "Forzar la ejecución de un trabajo" en el menú Acciones.

6c8cbeae6165ba4a.png

  1. En Cloud Run Job, haz clic en el botón "EJECUTAR".

229c22288882b5c3.png

  1. Desde Cloud Shell, ejecuta el siguiente comando:
gcloud beta run jobs execute cleanup-service --region=$REGION

Navega a la sección JOBS de Cloud Run, abre la pestaña LOGS y verifica que se haya borrado el elemento del menú.

50829ae27b135b2d.png

Filtra los registros por la palabra clave "borrar" para encontrarlos.

d94fb9e444b1c1b8.png

Usa los extremos del servicio de menú para verificar los elementos de menú existentes a través del extremo de REST.

curl ${MENU_SERVICE_URL}/menu | jq

Resultado:

Verás 2 elementos de menú con el estado Ready.

7. ¡Felicitaciones!

¡Felicitaciones! Completaste el codelab.

Temas abordados:

  • Cómo crear trabajos de Cloud Run
  • Cómo ejecutar trabajos de Cloud Run
  • Cómo crear trabajos de Cloud Scheduler
  • Cómo verificar la ejecución de trabajos

Pasos siguientes:

Explora otros codelabs de Cymbal Eats:

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.