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 realice llamadas a la API para el servicio de menú de Cymbal Eats. Ejecutarás el trabajo con Google Cloud CLI y establecerás un programa para el trabajo. Para verificar la ejecución, revisarás los registros y realizarás llamadas a la API al servicio de menús para confirmar que se hayan borrado los elementos del menú.

¿Qué son los trabajos de Cloud Run?

El 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 finalice.

Trabajo de servicio de limpieza

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

d74200f0bd14d350.png

Qué aprenderás

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

  • Crear 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.
  • Tener experiencia previa en Cloud Run y Cloud Scheduler es útil, pero no es obligatoria.

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 te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como PROJECT_ID). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto.
  • Para tu información, 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 te facture 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 repositorio y ve al directorio que contiene el servicio del menú:

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

Implementar el servicio de menú mediante la secuencia de comandos de configuración en Cloud Run El servicio Menu es un microservicio basado en Java compilado con el framework de Quarkus que usa la base de datos Postgres de Cloud SQL para su backend. El servicio de menú es una dependencia del entorno 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 de 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 conforman el trabajo:

cd ~/cymbal-eats/cleanup-service

El servicio de limpieza de este directorio contiene un Dockerfile que define la imagen de 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 los elementos de menú en estado de error y borrarlos realizando llamadas a la API al servicio Menu.

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

Observa lo siguiente sobre la secuencia de comandos:

  • Las variables de entorno FAILED_ITEM_AGE y MENU_SERVICE_URL se configurará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. Crear trabajos 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 nuevo repositorio 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 una imagen de contenedor con Cloud Build y envíala a Artifact Registry con un 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

Cuando 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 elementos de menú con errores 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 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

Revisa la sección CONFIGURATION del trabajo en la consola para verificar que las variables de entorno se hayan establecido:

724c2919d05349c8.png

(Opcional) Si deseas cambiar las variables de URL del elemento con errores o del servicio de menú, después de crear el trabajo de Cloud Run, puedes usar el comando de actualización:

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 edad del elemento con errores y la URL del servicio de menú en los registros.

518cb00036a2561f.png

5. Configura un programa para un trabajo de Cloud Run

Cloud Scheduler es un programador de trabajos cron de nivel empresarial completamente administrado. Te 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, crea 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 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 un programa 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.

A los fines de esta demostración, lo programarás para que se ejecute 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: ID del proyecto y región de Cloud Run en los que se implementa el trabajo del servicio de limpieza
  • cleanup-service: Es el nombre del trabajo de Cloud Run.

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

3bc9120df7fc6ed.png

Revisa las opciones disponibles en el menú Acciones.

7945908025dd2f2b.png

6. Prueba el trabajo de Cloud Run

Usa los extremos del servicio de menú para revisar los elementos de menú existentes y sus estados:

curl ${MENU_SERVICE_URL}/menu | jq

Resultado:

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

Cambia el estado del elemento de menú n.o 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 el elemento de menú se borre, debe tener 1 minuto, como 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.

Hay varias maneras de activar un trabajo, a través de la IU o desde la línea de comandos.

Para este ejemplo, ejecuta el comando en Cloud Shell(opción n.o 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 “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 TRABAJOS de Cloud Run, abre la pestaña REGISTROS y verifica que se haya borrado el elemento de menú.

50829ae27b135b2d.png

Filtra registros para "borrar" para encontrar los registros.

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ú en 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 los trabajos

¿Qué sigue?

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.