Déclencher des jobs Cloud Run avec Cloud Scheduler

1. Présentation

Dans cet atelier, vous allez créer un job Cloud Run et configurer un job Cloud Scheduler. Vous allez déployer Cymbal Eats Menu Service à l'aide du script de configuration. Vous allez créer un job Cloud Run qui effectuera des appels d'API vers le service Cymbal Eats Menu. Vous allez exécuter le job à l'aide de la Google Cloud CLI et configurer une planification pour celle-ci. Vous vérifierez l'exécution en examinant les journaux et en effectuant des appels d'API au service de menu pour confirmer que les éléments de menu ont été supprimés.

Que sont les jobs Cloud Run ?

Le job Cloud Run exécute un conteneur qui ne diffuse pas de requêtes Web, mais qui exécute des tâches opérationnelles ou du traitement des données. Le conteneur exécutera la tâche et se fermera une fois l'opération terminée.

Tâche de service de nettoyage

Le job de service de nettoyage récupérera les éléments de menu à l'état "Échec" et les supprimera. Lorsque des éléments de menu sont créés, les images sont analysées à l'aide de l'API Vision pour détecter s'il s'agit d'un plat ou non. Pour les images qui échouent à cette validation, l'état des éléments de menu sera défini sur "Échec", puis supprimé par la tâche de nettoyage.

d74200f0bd14d350.png

Objectifs de l'atelier

Dans cet atelier, vous allez apprendre à effectuer les tâches suivantes :

  • Créer des jobs Cloud Run
  • Exécuter des jobs Cloud Run
  • Créer des tâches Cloud Scheduler
  • Vérifier l'exécution des jobs

Prérequis

  • Dans cet atelier, nous considérons que vous connaissez la console Cloud et les environnements de shell.
  • Une expérience préalable de Cloud Run et Cloud Scheduler est utile, mais pas obligatoire.

2. Préparation

Configuration du projet Cloud

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pouvez le modifier à tout moment.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique. généralement, vous ne vous souciez pas de ce que c’est. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (il est généralement identifié comme PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre au hasard. Vous pouvez également essayer la vôtre pour voir si elle est disponible. Il ne peut pas être modifié après cette étape et restera actif pendant toute la durée du projet.
  • Pour votre information, il existe une troisième valeur, le numéro de projet, utilisé par certaines API. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour arrêter les ressources afin d'éviter que des frais ne vous soient facturés au-delà de ce tutoriel, vous pouvez supprimer les ressources que vous avez créées ou l'ensemble du projet. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai gratuit pour bénéficier d'un crédit de 300 $.

Configuration de l'environnement

Activez Cloud Shell en cliquant sur l'icône située à droite de la barre de recherche.

eb0157a992f16fa3.png

Dans Cloud Shell, exécutez la commande suivante pour cloner le code de l'application à partir de ce dépôt et accédez au répertoire contenant le service de menu:

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

Déployez le service de menu sur Cloud Run à l'aide du script de configuration. Le service Menu est un microservice Java créé avec le framework Quarkus qui utilise la base de données Postgres Cloud SQL pour son backend. Le service Menu est une dépendance d'exécution pour le job Cloud Run que vous allez créer dans les étapes suivantes.

./setup.sh

La création de tous les composants requis prend environ 10 minutes.

Passez aux étapes suivantes après avoir exécuté la commande ci-dessus.

3. Explorer le code du job Cloud Run

Ouvrez un nouvel onglet dans Cloud Shell en cliquant sur l'icône Plus.

45f480cd1b9a995.png

Accédez au répertoire contenant le service de nettoyage et examinez les fichiers qui composent le job:

cd ~/cymbal-eats/cleanup-service

Le service de nettoyage de ce répertoire contient un Dockerfile qui définit l'image de conteneur pour la tâche de service de nettoyage avec les dépendances requises(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"]

Le script de nettoyage réel, répertorié ci-dessous, contient des commandes permettant d'obtenir la liste des éléments de menu dont l'état a échoué et de les supprimer en appelant l'API au service 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

Notez les points suivants à propos du script:

  • Les variables d'environnement FAILED_ITEM_AGE et MENU_SERVICE_URL seront définies lors du déploiement et transmises par le job Cloud Run.
  • FAILED_ITEM_AGE : délai de suppression (en minutes) de l'élément ayant échoué.
  • MENU_SERVICE_URL : URL du service du menu Cymbal Eats.

4. Créer un job Cloud Run

Vous allez maintenant créer une image de conteneur et la publier dans Artifact Registry.

Cette image de conteneur sera utilisée pour créer un job Cloud Run.

Activez les API de service:

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

Définissez les variables d'environnement :

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

Créez un dépôt Artifact Registry pour stocker les images Docker pour le job de nettoyage:

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

Créez une image de conteneur à l'aide de Cloud Build et transférez-la vers Artifact Registry en une seule commande:

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

Exemple de résultat :

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

Une fois la publication terminée, accédez à Artifact Registry et examinez l'image publiée:

fb95ae38baa7c543.png

Revenez au deuxième onglet Cloud Shell. Exécutez la commande suivante pour décrire le service Menu et enregistrer l'URL dans la variable d'environnement. Cette variable d'environnement sera utilisée pour configurer le job Cloud Run.

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

Créez un job Cloud Run pour nettoyer les éléments de menu ayant échoué et datant de plus d'une minute [définis par 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

Exemple de résultat :

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.

Accédez à la section JOBS Cloud Run de la console et examinez le job créé.

Cliquez sur le job et consultez les onglets disponibles: HISTORIQUE, JOURNAUX, CONFIGURATION et YAML.

b12c8e312de3b66.png

Vérifiez que les variables d'environnement ont bien été définies en consultant la section CONFIGURATION du job dans la console:

724c2919d05349c8.png

(Facultatif) Une fois le job Cloud Run créé, vous pouvez utiliser la commande de mise à jour si vous souhaitez modifier les variables "Âge de l'article ayant échoué" ou "URL du service de menu" :

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

Pour valider le job, exécutez le job Cloud Run en exécutant la commande suivante:

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

Exemple de résultat :

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
 

Passez à l'onglet JOURNAUX pour examiner le résultat de la tâche. L'âge de l'article ayant échoué et l'URL du service de menu devraient s'afficher dans les journaux.

518cb00036a2561f.png

5. Configurer une programmation pour un job Cloud Run

Cloud Scheduler est un planificateur de tâches Cron entièrement géré, spécialement conçu pour les entreprises. Il vous permet de planifier pratiquement n'importe quelle tâche, y compris les tâches par lots et celles de big data, les opérations d'infrastructure cloud, etc.

Une bonne pratique de sécurité lorsque vous travaillez avec un job Cloud Scheduler consiste à exécuter chaque job avec des identifiants distincts. Au cours de cette étape, vous allez créer un compte de service qui sera utilisé par la tâche du planificateur de nettoyage.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Le job Cloud Scheduler nécessite des autorisations pour appeler les jobs Cloud Run.

Attribuez le rôle Cloud Run Invoker au compte de service utilisé dans la tâche Cloud Scheduler:

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

Vous allez maintenant planifier l'exécution du job de service de nettoyage.

Cloud Scheduler accepte plusieurs types de cibles.

  • HTTP
  • Pub/Sub
  • HTTP App Engine

Vous allez créer une tâche de planificateur à l'aide du type de cible HTTP.

À titre de démonstration, vous allez planifier son exécution toutes les 5 minutes.

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

Examinez le paramètre uri utilisé pour appeler le job Cloud Run:

  • REGION et PROJECT_ID : région Cloud Run et ID du projet dans lequel le job de service de nettoyage est déployé
  • cleanup-service : nom du job Cloud Run

Accédez à Cloud Scheduler dans la console pour examiner la tâche de planification créée:

3bc9120df7fc6ed.png

Examinez les options disponibles dans le menu "Actions".

7945908025dd2f2b.png

6. Tester le job Cloud Run

À l'aide des points de terminaison du service Menu, examinez les éléments de menu existants et leur état:

curl ${MENU_SERVICE_URL}/menu | jq

Sortie :

Trois éléments de menu sont associés à l'état Ready.

Remplacez l'état de l'élément de menu 1 par Failed:

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

Patientez 1 minute. Pour que l'élément de menu puisse être supprimé, il doit dater d'une minute, comme défini par le paramètre FAILED_ITEM_AGE.

Vous pouvez attendre la prochaine exécution planifiée ou forcer l'exécution du job depuis la console.

Il existe plusieurs façons de déclencher une tâche, via l'interface utilisateur ou la ligne de commande.

Dans cet exemple, exécutez la commande dans Cloud Shell(option n° 3) pour déclencher le job.

  1. Dans Cloud Scheduler, en sélectionnant "Forcer l'exécution d'un job" dans le menu "Actions".

6c8cbeae6165ba4a.png

  1. Dans Cloud Run Job (Tâche Cloud Run), cliquez sur "EXECUTE" (Exécuter). .

229c22288882b5c3.png

  1. Depuis Cloud Shell, exécutez la commande suivante:
gcloud beta run jobs execute cleanup-service --region=$REGION

Accédez à la section JOBS Cloud Run, ouvrez l'onglet JOURNAUX et vérifiez que l'élément de menu a été supprimé.

50829ae27b135b2d.png

Filtrer les journaux par "suppression" pour trouver les journaux.

d94fb9e444b1c1b8.png

Utilisez les points de terminaison du service Menu pour vérifier les éléments de menu existants via le point de terminaison REST.

curl ${MENU_SERVICE_URL}/menu | jq

Sortie :

Deux éléments de menu sont associés à l'état Ready.

7. Félicitations !

Félicitations, vous avez terminé cet atelier de programmation.

Points abordés

  • Créer des jobs Cloud Run
  • Exécuter des jobs Cloud Run
  • Créer des jobs Cloud Scheduler
  • Vérifier l'exécution des tâches

Étapes suivantes :

Découvrez d'autres ateliers de programmation Cymbal Eats:

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez chaque ressource individuellement.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.