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 al servicio de menú de Cymbal Eats. Ejecutarás la tarea con Google Cloud CLI y configurarás un programa para ella. Para verificar la ejecución, revisarás los registros y harás llamadas a la API del servicio de menú para confirmar que se borraron los elementos del menú.

¿Qué son los trabajos de Cloud Run?

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

Trabajo de limpieza del servicio

La tarea del servicio de limpieza recuperará los elementos de menú con el estado Error 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 superen esta validación, el estado de los elementos de menú se actualizará a Fallido 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.
  • Tener experiencia previa en Cloud Run y Cloud Scheduler es útil, pero no es obligatorio.

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 mantendrá 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 repositorio 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ú con la secuencia de comandos de configuración en Cloud Run. El servicio de menú es un microservicio basado en Java compilado con el framework Quarkus que usa la base de datos de 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 la tarea:

cd ~/cymbal-eats/cleanup-service

El cleanup-service en este directorio contiene un Dockerfile que define la imagen del contenedor para la tarea 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 de menú con estado de error y borrarlos mediante llamadas a la API al 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 las pasará el trabajo de Cloud Run.
  • FAILED_ITEM_AGE: Es la cantidad de minutos antes de que se borre el elemento con errores.
  • MENU_SERVICE_URL: Es la URL del servicio de 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 la tarea 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ú 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: HISTORY, LOGS, CONFIGURATION y YAML.

b12c8e312de3b66.png

Para verificar que se hayan establecido las variables de entorno, revisa la sección CONFIGURACIÓN del trabajo en la consola:

724c2919d05349c8.png

(Opcional) Si deseas cambiar las variables de edad de elementos con errores o la URL 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 siguiente comando de Cloud Run:

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 LOGS para revisar el resultado del trabajo. Deberías ver la URL del servicio de menú y la edad del elemento con error 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. 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 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 programador con el tipo de destino HTTP.

A modo de 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 la 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 del programador 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 de menú existentes y su estado:

curl ${MENU_SERVICE_URL}/menu | jq

Resultado:

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

Cambia el estado del elemento de menú n° 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, como se establece en el parámetro FAILED_ITEM_AGE.

Puedes esperar a 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.

En este ejemplo, ejecuta el comando en Cloud Shell(opción 3) para activar la tarea.

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

6c8cbeae6165ba4a.png

  1. En Trabajo de Cloud Run, haz clic en el botón “EXECUTE”.

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 de menú.

50829ae27b135b2d.png

Filtra los registros por la palabra clave "deleting" 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 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

¿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.