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

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



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

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.

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_AGEyMENU_SERVICE_URLse 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:

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.

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

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

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:
REGIONyPROJECT_ID: Región de Cloud Run y el ID del proyecto en el que se implementa el trabajo del servicio de limpiezacleanup-service: Nombre del trabajo de Cloud Run
Navega a Cloud Scheduler en la consola para revisar el trabajo de Scheduler creado:

Revisa las opciones disponibles en el menú Acciones.

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.
- En Cloud Scheduler, selecciona "Forzar la ejecución de un trabajo" en el menú Acciones.

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

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

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

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:
- Cómo activar Cloud Workflows con Eventarc
- Cómo activar el procesamiento de eventos desde Cloud Storage
- Conéctate a CloudSQL privado desde Cloud Run
- Conéctate a bases de datos completamente administradas desde Cloud Run
- Protege una aplicación sin servidores con Identity-Aware Proxy (IAP)
- Implementación segura en Cloud Run
- Protección del tráfico de entrada de Cloud Run
- Conéctate a una instancia privada de AlloyDB desde GKE Autopilot
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.