Cloud Run-Jobs mit Cloud Scheduler auslösen

1. Übersicht

In diesem Lab erstellen Sie einen Cloud Run-Job und richten einen Cloud Scheduler-Job ein. Sie stellen den Menüdienst von Cymbal Eats mit dem Einrichtungsskript bereit. Sie erstellen einen Cloud Run-Job, der API-Aufrufe an den Cymbal Eats-Menüdienst sendet. Sie führen den Job mit der Google Cloud CLI aus und legen einen Zeitplan für den Job fest. Sie prüfen die Ausführung, indem Sie Logs prüfen und API-Aufrufe an den Menüdienst senden, um zu bestätigen, dass Menüpunkte gelöscht wurden.

Was sind Cloud Run-Jobs?

In einem Cloud Run-Job wird ein Container ausgeführt, der keine Webanfragen verarbeitet, sondern betriebliche Aufgaben oder die Datenverarbeitung ausführt. Der Container führt die Aufgabe aus und wird nach Abschluss beendet.

Bereinigungsauftrag

Der Job des Bereinigungsdienstes ruft Menüpunkte mit dem Status „Fehlgeschlagen“ ab und löscht sie. Wenn neue Menüpunkte erstellt werden, werden die Bilder mit der Vision API analysiert, um zu erkennen, ob es sich um ein Lebensmittel handelt oder nicht. Bei Bildern, die diese Validierung nicht bestehen, wird der Status der Menüelemente auf „Fehlgeschlagen“ aktualisiert und anschließend durch den Bereinigungsjob gelöscht.

d74200f0bd14d350.png

Lerninhalte

In diesem Lab lernen Sie Folgendes:

  • Cloud Run-Jobs erstellen
  • Cloud Run-Jobs ausführen
  • Cloud Scheduler-Jobs erstellen
  • Jobausführung prüfen

Vorbereitung

  • Für dieses Lab wird davon ausgegangen, dass Sie mit der Cloud Console und mit Shell-Umgebungen vertraut sind.
  • Vorkenntnisse mit Cloud Run und Cloud Scheduler sind hilfreich, aber nicht erforderlich.

2. Einrichtung und Anforderungen

Cloud-Projekt einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie ein Konto erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es ist ein Zeichenstring, der von Google APIs nicht verwendet wird. Sie können ihn jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und kann nach der Festlegung nicht mehr geändert werden. In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise spielt es keine Rolle, wie er lautet. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen (normalerweise als PROJECT_ID gekennzeichnet). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige generieren. Alternativ können Sie Ihr eigenes Gerät testen, um zu sehen, ob es verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/-APIs verwenden zu können. Die Ausführung dieses Codelabs sollte nur wenige Kosten verursachen, wenn überhaupt. Wenn Sie die Ressourcen deaktivieren möchten, damit keine Kosten über diese Anleitung hinaus anfallen, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neuen Nutzern der Google Cloud Platform steht das kostenlose Testprogramm mit einem Guthaben von 300$ zur Verfügung.

Umgebung einrichten

Klicken Sie zum Aktivieren von Cloud Shell auf das Symbol rechts neben der Suchleiste.

eb0157a992f16fa3.png

Führen Sie in Cloud Shell den folgenden Befehl aus, um den Anwendungscode aus diesem Repository zu klonen und zum Verzeichnis mit dem Menüdienst zu wechseln:

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

Stellen Sie den Menüdienst mit dem Einrichtungsskript in Cloud Run bereit. Der Menüdienst ist ein Java-basierter Microservice, der mit dem Quarkus-Framework erstellt wurde und die Cloud SQL Postgres-Datenbank als Back-End verwendet. Der Menüdienst ist eine Laufzeitabhängigkeit für den Cloud Run-Job, den Sie in den folgenden Schritten erstellen.

./setup.sh

Die Bereitstellung dauert etwa 10 Minuten, bis alle erforderlichen Komponenten erstellt sind.

Fahren Sie nach Ausführung des Befehls oben mit den nächsten Schritten fort.

3. Cloud Run-Jobcode

Öffnen Sie einen neuen Tab in Cloud Shell, indem Sie auf das Pluszeichen klicken.

45f480cd1b9a995.png

Rufen Sie das Verzeichnis mit dem Bereinigungsdienst auf und prüfen Sie die Dateien, aus denen der Job besteht:

cd ~/cymbal-eats/cleanup-service

Der Cleanup-Dienst in diesem Verzeichnis enthält eine Dockerfile, die das Container-Image für den Cleanup-Dienstjob mit den erforderlichen Abhängigkeiten(httpie, jq) definiert.

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"]

Das unten aufgeführte Bereinigungsskript enthält Befehle, mit denen eine Liste der Menüelemente mit dem Status „Fehlgeschlagen“ abgerufen und durch API-Aufrufe an den Menüdienst gelöscht werden kann.

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

Beachten Sie Folgendes:

  • Die Umgebungsvariablen FAILED_ITEM_AGE und MENU_SERVICE_URL werden während der Bereitstellung festgelegt und vom Cloud Run-Job übergeben.
  • FAILED_ITEM_AGE – Anzahl der Minuten, nach denen das fehlgeschlagene Element gelöscht wird.
  • MENU_SERVICE_URL: URL des Cymbal Eats-Speisekartendienstes.

4. Cloud Run-Job erstellen

Als Nächstes erstellen Sie ein Container-Image und veröffentlichen es in der Artifact Registry.

Dieses Container-Image wird verwendet, um einen Cloud Run-Job zu erstellen.

APIs für Dienste aktivieren:

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

Legen Sie Umgebungsvariablen fest:

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

Erstellen Sie ein neues Artifact Registry-Repository zum Speichern von Docker-Images für den Bereinigungsjob:

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

Mit einem Befehl ein Container-Image mit Cloud Build erstellen und in die Artifact Registry verschieben:

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

Beispielausgabe:

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

Rufen Sie nach der Veröffentlichung Artifact Registry auf und prüfen Sie das veröffentlichte Image:

fb95ae38baa7c543.png

Wechseln Sie zurück zum zweiten Cloud Shell-Tab. Führen Sie den folgenden Befehl aus, um den Menüdienst zu beschreiben und die URL in einer Umgebungsvariablen zu speichern. Mit dieser Umgebungsvariablen wird der Cloud Run-Job konfiguriert.

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

Erstellen Sie einen Cloud Run-Job, um fehlgeschlagene Menüelemente zu bereinigen, die älter als 1 Minute sind [von FAILED_ITEM_AGE festgelegt].

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

Beispielausgabe:

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.

Rufen Sie in der Console den Bereich „JOBS“ für Cloud Run auf und sehen Sie sich den erstellten Job an.

Klicken Sie auf den Job und sehen Sie sich die verfügbaren Tabs an: VERLÄUF, LOGS, Konfiguration und YAML.

b12c8e312de3b66.png

Prüfen Sie in der Console im Abschnitt KONFIGURATION des Jobs, ob die Umgebungsvariablen festgelegt wurden:

724c2919d05349c8.png

Optional: Wenn Sie die Variablen „Failed Item Age“ oder „Menu Service URL“ ändern möchten, nachdem der Cloud Run-Job erstellt wurde, können Sie den Befehl „update“ verwenden:

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

Führen Sie den Cloud Run-Job mit dem folgenden Befehl aus, um ihn zu validieren:

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

Beispielausgabe:

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
 

Wechseln Sie zum Tab LOGS, um die Ausgabe des Jobs zu überprüfen. In den Protokollen sollten das Alter des fehlgeschlagenen Artikels und die URL des Menüdienstes angezeigt werden.

518cb00036a2561f.png

5. Zeitplan für Cloud Run-Job einrichten

Cloud Scheduler ist ein vollständig verwalteter Cronjob-Planer für Unternehmen. Sie können damit praktisch jeden Job planen, einschließlich Batchjobs, Big-Data-Jobs, Cloudinfrastrukturvorgängen usw.

Eine Sicherheitsbest Practice bei der Arbeit mit einem Cloud Scheduler-Job besteht darin, jeden Job mit separaten Anmeldedaten auszuführen. Erstellen Sie in diesem Schritt ein Dienstkonto, das vom Job zum Bereinigen des Zeitplaners verwendet werden soll.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Der Cloud Scheduler-Job benötigt Berechtigungen, um Cloud Run-Jobs aufzurufen.

Weisen Sie dem Dienstkonto, das im Cloud Scheduler-Job verwendet wird, die Rolle Cloud Run Invoker zu:

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

Als Nächstes richten Sie einen Zeitplan für die Ausführung des Jobs für den Bereinigungsdienst ein.

Cloud Scheduler unterstützt mehrere Zieltypen.

  • HTTP
  • Pub/Sub
  • App Engine HTTP

Sie erstellen einen Scheduler-Job mit dem HTTP-Zieltyp.

Zu Demonstrationszwecken legen Sie fest, dass er alle 5 Minuten ausgeführt werden soll.

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

Parameter uri, der zum Aufrufen des Cloud Run-Jobs verwendet wird:

  • REGION und PROJECT_ID: Cloud Run-Region und Projekt-ID, in der der Job für den Bereinigungsdienst bereitgestellt wird
  • cleanup-service – Name des Cloud Run-Jobs

Rufen Sie in der Console Cloud Scheduler auf, um den erstellten Scheduler-Job zu überprüfen:

3bc9120df7fc6ed.png

Im Menü „Aktionen“ findest du die verfügbaren Optionen.

7945908025dd2f2b.png

6. Cloud Run-Job testen

Über die Endpunkte des Menüdienstes können Sie vorhandene Menüpunkte und ihren Status prüfen:

curl ${MENU_SERVICE_URL}/menu | jq

Ausgabe:

Sie sehen drei Menüpunkte mit dem Status Ready.

Status des Menüpunkts 1 in Failed ändern:

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

Warten Sie eine Minute. Damit der Menüpunkt gelöscht werden kann, muss er gemäß dem Parameter FAILED_ITEM_AGE eine Minute alt sein.

Sie können auf die nächste geplante Ausführung warten oder die Jobausführung über die Console erzwingen.

Es gibt mehrere Möglichkeiten, einen Job auszulösen: über die Benutzeroberfläche oder über die Befehlszeile.

Führen Sie in diesem Beispiel einen Befehl in Cloud Shell(Option 3) aus, um den Job auszulösen.

  1. In Cloud Scheduler können Sie im Menü „Aktionen“ die Option „Jobausführung erzwingen“ auswählen.

6c8cbeae6165ba4a.png

  1. Klicken Sie unter Cloud Run-Job auf die Schaltfläche „EXECUTE“ (AUSFÜHREN).

229c22288882b5c3.png

  1. Führen Sie in Cloud Shell den folgenden Befehl aus:
gcloud beta run jobs execute cleanup-service --region=$REGION

Rufen Sie den Bereich „Cloud Run JOBS“ auf, öffnen Sie den Tab LOGS und prüfen Sie, ob der Menüpunkt gelöscht wurde.

50829ae27b135b2d.png

Filtern Sie die Protokolle nach dem Keyword „deleting“, um die entsprechenden Protokolle zu finden.

d94fb9e444b1c1b8.png

Verwenden Sie die Endpunkte des Menüdienstes, um vorhandene Menüpunkte über den REST-Endpunkt zu prüfen.

curl ${MENU_SERVICE_URL}/menu | jq

Ausgabe:

Sie sehen zwei Menüpunkte mit dem Status Ready.

7. Glückwunsch!

Herzlichen Glückwunsch, Sie haben das Codelab abgeschlossen.

Behandelte Themen:

  • Cloud Run-Jobs erstellen
  • Cloud Run-Jobs ausführen
  • Cloud Scheduler-Jobs erstellen
  • Jobausführung prüfen

Nächste Schritte:

Weitere Cymbal Eats-Codelabs:

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen, das die Ressourcen enthält, oder das Projekt beibehalten und die einzelnen Ressourcen löschen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.