Anleitung zur Verwendung von Workflows mit Cloud Run- und Cloud Run-Funktionen


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

Lernziele

In dieser Anleitung erstellen Sie mithilfe der Google Cloud-Befehlszeile einen einzelnen Workflow und verbinden dabei jeweils einen Dienst:

  1. Zwei Cloud Run-Funktionsdienste bereitstellen: die erste Funktion generiert eine Zufallszahl und übergibt diese Zahl an die zweite Funktion mit der es multipliziert wird.
  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 diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

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.

Vorbereitung

Von Ihrer Organisation definierte Sicherheitsbeschränkungen verhindern möglicherweise, dass die folgenden Schritte ausgeführt werden. Informationen zur Fehlerbehebung finden Sie unter Anwendungen in einer eingeschränkten Google Cloud-Umgebung entwickeln.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com
  12. Aktualisieren Sie die Google Cloud CLI-Komponenten:
    gcloud components update
  13. Wenn Sie Befehle in Cloud Shell ausführen, sind Sie bereits über die gcloud CLI authentifiziert. Melden Sie sich andernfalls mit Ihrem Konto an:
    gcloud auth login
  14. Legen Sie den Standardspeicherort fest, der in dieser Anleitung verwendet wird:
    gcloud config set project PROJECT_ID
    export REGION=REGION
    gcloud config set functions/region ${REGION}
    gcloud config set run/region ${REGION}
    gcloud config set workflows/location ${REGION}

    Ersetzen Sie REGION durch den unterstützten Workflows-Standort Ihrer Wahl.

  15. Wenn Sie der Projektersteller sind, wird Ihnen die einfache Owner-Rolle (roles/owner) zugewiesen. Standardmäßig enthält diese IAM-Rolle (Identity and Access Management) die Berechtigungen, die für den vollständigen Zugriff auf die meisten Google Cloud-Ressourcen erforderlich sind. Sie können diesen Schritt überspringen.

    Wenn Sie nicht der Project Creator sind, müssen dem entsprechenden Hauptkonto die erforderlichen Berechtigungen für das Projekt erteilt werden. Ein Hauptkonto kann beispielsweise ein Google-Konto (für Endnutzer) oder ein Dienstkonto (für Anwendungen und Computing-Arbeitslasten) sein. Weitere Informationen finden Sie auf der Seite Rollen und Berechtigungen für Ihr Ereignisziel.

    Erforderliche Berechtigungen

    Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Ausführen der Anleitung benötigen:

    Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

    Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Ersten Cloud Run 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 functions_framework
    import random
    from flask import jsonify
    
    
    @functions_framework.http
    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
    functions-framework==3.0.0
  4. Erstellen Sie ein Dienstkonto für Workflows:

    export SERVICE_ACCOUNT=workflows-sa
    gcloud iam service-accounts create ${SERVICE_ACCOUNT}
  5. 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 PROJECT_ID \
        --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/run.invoker"
  6. Stellen Sie die Funktion mit einem HTTP-Trigger bereit und lassen Sie nicht authentifizierten Zugriff zu:

    gcloud functions deploy randomgen-function \
        --gen2 \
        --runtime python310 \
        --entry-point=randomgen \
        --trigger-http \
        --allow-unauthenticated

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

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

    gcloud functions describe randomgen-function \
        --gen2 \
        --format="value(serviceConfig.uri)"
  8. Speichern Sie die URL. Sie müssen sie in späteren Übungen Ihrer Workflows-Quelldatei hinzufügen.

  9. Sie können die Funktion mit dem folgenden curl-Befehl ausprobieren:

    curl $(gcloud functions describe randomgen-function \
        --gen2 \
        --format="value(serviceConfig.uri)")

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

Zweiten Cloud Run-Funktions-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. Gehen Sie zurück zum Basisverzeichnis:

    cd ~
  2. Erstellen Sie ein Verzeichnis mit dem Namen multiply und rufen Sie es auf:

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

    import functions_framework
    from flask import jsonify
    
    
    @functions_framework.http
    def multiply(request):
        request_json = request.get_json()
        output = {"multiplied": 2 * request_json['input']}
        return jsonify(output)
  4. 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
    functions-framework==3.0.0
  5. Stellen Sie die Funktion mit einem HTTP-Trigger bereit und lassen Sie nicht authentifizierten Zugriff zu:

    gcloud functions deploy multiply-function \
        --gen2 \
        --runtime python310 \
        --entry-point=multiply \
        --trigger-http \
        --allow-unauthenticated

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

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

    gcloud functions describe multiply-function \
        --gen2\
        --format="value(serviceConfig.uri)"
  7. Speichern Sie die URL. Sie müssen sie in späteren Übungen Ihrer Workflows-Quelldatei hinzufügen.

  8. Sie können die Funktion mit dem folgenden curl-Befehl ausprobieren:

    curl -X POST MULTIPLY_FUNCTION_URL \
        -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
        -H "Content-Type: application/json" \
        -d '{"input": 5}'

    Es sollte die Zahl 10 zurückgegeben werden.

Die beiden Cloud Run-Funktionen-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, die den folgenden Inhalt enthält:

    - randomgen_function:
        call: http.get
        args:
            url: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            body:
                input: ${randomgen_result.body.random}
        result: multiply_result
    - return_result:
        return: ${multiply_result}
    

    Diese Quelldatei verknüpft die beiden HTTP-Funktionen und gibt ein Endergebnis zurück.

  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 mit einem Namen für Ihren Workflow.

  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 Ihren vorhandenen Workflow und verbinden Sie eine öffentliche REST API (math.js), die mathematische Ausdrücke auswerten kann. Beispiel: curl https://api.mathjs.org/v4/?'expr=log(56)'

Da Sie Ihren Workflow bereitgestellt haben, können Sie ihn auch auf der Seite „Workflows in der Google Cloud Console“ bearbeiten.

  1. Bearbeiten Sie die Quelldatei für Ihren Workflow und ersetzen Sie sie durch folgenden Inhalt:

    - randomgen_function:
        call: http.get
        args:
            url: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            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 Run-Funktionendiensten verknüpft und ein Endergebnis zurückgegeben.

  2. Stellen Sie den geänderten Workflow bereit:

    gcloud workflows deploy WORKFLOW_NAME \
        --source=workflow.yaml

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. Artifact Registry-Standard-Repository erstellen, in dem Sie Ihr Docker-Container-Image speichern können.

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=${REGION}

    Ersetzen Sie REPOSITORY durch einen eindeutigen Namen für das Repository.

  5. Erstellen Sie das Container-Image:

    export SERVICE_NAME=floor
    gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
  6. 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 ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \
        --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

Aktualisieren Sie Ihren vorhandenen Workflow und geben Sie die URL für den Cloud Run-Dienst an.

  1. Bearbeiten Sie die Quelldatei für Ihren Workflow und ersetzen Sie sie durch folgenden Inhalt:

    - randomgen_function:
        call: http.get
        args:
            url: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            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
    - create_output_map:
        assign:
          - outputMap:
              randomResult: ${randomgen_result}
              multiplyResult: ${multiply_result}
              logResult: ${log_result}
              floorResult: ${floor_result}
    - return_output:
        return: ${outputMap}
    
    • Ersetzen Sie RANDOMGEN_FUNCTION_URL durch die URL Ihrer randomgen-Funktion.
    • Ersetzen Sie MULTIPLY_FUNCTION_URL durch die URL Ihrer multiply-Funktion.
    • 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 Authentifizierte Anfragen von einem Workflow aus ausführen.

  2. Stellen Sie den geänderten Workflow bereit:

    gcloud workflows deploy WORKFLOW_NAME \
        --source=workflow.yaml
  3. Abschließenden Workflow ausführen:

    gcloud workflows run WORKFLOW_NAME

    Die Ausgabe sollte in etwa so aussehen:

    result: '{"Floor":{"body":"4","code":200
      ...
      "Log":{"body":"4.02535169073515","code":200
      ...
      "Multiply":{"body":{"multiplied":56},"code":200
      ...
      "Random":{"body":{"random":28},"code":200
      ...
    startTime: '2023-11-13T21:22:56.782669001Z'
    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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Anleitungsressourcen löschen

Nächste Schritte