1. Einführung

Mit Workflows können Sie serverlose Workflows erstellen, die eine Reihe von serverlosen Aufgaben in einer von Ihnen definierten Reihenfolge verknüpfen. Sie können die Leistungsfähigkeit der APIs von Google Cloud, serverlose Produkte wie Cloud Functions und Cloud Run sowie Aufrufe von externen APIs kombinieren, um flexible serverlose Anwendungen zu erstellen.
Workflows erfordern keine Infrastrukturverwaltung und skalieren nahtlos mit der Nachfrage, einschließlich der Skalierung auf null. Mit dem nutzungsbasierten Preismodell zahlen Sie nur für die Ausführungszeit.
In diesem Codelab erfahren Sie, wie Sie verschiedene Google Cloud-Dienste und externe HTTP-APIs mit Workflows verbinden. Konkret verbinden Sie zwei öffentliche Cloud Functions-Dienste, einen privaten Cloud Run-Dienst und eine externe öffentliche HTTP API in einem Workflow.
Lerninhalte
- Grundlagen von Workflows
- So stellen Sie eine Verbindung zwischen öffentlichen Cloud Functions und Workflows her.
- Private Cloud Run-Dienste mit Workflows verbinden
- Externe HTTP-APIs mit Workflows verbinden
2. Einrichtung und Anforderungen
Einrichtung der Umgebung im eigenen Tempo
- Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie eines erstellen.
Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird später in diesem Codelab als PROJECT_ID bezeichnet.
- Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.
Die Ausführung dieses Codelabs sollte nur wenige Kosten verursachen, wenn überhaupt. Folgen Sie unbedingt der Anleitung im Abschnitt „Bereinigen“, um Ressourcen herunterzufahren, damit keine weiteren Kosten anfallen. Neuen Nutzern der Google Cloud Platform steht das kostenlose Testprogramm mit einem Guthaben von 300$ zur Verfügung.
Cloud Shell starten
Sie können Google Cloud zwar per Fernzugriff von Ihrem Laptop aus nutzen, in diesem Codelab verwenden Sie jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.
Klicken Sie in der GCP Console oben rechts in der Symbolleiste auf das Cloud Shell-Symbol:
Die Bereitstellung und Verbindung mit der Umgebung sollte nur wenige Minuten dauern. Wenn der Vorgang abgeschlossen ist, sollte in etwa Folgendes angezeigt werden:
Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf Google Cloud. Dadurch werden Netzwerkleistung und Authentifizierung erheblich verbessert. Für die Arbeit in diesem Lab benötigen Sie nur einen Browser.
3. Workflows – Übersicht
Grundlagen
Ein Workflow besteht aus einer Reihe von Schritten, die mit der YAML-basierten Workflows-Syntax beschrieben werden. Dies ist die Definition des Workflows. Eine ausführliche Erläuterung der YAML-Syntax für Workflows finden Sie auf der Seite Syntaxreferenz.
Nachdem ein Workflow erstellt wurde, wird er bereitgestellt. Dadurch ist er für die Ausführung bereit. Eine Ausführung ist ein einzelner Durchlauf der Logik, die in der Definition eines Workflows enthalten ist. Alle Workflowausführungen sind unabhängig und das Produkt unterstützt eine hohe Anzahl gleichzeitiger Ausführungen.
Dienste aktivieren
In diesem Codelab verbinden Sie Cloud Functions- und Cloud Run-Dienste mit Workflows. Außerdem verwenden Sie Cloud Build und Cloud Storage beim Erstellen von Diensten.
Aktivieren Sie alle erforderlichen Dienste:
gcloud services enable \ cloudfunctions.googleapis.com \ run.googleapis.com \ workflows.googleapis.com \ cloudbuild.googleapis.com \ storage.googleapis.com
Im nächsten Schritt verbinden Sie zwei Cloud Functions in einem Workflow.
4. Erste Cloud Functions-Funktion bereitstellen
Die erste Funktion ist ein Zufallszahlengenerator in Python.
Erstellen Sie ein Verzeichnis für den Funktionscode und wechseln Sie zu diesem:
mkdir ~/randomgen cd ~/randomgen
Erstellen Sie im Verzeichnis eine main.py-Datei mit folgendem Inhalt:
import random, json
from flask import jsonify
def randomgen(request):
randomNum = random.randint(1,100)
output = {"random":randomNum}
return jsonify(output)
Wenn diese Funktion eine HTTP-Anfrage empfängt, generiert sie eine zufällige Zahl zwischen 1 und 100 und gibt sie im JSON-Format an den Aufrufer zurück.
Die Funktion verwendet Flask für die HTTP-Verarbeitung und wir müssen diese Abhängigkeit hinzufügen. Abhängigkeiten in Python werden mit pip verwaltet und in einer Metadatendatei mit dem Namen requirements.txt ausgedrückt.
Erstellen Sie im selben Verzeichnis eine requirements.txt-Datei mit folgendem Inhalt:
flask>=1.0.2
Stellen Sie die Funktion mit einem HTTP-Trigger bereit und erlauben Sie mit diesem Befehl nicht authentifizierte Anfragen:
gcloud functions deploy randomgen \
--runtime python312 \
--trigger-http \
--allow-unauthenticated
Nachdem die Funktion bereitgestellt wurde, sehen Sie die URL der Funktion unter dem Attribut url in der Console oder mit dem Befehl gcloud functions describe.
Sie können diese URL der Funktion auch mit dem folgenden curl-Befehl aufrufen:
curl $(gcloud functions describe randomgen --format='value(url)')
Die Funktion ist für den Workflow bereit.
5. Zweite Cloud Functions-Funktion bereitstellen
Die zweite Funktion ist ein Multiplikator. Die empfangene Eingabe wird mit 2 multipliziert.
Erstellen Sie ein Verzeichnis für den Funktionscode und wechseln Sie zu diesem:
mkdir ~/multiply cd ~/multiply
Erstellen Sie im Verzeichnis eine main.py-Datei mit folgendem Inhalt:
import random, json
from flask import jsonify
def multiply(request):
request_json = request.get_json()
output = {"multiplied":2*request_json['input']}
return jsonify(output)
Wenn diese Funktion eine HTTP-Anfrage empfängt, extrahiert sie den input aus dem JSON-Text, multipliziert ihn mit 2 und gibt ihn im JSON-Format an den Aufrufer zurück.
Erstellen Sie dieselbe requirements.txt-Datei im selben Verzeichnis mit folgendem Inhalt:
flask>=1.0.2
Stellen Sie die Funktion mit einem HTTP-Trigger bereit und erlauben Sie mit diesem Befehl nicht authentifizierte Anfragen:
gcloud functions deploy multiply \
--runtime python312 \
--trigger-http \
--allow-unauthenticated
Nachdem die Funktion bereitgestellt wurde, können Sie diese URL auch mit dem folgenden curl-Befehl aufrufen:
curl $(gcloud functions describe multiply --format='value(url)') \
-X POST \
-H "content-type: application/json" \
-d '{"input": 5}'
Die Funktion ist für den Workflow bereit.
6. Zwei Cloud Functions verbinden
Verbinden Sie im ersten Workflow die beiden Funktionen miteinander.
Erstellen Sie eine workflow.yaml-Datei mit folgendem Inhalt:
- randomgenFunction:
call: http.get
args:
url: https://<region>-<project-id>.cloudfunctions.net/randomgen
result: randomgenResult
- multiplyFunction:
call: http.post
args:
url: https://<region>-<project-id>.cloudfunctions.net/multiply
body:
input: ${randomgenResult.body.random}
result: multiplyResult
- returnResult:
return: ${multiplyResult}
In diesem Workflow wird eine Zufallszahl von der ersten Funktion abgerufen und an die zweite Funktion übergeben. Das Ergebnis ist die multiplizierte Zufallszahl.
Stellen Sie den ersten Workflow bereit:
gcloud workflows deploy workflow --source=workflow.yaml
Führen Sie den ersten Workflow aus:
gcloud workflows execute workflow
Nachdem der Workflow ausgeführt wurde, können Sie das Ergebnis sehen, indem Sie die im vorherigen Schritt angegebene Ausführungs-ID übergeben:
gcloud workflows executions describe <your-execution-id> --workflow workflow
Die Ausgabe enthält result und state:
result: '{"body":{"multiplied":108},"code":200 ... }
...
state: SUCCEEDED
7. Externe HTTP-API verbinden
Als Nächstes verbinden Sie math.js als externen Dienst im Workflow.
In math.js können Sie mathematische Ausdrücke so berechnen:
curl https://api.mathjs.org/v4/?'expr=log(56)'
Dieses Mal aktualisieren Sie den Workflow über die Cloud Console. Workflows in der Google Cloud Console aufrufen:

Suchen Sie Ihren Workflow und klicken Sie auf den Tab Definition.

Bearbeiten Sie die Workflowdefinition und fügen Sie einen Aufruf von math.js hinzu.
- randomgenFunction:
call: http.get
args:
url: https://<region>-<project-id>.cloudfunctions.net/randomgen
result: randomgenResult
- multiplyFunction:
call: http.post
args:
url: https://<region>-<project-id>.cloudfunctions.net/multiply
body:
input: ${randomgenResult.body.random}
result: multiplyResult
- logFunction:
call: http.get
args:
url: https://api.mathjs.org/v4/
query:
expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"}
result: logResult
- returnResult:
return: ${logResult}
Der Workflow gibt die Ausgabe der Multiplikationsfunktion jetzt in einen Log-Funktionsaufruf in math.js ein.
Die Benutzeroberfläche führt Sie durch die Bearbeitung und Bereitstellung des Workflows. Klicken Sie nach der Bereitstellung auf Execute, um den Workflow auszuführen. Die Ausführungsdetails werden angezeigt:

Beachten Sie den Statuscode 200 und ein body in der Ausgabe der Log-Funktion.
Sie haben gerade einen externen Dienst in unseren Workflow eingebunden. Super!
8. Cloud Run-Dienst bereitstellen
Im letzten Teil schließen Sie den Workflow mit einem Aufruf eines privaten Cloud Run-Dienstes ab. Das bedeutet, dass der Workflow authentifiziert werden muss, um den Cloud Run-Dienst aufzurufen.
Der Cloud Run-Dienst gibt den math.floor der übergebenen Zahl zurück.
Erstellen Sie ein Verzeichnis für den Dienstcode und rufen Sie es auf:
mkdir ~/floor cd ~/floor
Erstellen Sie im Verzeichnis eine app.py-Datei mit folgendem Inhalt:
import json
import logging
import os
import math
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['POST'])
def handle_post():
content = json.loads(request.data)
input = float(content['input'])
return f"{math.floor(input)}", 200
if __name__ != '__main__':
# Redirect Flask logs to Gunicorn logs
gunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level)
app.logger.info('Service started...')
else:
app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
Cloud Run stellt Container bereit, daher benötigen Sie eine Dockerfile und Ihr Container muss an die Umgebungsvariablen 0.0.0.0 und PORT gebunden sein. Daher der Code oben.
Wenn diese Funktion eine HTTP-Anfrage empfängt, extrahiert sie den input aus dem JSON-Text, ruft math.floor auf und gibt das Ergebnis an den Aufrufer zurück.
Erstellen Sie im selben Verzeichnis die folgende Dockerfile:
# Use an official lightweight Python image. # https://hub.docker.com/_/python FROM python:3.7-slim # Install production dependencies. RUN pip install Flask gunicorn # Copy local code to the container image. WORKDIR /app COPY . . # Run the web service on container startup. Here we use the gunicorn # webserver, with one worker process and 8 threads. # For environments with multiple CPU cores, increase the number of workers # to be equal to the cores available. CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app
Erstellen Sie den Container:
export SERVICE_NAME=floor
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
Nachdem der Container erstellt wurde, können Sie ihn in Cloud Run bereitstellen. Beachten Sie das Flag no-allow-unauthenticated. So wird sichergestellt, dass der Dienst nur authentifizierte Aufrufe akzeptiert:
gcloud run deploy ${SERVICE_NAME} \
--image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
--platform managed \
--no-allow-unauthenticated
Nach der Bereitstellung ist der Dienst für den Workflow bereit.
9. Cloud Run-Dienst verbinden
Bevor Sie Workflows für den Aufruf des privaten Cloud Run-Dienstes konfigurieren können, müssen Sie ein Dienstkonto für Workflows erstellen:
export SERVICE_ACCOUNT=workflows-sa
gcloud iam service-accounts create ${SERVICE_ACCOUNT}
Weisen Sie dem Dienstkonto die Rolle run.invoker zu. Dadurch kann das Dienstkonto authentifizierte Cloud Run-Dienste aufrufen:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
--member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
--role "roles/run.invoker"
Aktualisieren Sie die Workflowdefinition in workflow.yaml, um den Cloud Run-Dienst einzubeziehen. Beachten Sie, dass Sie auch das Feld auth angeben, damit Workflows das Authentifizierungstoken in seinen Aufrufen an den Cloud Run-Dienst übergeben:
- randomgenFunction:
call: http.get
args:
url: https://<region>-<project-id>.cloudfunctions.net/randomgen
result: randomgenResult
- multiplyFunction:
call: http.post
args:
url: https://<region>-<project-id>.cloudfunctions.net/multiply
body:
input: ${randomgenResult.body.random}
result: multiplyResult
- logFunction:
call: http.get
args:
url: https://api.mathjs.org/v4/
query:
expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"}
result: logResult
- floorFunction:
call: http.post
args:
url: https://floor-<random-hash>.run.app
auth:
type: OIDC
body:
input: ${logResult.body}
result: floorResult
- returnResult:
return: ${floorResult}
Aktualisieren Sie den Workflow. Diesmal wird das Dienstkonto übergeben:
gcloud workflows deploy workflow \
--source=workflow.yaml \
--service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
Führen Sie den Workflow aus:
gcloud workflows execute workflow
Nach wenigen Sekunden können Sie sich die Workflowausführung ansehen, um das Ergebnis zu sehen:
gcloud workflows executions describe <your-execution-id> --workflow workflow
Die Ausgabe enthält die Ganzzahl result und state:
result: '{"body":"5","code":200 ... }
...
state: SUCCEEDED
10. Glückwunsch!
Herzlichen Glückwunsch zum Abschluss des Codelabs.
Behandelte Themen
- Grundlagen von Workflows
- So stellen Sie eine Verbindung zwischen öffentlichen Cloud Functions und Workflows her.
- Private Cloud Run-Dienste mit Workflows verbinden
- Externe HTTP-APIs mit Workflows verbinden