1. Einführung
Mit Workflows können Sie serverlose Workflows erstellen, die eine Reihe von serverlosen Aufgaben in einer von Ihnen definierten Reihenfolge miteinander verknüpfen. Sie können die Leistungsfähigkeit der APIs von Google Cloud, serverlose Produkte wie Cloud Functions und Cloud Run sowie Aufrufe externer APIs kombinieren, um flexible, serverlose Anwendungen zu erstellen.
Workflows erfordern kein Infrastrukturmanagement und lassen sich nahtlos bedarfsgerecht skalieren, einschließlich einer 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. Genauer gesagt verbinden Sie zwei öffentliche Cloud Functions-Dienste, einen privaten Cloud Run-Dienst und eine externe öffentliche HTTP API, mit einem Workflow.
Lerninhalte
- Grundlagen von Workflows.
- Öffentliche Cloud Functions-Funktionen mit Workflows verbinden
- Private Cloud Run-Dienste mit Workflows verbinden
- Externe HTTP APIs mit Workflows verbinden
2. Einrichtung und Anforderungen
Umgebung für das selbstbestimmte Lernen einrichten
- Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie ein Konto 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 in diesem Codelab später als PROJECT_ID
bezeichnet.
- Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen nutzen zu können.
Dieses Codelab sollte möglichst wenig kosten. Folgen Sie der Anleitung im Abschnitt „Bereinigen“, . Hier erfahren Sie, wie Sie Ressourcen herunterfahren, damit Ihnen über dieses Tutorial hinaus keine Kosten entstehen. Neue Google Cloud-Nutzer können an einem kostenlosen Testzeitraum mit 300$Guthaben teilnehmen.
Cloud Shell starten
Sie können Google Cloud zwar von Ihrem Laptop aus der Ferne bedienen, 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 dauert nur einen Moment. Wenn er abgeschlossen ist, sollten Sie in etwa Folgendes sehen:
Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf Google Cloud, wodurch die Netzwerkleistung und Authentifizierung erheblich verbessert werden. Sie können alle Aufgaben in diesem Lab ganz einfach in einem Browser erledigen.
3. Workflows – Übersicht
Grundlagen
Ein Workflow besteht aus einer Reihe von Schritten, die mithilfe 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.
Wenn ein Workflow erstellt wird, wird er bereitgestellt und kann nun ausgeführt werden. 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 von gleichzeitigen 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-Funktionen 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 rufen Sie es auf:
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 sie eine HTTP-Anfrage empfängt, generiert diese Funktion eine Zufallszahl zwischen 1 und 100 und gibt sie im JSON-Format an den Aufrufer zurück.
Die Funktion stützt sich auf Flask für die HTTP-Verarbeitung und wir müssen dies als Abhängigkeit hinzufügen. Abhängigkeiten in Python werden mit pip verwaltet und in einer Metadatendatei namens 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 und mit dem folgenden Befehl zugelassene nicht authentifizierte Anfragen bereit:
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
Sobald die Funktion bereitgestellt ist, können Sie die URL der Funktion unter dem Attribut httpsTrigger.url
in der Konsole oder mit dem Befehl gcloud functions describe
sehen.
Sie können diese URL der Funktion auch mit dem folgenden curl
-Befehl aufrufen:
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
Die Funktion ist bereit für den Workflow.
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 rufen Sie es auf:
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 sie eine HTTP-Anfrage empfängt, extrahiert diese Funktion input
aus dem JSON-Text, multipliziert sie mit 2 und gibt das 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 und mit dem folgenden Befehl zugelassene nicht authentifizierte Anfragen bereit:
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
Nachdem die Funktion bereitgestellt wurde, können Sie die URL der Funktion auch mit dem folgenden curl
-Befehl aufrufen:
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
Die Funktion ist bereit für den Workflow.
6. Zwei Cloud Functions-Funktionen verbinden
Verbinden Sie im ersten Workflow die beiden Funktionen.
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}
Bei diesem Workflow erhalten Sie eine Zufallszahl aus der ersten Funktion und übergeben sie an die zweite Funktion. 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
Sobald 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 auswerten:
curl https://api.mathjs.org/v4/?'expr=log(56)'
Dieses Mal verwenden Sie die Cloud Console, um unseren Workflow zu aktualisieren. Suchen Sie Workflows
in der Google Cloud Console:
Suchen Sie Ihren Workflow und klicken Sie auf den Tab Definition
:
Bearbeiten Sie die Workflowdefinition und fügen Sie einen Aufruf von math.js
ein.
- 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 fließt jetzt die Ausgabe der Multiplikationsfunktion in einen Logfunktionsaufruf 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 Details der Ausführung werden angezeigt:
Beachten Sie die Statuscodes 200
und body
mit der Ausgabe der Logfunktion.
Sie haben gerade einen externen Dienst in unseren Workflow integriert, super cool!
8. Cloud Run-Dienst bereitstellen
Im letzten Teil schließen Sie den Workflow mit einem Aufruf eines privaten Cloud Run-Dienstes ab. Dies bedeutet, dass der Workflow authentifiziert werden muss, um den Cloud Run-Dienst aufzurufen.
Der Cloud Run-Dienst gibt den math.floor
der übergebenen Nummer 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. Sie benötigen also ein Dockerfile
und Ihr Container muss an die Umgebungsvariable 0.0.0.0
und PORT
gebunden werden. Daher der obige Code.
Wenn sie eine HTTP-Anfrage empfängt, extrahiert diese Funktion input
aus dem JSON-Text, ruft math.floor auf und gibt das Ergebnis an den Aufrufer zurück.
Erstellen Sie im selben Verzeichnis den folgenden 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, stellen Sie ihn in Cloud Run bereit. Beachten Sie das Flag no-allow-unauthenticated
. Dadurch 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 so konfigurieren können, dass der private Cloud Run-Dienst aufgerufen wird, 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
einfügen, damit Workflows das Authentifizierungstoken bei seinen Aufrufen an den Cloud Run-Dienst übergibt:
- 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. Dieses Mal 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
In wenigen Sekunden können Sie einen Blick auf die Workflowausführung werfen, 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.
- Öffentliche Cloud Functions-Funktionen mit Workflows verbinden
- Private Cloud Run-Dienste mit Workflows verbinden
- Externe HTTP APIs mit Workflows verbinden