Déclencher des jobs Cloud Run avec Cloud Scheduler

1. Présentation

Dans cet atelier, vous allez créer une tâche Cloud Run et configurer une tâche Cloud Scheduler. Vous allez déployer le service de menu Cymbal Eats à l'aide du script de configuration. Vous allez créer une tâche Cloud Run qui appelle des API du service de menu Cymbal Eats. Vous allez exécuter la tâche à l'aide de Google Cloud CLI et configurer un calendrier pour la tâche. Vous allez vérifier l'exécution en examinant les journaux et en effectuant des appels d'API au service de menu pour vous assurer que les éléments de menu ont été supprimés.

Que sont les tâches Cloud Run ?

Une tâche Cloud Run exécute un conteneur qui ne répond pas aux requêtes Web, mais exécute des tâches opérationnelles ou le traitement de données. Le conteneur exécute la tâche et se ferme une fois qu'elle est terminée.

Tâche de service de nettoyage

Le job de service de nettoyage récupère les éléments de menu dont l'état est "Échec" et les supprime. Lorsque de nouveaux éléments de menu sont créés, des images sont analysées à l'aide de l'API Vision pour déterminer s'il s'agit d'un aliment ou non. Pour les images qui échouent à cette validation, l'état des éléments de menu est 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 tâches Cloud Run
  • Exécuter des tâches Cloud Run
  • Créer des tâches Cloud Scheduler
  • Vérifier l'exécution des tâches

Prérequis

  • Dans cet atelier, nous considérons que vous connaissez la console Cloud et les environnements de shell.
  • Une expérience préalable avec Cloud Run et Cloud Scheduler est utile, mais n'est 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 mettre à jour à 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 (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. 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 désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. 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 Menu dans Cloud Run à l'aide du script de configuration. Le service Menu est un microservice Java créé avec le framework Quarkus et utilisant la base de données PostgreSQL Cloud SQL comme backend. Le service Menu est une dépendance d'exécution pour la tâche Cloud Run que vous allez créer dans les étapes suivantes.

./setup.sh

Le déploiement prendra environ 10 minutes pour créer tous les composants requis.

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

3. Explorer le code de 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 constituent la tâche:

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, listé ci-dessous, contient des commandes permettant d'obtenir la liste des éléments de menu en échec et de les supprimer en effectuant des appels d'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 concernant le script:

  • Les variables d'environnement FAILED_ITEM_AGE et MENU_SERVICE_URL seront définies lors du déploiement et transmises par la tâche Cloud Run.
  • FAILED_ITEM_AGE : nombre de minutes avant la suppression de l'élément "Échec".
  • MENU_SERVICE_URL : URL du service de menu Cymbal Eats.

4. Créer une tâche Cloud Run

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

Cette image de conteneur sera utilisée pour créer une tâche 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 à utiliser pour la tâche 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 transmettez-la à 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 une variable d'environnement. Cette variable d'environnement sera utilisée pour configurer la tâche 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 qui ont échoué et qui datent de plus d'une minute [défini 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 (Tâches) de Cloud Run dans la console, puis examinez la tâche créée.

Cliquez sur la tâche et explorez les onglets disponibles: HISTORIQUE, JOURNALS, CONFIGURATION et YAML.

b12c8e312de3b66.png

Vérifiez que les variables d'environnement ont été définies en examinant la section CONFIGURATION de la tâche dans la console:

724c2919d05349c8.png

(Facultatif) Si vous souhaitez modifier les variables "Age de l'élément non traité" ou "URL du service de menu", après la création de la tâche Cloud Run, vous pouvez utiliser la commande de mise à jour:

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 la tâche, exécutez la tâche Cloud Run à l'aide de 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
 

Accédez à l'onglet LOGS (JOURNAUX) pour examiner le résultat de la tâche. L'âge de l'élément ayant échoué et l'URL du service de menu doivent s'afficher dans les journaux.

518cb00036a2561f.png

5. Configurer une planification pour une tâche 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.

Il est recommandé d'exécuter chaque tâche avec des identifiants distincts pour des raisons de sécurité. À cette étape, créez un compte de service à utiliser par la tâche de planification de nettoyage.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Le job Cloud Scheduler aura besoin d'autorisations pour effectuer des appels aux 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 ensuite configurer une planification pour exécuter la tâche de service de nettoyage.

Cloud Scheduler est compatible avec plusieurs types de cibles.

  • HTTP
  • Pub/Sub
  • HTTP App Engine

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

À des fins de démonstration, vous allez le planifier pour qu'il s'exécute toutes les cinq 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 la tâche Cloud Run:

  • REGION et PROJECT_ID : région Cloud Run et ID de projet dans lesquels la tâche de service de nettoyage est déployée
  • 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

Consultez les options disponibles dans le menu "Actions".

7945908025dd2f2b.png

6. Job Cloud Run de test

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

curl ${MENU_SERVICE_URL}/menu | jq

Sortie :

Trois éléments de menu sont affichés avec l'état Ready.

Modifier l'état de l'élément de menu 1 sur Failed:

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

Patientez une minute. Pour que l'élément de menu soit supprimé, il doit avoir une durée d'une minute, comme défini par le paramètre FAILED_ITEM_AGE.

Vous pouvez attendre l'exécution planifiée suivante ou forcer l'exécution de la tâche à partir de la console.

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

Pour cet exemple, exécutez la commande dans Cloud Shell(option 3) pour déclencher la tâche.

  1. Dans Cloud Scheduler, sélectionnez "Forcer l'exécution d'une tâche" dans le menu "Actions".

6c8cbeae6165ba4a.png

  1. Dans Cloud Run Job (Job Cloud Run), cliquez sur le bouton "EXECUTE" (EXÉCUTER).

229c22288882b5c3.png

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

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

50829ae27b135b2d.png

Filtrez les journaux pour trouver le mot clé "deleting" (suppression).

d94fb9e444b1c1b8.png

Utilisez les points de terminaison du service de 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 affichés avec l'état Ready.

7. Félicitations !

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

Points abordés

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

Étapes suivantes :

Découvrez les 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.