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 Cymbal Eats Menu Service mithilfe des Setupskripts bereit. Sie erstellen einen Cloud Run-Job, der API-Aufrufe an den Cymbal Eats Menu Service sendet. Sie führen den Job mit der Google Cloud CLI aus und richten einen Zeitplan für den Job ein. Sie überprüfen die Ausführung, indem Sie Protokolle prüfen und API-Aufrufe an den Menu Service senden, um zu bestätigen, dass die Menüpunkte gelöscht wurden.

Was sind Cloud Run-Jobs?

Ein Cloud Run-Job führt einen Container aus, der keine Webanfragen verarbeitet, sondern operative Aufgaben oder die Datenverarbeitung ausführt. Der Container führt die Aufgabe aus und wird beendet, wenn sie abgeschlossen ist.

Dienst bereinigen

Der Bereinigungsdienstjob ruft Menüelemente mit dem Status „Fehlgeschlagen“ ab und löscht sie. Beim Erstellen neuer Speisen und Getränke werden die Bilder mit der Vision API analysiert, um festzustellen, ob es sich um eine Speise handelt oder nicht. Bei Images, die diese Validierung nicht bestehen, wird der Status der Menüpunkte 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
  • Ausführung von Jobs prüfen

Vorbereitung

  • Für dieses Lab wird davon ausgegangen, dass Sie mit der Cloud Console und mit Shell-Umgebungen vertraut sind.
  • Frühere Erfahrungen 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 Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du dich auf die Projekt-ID beziehen, die üblicherweise als PROJECT_ID gekennzeichnet ist. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID erstellen. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen 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. Dieses Codelab sollte ohne großen Aufwand betrieben werden. Wenn Sie Ressourcen herunterfahren möchten, um über diese Anleitung hinaus keine Kosten zu verursachen, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Google Cloud-Nutzer haben Anspruch auf eine kostenlose Testversion von 300$.

Umgebung einrichten

Aktivieren Sie Cloud Shell, indem Sie auf das Symbol rechts neben der Suchleiste klicken.

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 mithilfe des Setupskripts für Cloud Run bereit. Der Menüdienst ist ein Java-basierter Mikrodienst, der mit dem Quarkus-Framework erstellt wurde und als Back-End die Postgres-Datenbank von Cloud SQL verwendet. Der Menüdienst ist eine Laufzeitabhängigkeit für den Cloud Run-Job, den Sie in den folgenden Schritten erstellen.

./setup.sh

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

Nachdem Sie den obigen Befehl ausgeführt haben, fahren Sie mit den nächsten Schritten fort.

3. Cloud Run-Jobcode kennenlernen

Klicken Sie auf das Pluszeichen, um einen neuen Tab in Cloud Shell zu öffnen.

45f480cd1b9a995.png

Wechseln Sie in das Verzeichnis, das den Bereinigungsdienst enthält, und überprü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 Bereinigungsdienstjob 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 eigentliche Bereinigungsskript, das unten aufgeführt ist, 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 für das Skript:

  • 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, bis Elemente mit Fehlern gelöscht werden.
  • MENU_SERVICE_URL – URL des Speiseangebots von Cymbal Eats

4. Cloud Run-Job erstellen

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

Dieses Container-Image wird zum Erstellen eines Cloud Run-Jobs verwendet.

Aktivieren Sie Dienst-APIs:

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, um Docker-Images für den Bereinigungsjob zu speichern:

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

Erstellen Sie das Container-Image mit Cloud Build und übertragen Sie es mit einem einzigen Befehl an Artifact Registry:

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 der Umgebungsvariablen zu speichern. Diese Umgebungsvariable wird zum Konfigurieren des Cloud Run-Jobs verwendet.

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 Abschnitt JOBS von Cloud Run auf und prüfen Sie den erstellten Job.

Klicken Sie auf den Job und sehen Sie sich die verfügbaren Tabs an: HISTORY, LOGS, CONFIGURATION und YAML.

b12c8e312de3b66.png

Überprüfen Sie, ob die Umgebungsvariablen festgelegt wurden. Sehen Sie sich dazu in der Konsole den Abschnitt CONFIGURATION des Jobs an:

724c2919d05349c8.png

Optional: Wenn Sie die URL-Variablen für das Attribut „Alter fehlgeschlagen“ oder den Menüdienst ä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 den Job 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 dann das Alter des Artikels und die URL für die Speisekartenservice-URL 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 Best Practice für die Sicherheit 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 Bereinigungsplaner verwendet wird.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Der Cloud Scheduler-Job benötigt Berechtigungen zum Aufrufen von Cloud Run-Jobs.

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

Cloud Scheduler unterstützt mehrere Zieltypen.

  • HTTP
  • Pub/Sub
  • App Engine HTTP

Sie erstellen einen Planerjob mit dem HTTP-Zieltyp.

Zu Demonstrationszwecken planen Sie eine Ausführung alle 5 Minuten.

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

Prüfen Sie den Parameter uri, der zum Aufrufen des Cloud Run-Jobs verwendet wird:

  • REGION und PROJECT_ID – Cloud Run-Region und Projekt-ID, in der der Bereinigungsdienstjob bereitgestellt wird
  • cleanup-service – Name des Cloud Run-Jobs

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

3bc9120df7fc6ed.png

Sehen Sie sich die verfügbaren Optionen im Menü „Aktionen“ an.

7945908025dd2f2b.png

6. Cloud Run-Job testen

Prüfen Sie die vorhandenen Menüpunkte und ihren Status mithilfe der Menu Service-Endpunkte:

curl ${MENU_SERVICE_URL}/menu | jq

Ausgabe:

Sie sehen 3 Menüpunkte im Status „Ready“.

Ändere den Status von Menüpunkt Nr. 1 zu Failed:

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äß den Einstellungen des FAILED_ITEM_AGE-Parameters 1 Minute alt sein.

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

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

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

  1. Wählen Sie in Cloud Scheduler die Option „Jobausführung erzwingen“ aus. aus dem Menü „Aktionen“ aus.

6c8cbeae6165ba4a.png

  1. Klicken Sie in Cloud Run Job auf „AUSFÜHREN“. Schaltfläche.

229c22288882b5c3.png

  1. In Cloud Shell mit dem folgenden Befehl:
gcloud beta run jobs execute cleanup-service --region=$REGION

Gehen Sie zum Abschnitt „Cloud Run-JOBS“, öffnen Sie den Tab LOGS und prüfen Sie, ob der Menüpunkt gelöscht wurde.

50829ae27b135b2d.png

Logs nach „Löschen“ filtern um die Protokolle zu finden.

d94fb9e444b1c1b8.png

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

curl ${MENU_SERVICE_URL}/menu | jq

Ausgabe:

Sie sehen zwei Menüpunkte im Status „Ready“.

7. Glückwunsch!

Glückwunsch, du hast das Codelab abgeschlossen.

Behandelte Themen:

  • Cloud Run-Jobs erstellen
  • Cloud Run-Jobs ausführen
  • Cloud Scheduler-Jobs erstellen
  • So prüfen Sie die Ausführung von Jobs

Nächste Schritte:

Weitere Codelabs von Cymbal Eats:

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.