Workflows zum Verbinden von Diensten verwenden

In dieser Anleitung erfahren Sie, wie Sie mit Workflows eine Reihe von Diensten miteinander verknüpfen. Wenn Sie zwei öffentliche HTTP-Dienste (mit Cloud Functions), eine externe REST API und einen privaten Cloud Run-Dienst verbinden, können Sie eine flexible, serverlose Anwendung erstellen.

Ziele

In dieser Anleitung erstellen Sie einen einzelnen Workflow und verbinden jeweils einen Dienst:

  1. Stellen Sie zwei Cloud Functions-Dienste bereit: Die erste Funktion generiert eine zufällige Zahl und übergibt sie an die zweite Funktion, die sie multipliziert.
  2. Verbinden Sie mithilfe von Workflows die beiden HTTP-Funktionen. Führen Sie den Workflow aus und geben Sie ein Ergebnis zurück, das dann an eine externe API übergeben wird.
  3. Verbinden Sie mithilfe von Workflows eine externe HTTP-API, die den log für eine bestimmte Nummer zurückgibt. Führen Sie den Workflow aus und geben Sie ein Ergebnis zurück, das dann an einen Cloud Run-Dienst übergeben wird.
  4. Stellen Sie einen Cloud Run-Dienst bereit, der nur den authentifizierten Zugriff zulässt. Der Dienst gibt den math.floor für eine bestimmte Zahl zurück.
  5. Verbinden Sie mithilfe von Workflows den Cloud Run-Dienst, führen Sie den gesamten Workflow aus und geben Sie ein Endergebnis zurück.

Das folgende Diagramm bietet sowohl einen Überblick über den Prozess als auch eine Visualisierung des endgültigen Workflows:

Visualisierung des Workflows

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

Einige der Schritte in diesem Dokument funktionieren möglicherweise nicht richtig, wenn Ihre Organisation Einschränkungen auf Ihre Google Cloud-Umgebung anwendet. In diesem Fall können Sie möglicherweise keine Aufgaben wie das Erstellen öffentlicher IP-Adressen oder Dienstkontoschlüssel ausführen. Wenn Sie eine Anfrage stellen, die einen Fehler zu Einschränkungen zurückgibt, lesen Sie, wie Anwendungen in einer eingeschränkten Google Cloud-Umgebung entwickeln werden.

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, Container Registry, Workflows APIs aktivieren.

    Aktivieren Sie die APIs

  5. Installieren und initialisieren Sie das Cloud SDK.
  6. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  7. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  8. Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, Container Registry, Workflows APIs aktivieren.

    Aktivieren Sie die APIs

  9. Installieren und initialisieren Sie das Cloud SDK.
  10. Aktualisieren Sie die gcloud-Komponenten:
    gcloud components update
  11. Melden Sie sich mit Ihrem Konto an:
    gcloud auth login
  12. Erstellen Sie ein Dienstkonto für Workflows:

    export SERVICE_ACCOUNT=workflows-sa
    gcloud iam service-accounts create ${SERVICE_ACCOUNT}
    

  13. Damit das Dienstkonto authentifizierte Cloud Run-Dienste aufrufen kann, weisen Sie dem Workflows-Dienstkonto die Rolle run.invoker zu:

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

  14. Legen Sie den Standardspeicherort fest, der in dieser Anleitung verwendet wird:
    gcloud config set project PROJECT_ID
    export REGION=REGION
    gcloud config set run/region ${REGION}
    gcloud config set workflows/location ${REGION}
    

    Ersetzen Sie:

    • PROJECT_ID durch Ihre Google Cloud-Projekt-ID
    • REGION durch den unterstützten Workflows-Standort Ihrer Wahl.

Ersten Cloud Functions-Dienst bereitstellen

Nach dem Empfang einer HTTP-Anfrage generiert diese HTTP-Funktion eine zufällige Zahl zwischen 1 und 100 und gibt die Zahl im JSON-Format zurück.

  1. Erstellen Sie ein Verzeichnis mit dem Namen randomgen und rufen Sie es auf:

    mkdir ~/randomgen
    cd ~/randomgen
    
  2. Erstellen Sie eine Textdatei mit dem Dateinamen main.py, die den folgenden Python-Code enthält:

    import random, json
    from flask import jsonify
    
    def randomgen(request):
        randomNum = random.randint(1,100)
        output = {"random":randomNum}
        return jsonify(output)
  3. Erstellen Sie eine Textdatei für den pip-Paketmanager, um eine Abhängigkeit von Flask für die HTTP-Verarbeitung zu unterstützen. Geben Sie der Datei den Namen requirements.txt und fügen Sie Folgendes hinzu:

    flask>=1.0.2
    
  4. Stellen Sie die Funktion mit einem HTTP-Trigger bereit und lassen Sie nicht authentifizierten Zugriff zu:

    gcloud functions deploy randomgen \
    --runtime python37 \
    --trigger-http \
    --allow-unauthenticated
    

    Die Bereitstellung der Funktion kann einige Minuten dauern. Alternativ können Sie die Funktion über die Cloud Functions-Oberfläche in der Cloud Console bereitstellen.

  5. Nachdem die Funktion bereitgestellt wurde, können Sie das Attribut httpsTrigger.url bestätigen:

    gcloud functions describe randomgen
    
  6. Sie können die Funktion mit dem folgenden curl-Befehl ausprobieren:

    curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
    

    Es wird eine zufällige Zahl generiert und zurückgegeben.

Zweiten Cloud Functions-Dienst bereitstellen

Nach dem Empfangen einer HTTP-Anfrage extrahiert diese HTTP-Funktion den input aus dem JSON-Text, multipliziert ihn mit 2 und gibt das Ergebnis im JSON-Format zurück.

  1. Erstellen Sie ein Verzeichnis mit dem Namen multiply und rufen Sie es auf:

    mkdir ~/multiply
    cd ~/multiply
    
  2. Erstellen Sie eine Textdatei mit dem Dateinamen main.py, die den folgenden Python-Code enthält:

    import random, json
    from flask import jsonify
    
    def multiply(request):
        request_json = request.get_json()
        output = {"multiplied":2*request_json['input']}
        return jsonify(output)
  3. Erstellen Sie eine Textdatei für den pip-Paketmanager, um eine Abhängigkeit von Flask für die HTTP-Verarbeitung zu unterstützen. Geben Sie der Datei den Namen requirements.txt und fügen Sie Folgendes hinzu:

    flask>=1.0.2
    
  4. Stellen Sie die Funktion mit einem HTTP-Trigger bereit und lassen Sie nicht authentifizierten Zugriff zu:

    gcloud functions deploy multiply \
    --runtime python37 \
    --trigger-http \
    --allow-unauthenticated
    

    Die Bereitstellung der Funktion kann einige Minuten dauern. Alternativ können Sie die Funktion über die Cloud Functions-Oberfläche in der Cloud Console bereitstellen.

  5. Nachdem die Funktion bereitgestellt wurde, können Sie das Attribut httpsTrigger.url bestätigen:

    gcloud functions describe multiply
    
  6. Sie können die Funktion mit dem folgenden curl-Befehl ausprobieren:

    curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \
    -X POST \
    -H "content-type: application/json" \
    -d '{"input": 5}'
    

    Es sollte die Zahl 10 zurückgegeben werden.

Die beiden Cloud Functions-Dienste in einem Workflow verbinden

Ein Workflow besteht aus einer Reihe von Schritten, die mit der Workflows-Syntax beschrieben werden. Diese kann entweder im YAML- oder JSON-Format geschrieben werden. Dies ist die Definition des Workflows. Eine ausführliche Erläuterung finden Sie auf der Seite Syntaxreferenz.

  1. Gehen Sie zurück zum Basisverzeichnis:

    cd ~
    
  2. Erstellen Sie eine Textdatei mit dem Dateinamen workflow.yaml und folgendem Inhalt:

    - randomgen_function:
        call: http.get
        args:
            url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply
            body:
                input: ${randomgen_result.body.random}
        result: multiply_result
    - return_result:
        return: ${multiply_result}
    

    Dadurch werden die beiden HTTP-Funktionen miteinander verknüpft und das Endergebnis zurückgegeben.

  3. Nachdem Sie den Workflow erstellt haben, können Sie ihn bereitstellen, wodurch er für die Ausführung bereit ist.

    gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
    

    Ersetzen Sie WORKFLOW_NAME durch den Namen des Workflows.

  4. Führen Sie den Workflow aus:

    gcloud workflows run WORKFLOW_NAME
    

    Eine Ausführung ist ein einzelner Durchlauf der Logik, die in der Definition eines Workflows enthalten ist. Alle Workflowausführungen sind unabhängig und die schnelle Skalierung von Workflows ermöglicht eine hohe Anzahl gleichzeitiger Ausführungen.

    Nachdem der Workflow ausgeführt wurde, sollte die Ausgabe in etwa so aussehen:

    result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\";
    ...
    startTime: '2021-05-05T14:17:39.135251700Z'
    state: SUCCEEDED
    

Öffentlichen REST-Dienst mit dem Workflow verbinden

Aktualisieren Sie in der Google Cloud Console den vorhandenen Workflow und stellen Sie eine Verbindung zu einer öffentlichen REST API (math.js) her, die die mathematischen Ausdrücke auswerten kann, z. B. curl https://api.mathjs.org/v4/?'expr=log(56)'.

  1. Öffnen Sie die Seite „Workflows” in der Google Cloud Console:
    Zur Seite „Workflows”

  2. Wählen Sie den Namen des Workflows aus, den Sie aktualisieren möchten.

  3. Klicken Sie auf Bearbeiten, um die Quelle des Workflows zu bearbeiten, und dann auf Weiter.

  4. Ersetzen Sie den Quellcode im Workflow-Editor durch den folgenden Inhalt:

    - randomgen_function:
        call: http.get
        args:
            url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply
            body:
                input: ${randomgen_result.body.random}
        result: multiply_result
    - log_function:
        call: http.get
        args:
            url: https://api.mathjs.org/v4/
            query:
                expr: ${"log(" + string(multiply_result.body.multiplied) + ")"}
        result: log_result
    - return_result:
        return: ${log_result}
    

    Dadurch wird der externe REST-Dienst mit den Cloud Functions-Diensten verknüpft und ein Endergebnis zurückgegeben.

  5. Klicken Sie auf Bereitstellen.

Cloud Run-Dienst bereitstellen

Stellen Sie einen Cloud Run-Dienst bereit, der nach dem Erhalt einer HTTP-Anfrage den input aus dem JSON-Text extrahiert, den math.floor berechnet und das Ergebnis zurückgibt.

  1. Erstellen Sie ein Verzeichnis mit dem Namen floor und rufen Sie es auf:

    mkdir ~/floor
    cd ~/floor
    
  2. Erstellen Sie eine Textdatei mit dem Dateinamen app.py, die den folgenden Python-Code enthält:

    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)))

  3. Erstellen Sie im selben Verzeichnis eine Dockerfile mit folgendem Inhalt:

    # 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

  4. Erstellen Sie das Container-Image:

    export SERVICE_NAME=floor
    gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
    
  5. Stellen Sie das Container-Image in Cloud Run bereit und achten Sie darauf, dass nur authentifizierte Aufrufe akzeptiert werden:

    gcloud run deploy ${SERVICE_NAME} \
    --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
    --platform managed \
    --no-allow-unauthenticated
    

Wenn die Dienst-URL angezeigt wird, wurde sie erfolgreich bereitgestellt. Sie müssen diese URL beim Aktualisieren der Workflow-Definition angeben.

Cloud Run-Dienst mit dem Workflow verbinden

  1. Öffnen Sie die Seite „Workflows” in der Google Cloud Console:
    Zur Seite „Workflows”

  2. Wählen Sie den Namen des Workflows aus, den Sie aktualisieren möchten.

  3. Klicken Sie auf Bearbeiten, um die Quelle des Workflows zu bearbeiten, und dann auf Weiter.

  4. Ersetzen Sie den Quellcode im Workflow-Editor durch den folgenden Inhalt:

    - randomgen_function:
        call: http.get
        args:
            url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply
            body:
                input: ${randomgen_result.body.random}
        result: multiply_result
    - log_function:
        call: http.get
        args:
            url: https://api.mathjs.org/v4/
            query:
                expr: ${"log(" + string(multiply_result.body.multiplied) + ")"}
        result: log_result
    - floor_function:
        call: http.post
        args:
            url: CLOUD_RUN_SERVICE_URL
            auth:
                type: OIDC
            body:
                input: ${log_result.body}
        result: floor_result
    - return_result:
        return: ${floor_result}
    

    Ersetzen Sie CLOUD_RUN_SERVICE_URL durch die URL des Cloud Run-Dienstes.

    Dadurch wird der Cloud Run-Dienst im Workflow verbunden. Der Schlüssel auth sorgt dafür, dass ein Authentifizierungstoken an den Aufruf des Cloud Run-Dienstes übergeben wird. Weitere Informationen finden Sie unter Workflows-Authentifizierung.

  5. Klicken Sie auf Bereitstellen.

Abschließenden Workflow ausführen

  1. Aktualisieren Sie den Workflow und übergeben Sie das Dienstkonto:

    cd ~
    gcloud workflows deploy workflow \
    --source=workflow.yaml \
    --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
    
  2. Führen Sie den Workflow aus:

    gcloud workflows run WORKFLOW_NAME
    

    Die Ausgabe sollte in etwa so aussehen:

    result: '{"body":{"multiplied":192},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\";
    ...
    startTime: '2021-05-05T14:36:48.762896438Z'
    state: SUCCEEDED
    

Das war's auch schon! Sie haben einen Workflow bereitgestellt und ausgeführt, der eine Reihe von Diensten miteinander verbindet.

Weitere Informationen zur Erstellung komplexerer Workflows mit Ausdrücken, bedingten Sprüngen, Base64-Codierung/-Decodierung, Subworkflows und mehr finden Sie in der Workflow-Syntaxreferenz und in der Standardbibliothek – Übersicht.

Bereinigen

Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen, löschen Sie die für die Anleitung erstellten Ressourcen.

Projekt löschen

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

So löschen Sie das Projekt:

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Anleitungsressourcen löschen

  1. Löschen Sie den Cloud Run-Dienst, den Sie in dieser Anleitung bereitgestellt haben:

    gcloud run services delete SERVICE_NAME

    Dabei ist SERVICE_NAME der von Ihnen ausgewählte Dienstname.

    Sie können Cloud Run-Dienste auch über die Google Cloud Console löschen.

  2. Entfernen Sie die gcloud-Standardkonfigurationen, die Sie während der Einrichtung der Anleitung hinzugefügt haben.

     gcloud config unset run/region
     gcloud config unset workflows/location
     gcloud config unset project
    

  3. Löschen Sie den in dieser Anleitung erstellten Workflow:

    gcloud workflows delete WORKFLOW_NAME
    
  4. Löschen Sie die Container-Images mit dem Namen gcr.io/PROJECT_ID/SERVICE_NAME aus Container Registry.

Nächste Schritte