Auf Ereignisse mit Callbacks und Eventarc-Triggern warten


Ihr Workflow muss möglicherweise auf einen externen Prozess warten. Sie können HTTP-Callbacks verwenden, um zu warten, bis ein anderer Dienst eine Anfrage an einen Callback-Endpunkt sendet. Durch diese Anfrage wird die Ausführung des Workflows fortgesetzt. Sie können auch mit Polling warten.

Statt Abfragen zu verwenden, wird in dieser Anleitung gezeigt, wie Sie mithilfe von HTTP-Callbacks und Eventarc-Triggern auf Ereignisse oder Pub/Sub-Nachrichten warten können. Sie können zwar einen Workflow mit Ereignissen oder Pub/Sub-Nachrichten auslösen, aber Sie können diese Ausführung anhalten, um auf ein anderes Ereignis zu warten, bevor Sie fortfahren. Ein Ereignis löst beispielsweise einen Workflow zum Initiieren eines Prozesses aus. Der Workflow muss jedoch auf ein anderes Ereignis warten, das signalisiert, dass der Prozess abgeschlossen ist. Sie können dies implementieren, indem Sie einen Workflow einen anderen Workflow zurückrufen lassen.

Lernziele

In dieser Anleitung geschieht Folgendes:

  1. Ein primärer Workflow, der auf Ereignisse warten muss, wird bereitgestellt und ausgeführt. Da er auf das Eintreten der Ereignisse warten muss, speichert er die Callback-Details in einer Firestore-Datenbank, damit die Details vom sekundären Workflow abgerufen werden können. Der primäre Workflow wartet dann auf die HTTP-Aufrufe.

  2. Ein sekundärer Workflow wird durch die Ereignisse ausgelöst und ruft die Callback-Details aus der Firestore-Datenbank ab, wenn die Ereignisse generiert werden. Der sekundäre Workflow ruft dann den primären Workflow zurück, der seine Ausführung fortsetzt.

Dies ist ein Überblick über den gesamten Prozess:

Auf Ereignisse mit Callbacks sowie einem primären und sekundären Workflow warten

Primärer Workflow:

  1. Ein callback-event-sample-Workflow erstellt Callback-Endpunkte für zwei Ereignisquellen: ein Pub/Sub-Thema und einen Cloud Storage-Bucket.
  2. Dieser Workflow speichert beide Callback-Endpunkte in einem Firestore-Dokument.
  3. Dieser Workflow stoppt die Ausführung und wartet auf das Eintreffen von HTTP-Anfragen an den Callback-Endpunkten.

Ereignisse:

  1. Ereignisse treten auf: Eine Nachricht wird in einem Pub/Sub-Thema veröffentlicht und eine Datei in einen Cloud Storage-Bucket hochgeladen.

Sekundärer Workflow:

  1. Eventarc leitet die Ereignisse an den Workflow callback-event-listener weiter und löst ihre Ausführung aus.
  2. Dieser Workflow ruft die entsprechenden Callback-Endpunkt-URLs aus dem Firestore-Dokument ab.
  3. Dieser Workflow führt die Callbacks an die entsprechenden Endpunkte im Beispielworkflow aus.

Primärer Workflow:

  1. Der Workflow callback-event-sample empfängt die Ereignisse an den Callback-Endpunkten und setzt seine Ausführung fort.
  2. Mit diesem Workflow werden die Callback-URLs aus dem Firestore-Dokument gelöscht und die Ausführung abgeschlossen.

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.

Hinweise

Sie können die folgenden Befehle in der Google Cloud Console oder über die Google Cloud CLI in Ihrem Terminal oder in Cloud Shell ausführen.

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.

Console

  1. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

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

  3. Aktivieren Sie die App Engine, Eventarc, Firestore, Pub/Sub und Workflows APIs.

    Aktivieren Sie die APIs

  4. Erstellen Sie ein Dienstkonto für Ihren Workflow, das Sie zur Authentifizierung bei anderen Google Cloud-Diensten verwenden möchten, und weisen Sie ihm die entsprechenden Rollen zu:

    1. Rufen Sie in der Google Cloud Console die Seite Dienstkonten auf:

      Zur Seite „Dienstkonten“

    2. Wählen Sie Ihr Projekt aus, um die Seite Dienstkonto erstellen aufzurufen.

    3. Geben Sie im Feld Dienstkontoname einen Namen ein. Die Google Cloud Console füllt das Feld Dienstkonto-ID anhand dieses Namens aus.

      Geben Sie im Feld Dienstkontobeschreibung eine Beschreibung ein. Beispiel: Service account for tutorial

    4. Klicken Sie auf Erstellen und fortfahren.

    5. Filtern Sie in der Liste Rolle auswählen nach den folgenden Rollen, die dem nutzerverwalteten Dienstkonto zugewiesen werden sollen, das Sie im vorherigen Schritt erstellt haben:

      • Cloud Datastore-Nutzer: Zugriff auf Firestore-Daten im Datastore-Modus (Datenspeicher).
      • Eventarc-Ereignisempfänger: zum Empfangen von Ereignissen von Ereignisanbietern
      • Log-Autor: Zum Schreiben von Logs.
      • Workflows Invoker: Zum Ausführen von Workflows und Verwalten der Ausführungen.

      Klicken Sie auf Weitere Rolle hinzufügen, um weitere Rollen hinzuzufügen.

    6. Klicken Sie auf Weiter.

    7. Klicken Sie zum Abschließen der Erstellung des Kontos auf Fertig.

  5. Gewähren Sie dem Cloud Storage-Dienst-Agent die Rolle „Pub/Sub-Publisher“, um einen Eventarc-Trigger zu erstellen, der Ereignisse aus Cloud Storage weiterleitet. Normalerweise ist dies service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com. Sie können die E-Mail-Adresse für den Cloud Storage-Dienst-Agent abrufen.

    1. Öffnen Sie in der Google Cloud Console die Seite IAM.

      IAM aufrufen

    2. Klicken Sie in der Zeile für den Cloud Storage-Dienst-Agent auf Hauptkonto bearbeiten. (Wenn der Dienst-Agent nicht aufgeführt ist, fahren Sie mit dem nächsten Schritt fort.) Der Bereich Zugriff bearbeiten wird geöffnet.

      1. Klicken Sie auf Weitere Rolle hinzufügen und suchen Sie nach der Rolle Pub/Sub Publisher.
      2. Wählen Sie die Rolle aus.
      3. Klicken Sie auf Speichern.
    3. Wenn der Dienst-Agent nicht aufgeführt ist, klicken Sie auf Zugriff erlauben. Der Bereich Zugriff gewähren wird geöffnet.

      1. Geben Sie im Feld Neue Hauptkonten die E-Mail-Adresse des Dienst-Agents ein.
      2. Suchen Sie in der Liste Rolle auswählen nach der Rolle Pub/Sub-Publisher.
      3. Wählen Sie die Rolle aus.
      4. Klicken Sie auf Speichern.

gcloud

  1. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

    Unten in der Google Cloud Console wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung, in der das Google Cloud CLI bereits installiert ist und Werte für Ihr aktuelles Projekt bereits festgelegt sind. Das Initialisieren der Sitzung kann einige Sekunden dauern.

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

  3. Aktivieren Sie die App Engine, Eventarc, Firestore, Pub/Sub und Workflows.

    gcloud services enable \
        appengine.googleapis.com \
        eventarc.googleapis.com \
        firestore.googleapis.com \
        pubsub.googleapis.com \
        workflows.googleapis.com
    
  4. Erstellen Sie ein Dienstkonto für Ihren Workflow, das Sie für die Authentifizierung bei anderen Google Cloud-Diensten verwenden möchten, und weisen Sie ihm die entsprechenden Rollen zu.

    1. Erstellen Sie das Dienstkonto:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      Ersetzen Sie SERVICE_ACCOUNT_NAME durch einen Namen für das Dienstkonto.

    2. Weisen Sie dem vom Nutzer verwalteten Dienstkonto, das Sie im vorherigen Schritt erstellt haben, Rollen zu. Führen Sie den folgenden Befehl einmal für jede der folgenden IAM-Rollen aus:

      • roles/datastore.user: für den Zugriff auf Firestore-Daten im Datastore-Modus (Datenspeicher)
      • roles/eventarc.eventReceiver: zum Empfangen von Ereignissen von Ereignisanbietern.
      • roles/logging.logWriter: zum Schreiben von Logs.
      • roles/workflows.invoker: Ausführen von Workflows und Verwalten der Ausführungen
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE
      

      Ersetzen Sie Folgendes:

      • PROJECT_ID: die Projekt-ID, in der Sie das Dienstkonto erstellt haben
      • ROLE: die zu gewährende Rolle
  5. Um einen Eventarc-Trigger zu erstellen, der Ereignisse aus Cloud Storage weiterleitet, gewähren Sie dem Cloud Storage-Dienst-Agent die Rolle „Pub/Sub Publisher“. Normalerweise ist dies service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com. Verwenden Sie gsutil kms serviceaccount, um zuerst den Cloud Storage-Dienst-Agent abzurufen.

    SERVICE_ACCOUNT_STORAGE="$(gsutil kms serviceaccount -p PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$SERVICE_ACCOUNT_STORAGE \
        --role=roles/pubsub.publisher
    

Firestore-Datenbank erstellen

Firestore speichert Ihre Daten in Dokumenten, die Felder enthalten, die Werten zugeordnet sind. Diese Dokumente werden in Sammlungen gespeichert. Dies sind Container für Ihre Dokumente, mit denen Sie Ihre Daten organisieren und Abfragen erstellen können. Weitere Informationen zu Firestore

Beachten Sie, dass jedes Google Cloud-Projekt auf eine Firestore-Datenbank beschränkt ist. Führen Sie die folgenden Schritte aus, wenn Sie eine neue Datenbank erstellen müssen.

Console

  1. Rufen Sie in der Google Cloud Console die Firestore-Seite Jetzt starten auf.

    Jetzt starten

  2. Klicken Sie auf Nativen Modus auswählen.

    Eine Anleitung zur Auswahl des Datenbankmodus und einen Funktionsvergleich finden Sie unter Zwischen nativem Modus und Datastore-Modus wechseln.

  3. Wählen Sie in der Liste Standort auswählen die Option nam5 (USA) aus.

    Der Standort gilt sowohl für die Firestore-Datenbank als auch für die App Engine-Anwendung in Ihrem Google Cloud-Projekt. Nachdem Sie die Datenbank erstellt haben, können Sie den Speicherort nicht mehr ändern.

  4. Klicken Sie auf Create database (Datenbank erstellen).

gcloud

Zum Erstellen einer Firestore-Datenbank müssen Sie zuerst eine App Engine-Anwendung erstellen und dann den Befehl gcloud firestore databases create ausführen:

gcloud app create --region=us-central
gcloud firestore databases create --region=us-central

Sie können die Warnung „us-central is not a valid Firestore location“ ignorieren. App Engine und Firestore unterstützen dieselben Standorte. Die App Engine-Region us-central (Iowa) ist jedoch dem multiregionalen Standort nam5 (USA) von Firestore zugeordnet.

Pub/Sub-Thema erstellen

In dieser Anleitung wird Pub/Sub als Ereignisquelle verwendet. Erstellen Sie ein Pub/Sub-Thema, in dem Sie eine Nachricht veröffentlichen können. Weitere Informationen zum Erstellen und Verwalten von Themen

Console

  1. Rufen Sie in der Google Cloud Console die Pub/Sub-Seite Themen auf.

    Themen aufrufen

  2. Klicken Sie auf Thema erstellen.

  3. Geben Sie im Feld Themen-ID den Wert topic-callback ein.

  4. Übernehmen Sie die anderen Standardeinstellungen.

  5. Klicken Sie auf Thema erstellen.

gcloud

Führen Sie den Befehl gcloud pubsub topics create aus, um ein Thema zu erstellen:

gcloud pubsub topics create topic-callback

Cloud Storage-Bucket erstellen

In dieser Anleitung wird Cloud Storage als Ereignisquelle verwendet. Erstellen Sie einen Cloud Storage-Bucket, in den Sie eine Datei hochladen können. Weitere Informationen zum Erstellen von Storage-Buckets

Console

  1. Rufen Sie in der Google Cloud Console die Cloud Storage-Seite Buckets auf.

    Cloud Storage aufrufen

  2. Klicken Sie auf  Erstellen.

  3. Geben Sie als Name für den Bucket PROJECT_ID-bucket-callback ein.

    Die Projekt-ID wird im callback-event-sample-Workflow verwendet, um den Bucket zu identifizieren.

  4. Klicken Sie auf Weiter.

  5. Wählen Sie als Standorttyp die Option Region und dann us-central1 (Iowa) aus.

  6. Übernehmen Sie die anderen Standardeinstellungen.

  7. Klicken Sie auf Erstellen.

gcloud

Führen Sie den Befehl gcloud storage buckets create aus, um einen Bucket zu erstellen:

gcloud storage buckets create gs://PROJECT_ID-bucket-callback \
    --location=us-central1

Die Projekt-ID wird im callback-event-sample-Workflow verwendet, um den Bucket zu identifizieren.

Nachdem die Ereignisquellen erstellt wurden, können Sie den Workflow für den Ereignisempfänger bereitstellen.

Workflow bereitstellen, der auf Ereignisse wartet

Der Workflow callback-event-listener wird ausgelöst, wenn eine Nachricht in einem Pub/Sub-Thema veröffentlicht oder eine Datei in einen Cloud Storage-Bucket hochgeladen wird. Der Workflow empfängt das Ereignis, ruft die entsprechenden Callback-Details aus der Firestore-Datenbank ab und sendet dann eine HTTP-Anfrage an den Callback-Endpunkt.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Workflows auf:

    Zur Seite "Workflows"

  2. Klicken Sie auf  Erstellen.

  3. Geben Sie einen Namen für den neuen Workflow ein: callback-event-listener.

  4. Wählen Sie in der Liste Region die Option us-central1 aus.

  5. Wählen Sie das zuvor erstellte Dienstkonto aus.

  6. Klicken Sie auf Next (Weiter).

  7. Geben Sie im Workflow-Editor die folgende Definition für den Workflow ein:

    main:
      params: [event]
      steps:
        - log_event:
            call: sys.log
            args:
              text: ${event}
              severity: INFO
        - init:
            assign:
              - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
              - event_source_tokens: ${text.split(event.source, "/")}
              - event_source_len: ${len(event_source_tokens)}
              - event_source: ${event_source_tokens[event_source_len - 1]}
              - doc_name: ${database_root + event_source}
        - get_document_for_event_source:
            try:
              call: googleapis.firestore.v1.projects.databases.documents.get
              args:
                name: ${doc_name}
              result: document
            except:
                as: e
                steps:
                    - known_errors:
                        switch:
                        - condition: ${e.code == 404}
                          return: ${"No callbacks for event source " + event_source}
                    - unhandled_exception:
                        raise: ${e}
        - process_callback_urls:
            steps:
              - check_fields_exist:
                  switch:
                  - condition: ${not("fields" in document)}
                    return: ${"No callbacks for event source " + event_source}
                  - condition: true
                    next: processFields
              - processFields:
                  for:
                      value: key
                      in: ${keys(document.fields)}
                      steps:
                          - extract_callback_url:
                              assign:
                                  - callback_url: ${document.fields[key]["stringValue"]}
                          - log_callback_url:
                              call: sys.log
                              args:
                                text: ${"Calling back url " + callback_url}
                                severity: INFO
                          - http_post:
                              call: http.post
                              args:
                                  url: ${callback_url}
                                  auth:
                                      type: OAuth2
                                  body:
                                      event: ${event}
  8. Klicken Sie auf Bereitstellen.

gcloud

  1. Erstellen Sie eine Quellcodedatei für Ihren Workflow:

    touch callback-event-listener.yaml
    
  2. Kopieren Sie in einem Texteditor den folgenden Workflow in Ihre Quellcodedatei:

    main:
      params: [event]
      steps:
        - log_event:
            call: sys.log
            args:
              text: ${event}
              severity: INFO
        - init:
            assign:
              - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
              - event_source_tokens: ${text.split(event.source, "/")}
              - event_source_len: ${len(event_source_tokens)}
              - event_source: ${event_source_tokens[event_source_len - 1]}
              - doc_name: ${database_root + event_source}
        - get_document_for_event_source:
            try:
              call: googleapis.firestore.v1.projects.databases.documents.get
              args:
                name: ${doc_name}
              result: document
            except:
                as: e
                steps:
                    - known_errors:
                        switch:
                        - condition: ${e.code == 404}
                          return: ${"No callbacks for event source " + event_source}
                    - unhandled_exception:
                        raise: ${e}
        - process_callback_urls:
            steps:
              - check_fields_exist:
                  switch:
                  - condition: ${not("fields" in document)}
                    return: ${"No callbacks for event source " + event_source}
                  - condition: true
                    next: processFields
              - processFields:
                  for:
                      value: key
                      in: ${keys(document.fields)}
                      steps:
                          - extract_callback_url:
                              assign:
                                  - callback_url: ${document.fields[key]["stringValue"]}
                          - log_callback_url:
                              call: sys.log
                              args:
                                text: ${"Calling back url " + callback_url}
                                severity: INFO
                          - http_post:
                              call: http.post
                              args:
                                  url: ${callback_url}
                                  auth:
                                      type: OAuth2
                                  body:
                                      event: ${event}
  3. Stellen Sie den Workflow bereit. Geben Sie hierzu den folgenden Befehl ein:

    gcloud workflows deploy callback-event-listener \
        --source=callback-event-listener.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Ersetzen Sie SERVICE_ACCOUNT_NAME durch den Namen des zuvor erstellten Dienstkontos.

Workflow bereitstellen, der auf Ereignisse wartet

Der Workflow callback-event-sample speichert die Callback-Details in einer Firestore-Datenbank, hält die Ausführung an und wartet dann auf das Eintreten bestimmter Ereignisse.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Workflows auf:

    Zur Seite "Workflows"

  2. Klicken Sie auf  Erstellen.

  3. Geben Sie einen Namen für den neuen Workflow ein: callback-event-sample.

  4. Wählen Sie in der Liste Region die Option us-central1 aus.

  5. Wählen Sie das zuvor erstellte Dienstkonto aus.

  6. Klicken Sie auf Next (Weiter).

  7. Geben Sie im Workflow-Editor die folgende Definition für den Workflow ein:

    main:
      steps:
        - init:
            assign:
              - pubsub_topic: topic-callback
              - storage_bucket: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
        - await_pubsub_message:
            call: await_callback_event
            args:
              event_source: ${pubsub_topic}
            result: pubsub_event
        - await_storage_bucket:
            call: await_callback_event
            args:
              event_source: ${storage_bucket}
            result: storage_event
        - return_events:
            return:
                pubsub_event: ${pubsub_event}
                storage_event: ${storage_event}
    
    await_callback_event:
        params: [event_source]
        steps:
            - init:
                assign:
                  - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
                  - doc_name: ${database_root + event_source}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
                  - firestore_key: ${"exec_" + text.split(execution_id, "-")[0]}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
                  body:
                    fields:
                      ${firestore_key}:
                        stringValue: ${callback_details.url}
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting 1hr for an event from source " + event_source}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for an event from source " + event_source}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - delete_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
            - check_null_event:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${callback_request.http_request.body.event}
            - return_event:
                return: ${callback_request.http_request.body.event}
  8. Klicken Sie auf Bereitstellen.

gcloud

  1. Erstellen Sie eine Quellcodedatei für Ihren Workflow:

    touch callback-event-sample.yaml
    
  2. Kopieren Sie in einem Texteditor den folgenden Workflow in Ihre Quellcodedatei:

    main:
      steps:
        - init:
            assign:
              - pubsub_topic: topic-callback
              - storage_bucket: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
        - await_pubsub_message:
            call: await_callback_event
            args:
              event_source: ${pubsub_topic}
            result: pubsub_event
        - await_storage_bucket:
            call: await_callback_event
            args:
              event_source: ${storage_bucket}
            result: storage_event
        - return_events:
            return:
                pubsub_event: ${pubsub_event}
                storage_event: ${storage_event}
    
    await_callback_event:
        params: [event_source]
        steps:
            - init:
                assign:
                  - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
                  - doc_name: ${database_root + event_source}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
                  - firestore_key: ${"exec_" + text.split(execution_id, "-")[0]}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
                  body:
                    fields:
                      ${firestore_key}:
                        stringValue: ${callback_details.url}
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting 1hr for an event from source " + event_source}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for an event from source " + event_source}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - delete_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
            - check_null_event:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${callback_request.http_request.body.event}
            - return_event:
                return: ${callback_request.http_request.body.event}
  3. Stellen Sie den Workflow bereit. Geben Sie hierzu den folgenden Befehl ein:

    gcloud workflows deploy callback-event-sample \
        --source=callback-event-sample.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Ersetzen Sie SERVICE_ACCOUNT_NAME durch den Namen des zuvor erstellten Dienstkontos.

Eventarc-Trigger zum Weiterleiten von Pub/Sub-Ereignissen erstellen

Mit einem Eventarc-Trigger können Sie Ereignisse weiterleiten, indem Sie Filter für den Trigger angeben, einschließlich Ereignisquelle und Zielworkflow. Erstellen Sie einen Eventarc-Trigger, um den Workflow callback-event-listener auszuführen, wenn eine Nachricht in einem Pub/Sub-Thema veröffentlicht wird. Weitere Informationen zum Auslösen eines Workflows

Console

  1. Rufen Sie in der Google Cloud Console die Seite Eventarc auf.

    Zu Eventarc

  2. Klicken Sie auf Trigger erstellen.

  3. Geben Sie einen Triggernamen ein.

    Beispiel: trigger-pubsub-events-listener.

  4. Wählen Sie in der Liste Ereignisanbieter die Option Cloud Pub/Sub aus.

  5. Wählen Sie in der Liste Ereignis unter Benutzerdefiniert die Option google.cloud.pubsub.topic.v1.messagePublished aus.

  6. Wählen Sie in der Liste Cloud Pub/Sub-Thema auswählen das zuvor erstellte Thema aus.

  7. Wählen Sie in der Liste Region die Option us-central1 (Iowa) aus.

  8. Wenn Sie dazu aufgefordert werden, weisen Sie dem Pub/Sub-Dienstkonto die Rolle iam.serviceAccountTokenCreator zu.

  9. Wählen Sie das zuvor erstellte Dienstkonto aus.

  10. Wählen Sie in der Liste Ereignisziel die Option Workflows aus.

  11. Wählen Sie in der Liste Workflow auswählen den Workflow callback-event-listener aus.

  12. Klicken Sie auf Erstellen.

gcloud

Führen Sie den Befehl gcloud eventarc triggers create aus, um einen Trigger zu erstellen:

gcloud eventarc triggers create trigger-pubsub-events-listener \
    --location=us-central1 \
    --destination-workflow=callback-event-listener \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=topic-callback \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Ereignisse werden transformiert und als Laufzeitargumente an die Workflowausführung übergeben. Es kann bis zu 2 Minuten dauern, bis der neue Trigger aktiviert wird.

Eventarc-Trigger erstellen, um Cloud Storage-Ereignisse weiterzuleiten

Mit einem Eventarc-Trigger können Sie Ereignisse weiterleiten, indem Sie Filter für den Trigger angeben, einschließlich Ereignisquelle und Zielworkflow. Erstellen Sie einen Eventarc-Trigger, um den Workflow callback-event-listener auszuführen, wenn eine Datei in einen Cloud Storage-Bucket hochgeladen wurde. Weitere Informationen zum Auslösen eines Workflows

Console

  1. Rufen Sie in der Google Cloud Console die Seite Eventarc auf.

    Zu Eventarc

  2. Klicken Sie auf Trigger erstellen.

  3. Geben Sie einen Triggernamen ein.

    Beispiel: trigger-storage-events-listener.

  4. Wählen Sie in der Liste Ereignisanbieter die Option Cloud Storage aus.

  5. Wählen Sie in der Liste Ereignis unter Direkt die Option google.cloud.storage.object.v1.finald aus.

  6. Suchen Sie in der Liste Bucket nach dem zuvor erstellten Bucket und wählen Sie ihn aus.

  7. Übernehmen Sie in der Liste Region basierend auf Ihrem Cloud Storage-Bucket den Standardwert us-central1 (Iowa).

  8. Wenn Sie dazu aufgefordert werden, weisen Sie dem Pub/Sub-Dienstkonto die Rolle iam.serviceAccountTokenCreator zu.

  9. Wählen Sie das zuvor erstellte Dienstkonto aus.

  10. Wählen Sie in der Liste Ereignisziel die Option Workflows aus.

  11. Wählen Sie in der Liste Workflow auswählen den Workflow callback-event-listener aus.

  12. Klicken Sie auf Erstellen.

gcloud

Führen Sie den Befehl gcloud eventarc triggers create aus, um einen Trigger zu erstellen:

gcloud eventarc triggers create trigger-storage-events-listener \
    --location=us-central1 \
    --destination-workflow=callback-event-listener \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=PROJECT_ID-bucket-callback" \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Ereignisse werden transformiert und als Laufzeitargumente an die Workflowausführung übergeben. Es kann bis zu 2 Minuten dauern, bis der neue Trigger aktiviert wird.

Primären Workflow ausführen

Bei der Ausführung eines Workflows wird die aktuelle Workflowdefinition ausgeführt, die dem Workflow zugeordnet ist. Führen Sie den callback-event-sample-Workflow aus. Dies ist der primäre Workflow und wartet auf bestimmte Ereignisse. Die Ausführung wird nur fortgesetzt, wenn der sekundäre Workflow die entsprechenden Callback-Anfragen stellt.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Workflows.

    Zur Seite "Workflows"

  2. Klicken Sie auf der Seite Workflows auf den Workflow callback-event-sample, um die zugehörige Detailseite aufzurufen.

  3. Klicken Sie auf der Seite Workflow-Details auf Ausführen.

  4. Klicken Sie noch einmal auf Ausführen.

    Die Workflowausführung wird gestartet. Während der Ausführung sollten der Ausführungsstatus Running und ein Logeintrag wie Started waiting 1hr for an event from source topic-callback angezeigt werden.

gcloud

Führen Sie zum Ausführen eines Workflows den Befehl gcloud workflows run aus:

gcloud workflows run callback-event-sample \
    --location=us-central1

Die Workflowausführung wird gestartet. Während der Ausführung sollten Sie einen Ausführungsstatus wie diesen sehen:

Waiting for execution [a848a164-268a-449c-b2fe-396f32f2ed66] to complete...working...

Ereignisse generieren und Ausführungsstatus prüfen

Sie können bestätigen, dass die Ergebnisse den Erwartungen entsprechen, indem Sie Ereignisse generieren, Logeinträge ansehen und den Ausführungsstatus des Workflows prüfen.

Nachricht veröffentlichen

Veröffentlichen Sie eine Nachricht in dem zuvor erstellten Pub/Sub-Thema.

Console

  1. Rufen Sie in der Google Cloud Console die Pub/Sub-Seite Themen auf.

    Themen aufrufen

  2. Klicken Sie auf Themen-Callback.

  3. Klicken Sie auf den Tab Nachrichten.

  4. Klicken Sie auf Nachricht veröffentlichen.

  5. Geben Sie im Feld Nachrichtentext Hello World ein.

  6. Klicken Sie auf Veröffentlichen.

gcloud

Veröffentlichen Sie eine Nachricht mit dem Befehl gcloud pubsub topics publish:

gcloud pubsub topics publish topic-callback \
    --message="Hello World"

Objekt hochladen

Laden Sie eine Datei in den Cloud Storage-Bucket hoch, den Sie zuvor erstellt haben.

Console

  1. Wechseln Sie in der Cloud Console zur Seite Cloud Storage-Buckets.

    Buckets aufrufen

  2. Klicken Sie auf den Namen des Buckets, den Sie zuvor erstellt haben.

  3. Führen Sie auf dem Tab Objekte eine der folgenden Aktionen aus:

    • Ziehen Sie die gewünschte Datei von Ihrem Desktop oder Dateimanager in den Hauptbereich der Google Cloud Console.

    • Klicken Sie auf Dateien hochladen, wählen Sie die Datei aus, die Sie hochladen möchten, und klicken Sie dann auf Öffnen.

gcloud

Führen Sie zum Hochladen einer Datei den Befehl gcloud storage cp aus:

gcloud storage cp OBJECT_LOCATION gs://PROJECT_ID-bucket-callback/

Ersetzen Sie OBJECT_LOCATION durch den lokalen Pfad zu Ihrem Objekt. Beispiel: random.txt.

Logeinträge und Ausführungsstatus ansehen

Prüfen Sie, ob der callback-event-sample-Workflow erfolgreich abgeschlossen wurde.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Workflows.

    Zur Seite "Workflows"

  2. Klicken Sie auf der Seite Workflows auf den Workflow callback-event-sample, um die zugehörige Detailseite aufzurufen.

  3. Klicken Sie auf der Seite Workflowdetails auf die entsprechende Ausführungs-ID, um die Details für eine bestimmte Ausführung abzurufen.

    Der Ausführungsstatus sollte Erfolgreich sein. Im Ausgabebereich sollten die empfangenen Pub/Sub- und Cloud Storage-Ereignisse angezeigt werden.

gcloud

  1. Filtern Sie die Logeinträge und geben Sie die Ausgabe im JSON-Format zurück:

    gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \
        --format=json
    
  2. Suchen Sie nach Logeinträgen wie den folgenden:

    "textPayload": "Stopped waiting for an event from source..."
    "textPayload": "Calling back url https://workflowexecutions.googleapis.com/v1/projects/..."
    "textPayload": "Started waiting 1hr for an event from source..."
    
  3. Prüfen Sie den Status des letzten Ausführungsversuchs:

    gcloud workflows executions wait-last
    

    Das Ergebnis sollte in etwa so aussehen:

    Using cached execution name: projects/1085953646031/locations/us-central1/workflows/callback-event-sample/executions/79929e4e-82c1-4da1-b068-f828034c01b7
    Waiting for execution [79929e4e-82c1-4da1-b068-f828034c01b7] to complete...done.
    [...]
    state: SUCCEEDED
    

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 Google 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.

In dieser Anleitung erstellte Ressourcen löschen

  1. Daten aus Firestore löschen

  2. Löschen Sie ein Pub/Sub-Thema.

  3. Löschen Sie einen Cloud Storage-Bucket.

  4. Löschen Sie einen Eventarc-Trigger.

  5. Workflow löschen

Nächste Schritte