Attendre les événements à l'aide de rappels et de déclencheurs Eventarc


Votre workflow devra peut-être attendre un processus externe. Vous pouvez utiliser des rappels HTTP pour attendre qu'un autre service envoie une requête à un point de terminaison de rappel. Cette requête reprend l'exécution du workflow. Vous pouvez également attendre à l'aide de l'interrogation.

Au lieu d'utiliser l'interrogation, ce tutoriel explique comment attendre des événements ou des messages Pub/Sub à l'aide de rappels HTTP et de déclencheurs Eventarc. Bien que vous puissiez déclencher un workflow avec des événements ou des messages Pub/Sub, vous pouvez interrompre cette exécution pour attendre un autre événement avant de continuer. Par exemple, un événement déclenche un workflow pour lancer un processus, mais celui-ci doit attendre un autre événement indiquant que le processus est terminé. Pour ce faire, vous pouvez demander à un workflow de rappeler un autre workflow.

Objectifs

Dans ce tutoriel, les événements suivants se produisent:

  1. Un workflow principal qui doit attendre la réception d'événements est déployé et exécuté. Comme il doit attendre que les événements se produisent, il stocke les détails de son rappel dans une base de données Firestore afin que le workflow secondaire puisse les récupérer. Le workflow principal attend ensuite les appels HTTP.

  2. Un workflow secondaire est déclenché par les événements et récupère les détails du rappel à partir de la base de données Firestore lorsque ces événements sont générés. Le workflow secondaire rappelle ensuite le workflow principal, qui reprend son exécution.

Voici un aperçu du processus dans son ensemble:

Attendre les événements à l'aide de rappels et d'un workflow principal et secondaire

Workflow principal:

  1. Un workflow callback-event-sample crée des points de terminaison de rappel pour deux sources d'événements: un sujet Pub/Sub et un bucket Cloud Storage.
  2. Ce workflow stocke les deux points de terminaison de rappel dans un document Firestore.
  3. Ce workflow interrompt son exécution et attend que les requêtes HTTP arrivent aux points de terminaison de rappel.

Événements :

  1. Des événements se produisent: un message est publié dans un sujet Pub/Sub et un fichier est importé dans un bucket Cloud Storage.

Procédure secondaire:

  1. Eventarc achemine les événements vers le workflow callback-event-listener et déclenche son exécution.
  2. Ce workflow récupère les URL de point de terminaison de rappel appropriées à partir du document Firestore.
  3. Ce workflow exécute les rappels sur les points de terminaison appropriés dans l'exemple de workflow.

Workflow principal:

  1. Le workflow callback-event-sample reçoit les événements aux points de terminaison de rappel et reprend son exécution.
  2. Ce workflow supprime les URL de rappel du document Firestore et termine son exécution.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Vous pouvez exécuter les commandes suivantes dans la console Google Cloud ou à l'aide de la Google Cloud CLI dans votre terminal ou Cloud Shell.

Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour obtenir des informations de dépannage, consultez la page Développer des applications dans un environnement Google Cloud limité.

Console

  1. Dans la console Google Cloud, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.

  3. activer les API App Engine, Eventarc, Firestore, Pub/Sub et Workflows ;

    Activer les API

  4. Créez un compte de service que votre workflow utilisera pour l'authentification auprès d'autres services Google Cloud et attribuez-lui les rôles appropriés:

    1. Dans la console Google Cloud, accédez à la page Comptes de service.

      Accéder à la page "Comptes de service"

    2. Pour accéder à la page Créer un compte de service, sélectionnez votre projet.

    3. Dans le champ Nom du compte de service, saisissez un nom. La console Google Cloud remplit le champ ID du compte de service en fonction de ce nom.

      Dans le champ Description du compte de service, saisissez une description. Exemple : Service account for tutorial.

    4. Cliquez sur Créer et continuer.

    5. Dans la liste Sélectionner un rôle, filtrez les rôles suivants à attribuer au compte de service géré par l'utilisateur que vous avez créé à l'étape précédente:

      • Utilisateur Cloud Datastore: permet d'accéder aux données Firestore en mode Datastore (Datastore).
      • Eventarc Event Receiver: permet de recevoir des événements des fournisseurs d'événements.
      • Rédacteur de journaux: permet d'écrire des journaux.
      • Demandeur de workflows: permet d'exécuter des workflows et de gérer les exécutions.

      Pour ajouter des rôles supplémentaires, cliquez sur Ajouter un autre rôle et ajoutez chaque rôle supplémentaire.

    6. Cliquez sur Continuer.

    7. Pour terminer la création du compte, cliquez sur OK.

  5. Pour créer un déclencheur Eventarc qui achemine les événements depuis Cloud Storage, attribuez le rôle Diffuseur Pub/Sub à l'agent de service Cloud Storage. Il s'agit généralement de service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com. Vous pouvez récupérer l'adresse e-mail pour l'agent de service Cloud Storage.

    1. Dans la console Google Cloud, accédez à la page IAM.

      Accéder à IAM

    2. Sur la ligne de l'agent de service Cloud Storage, cliquez sur Modifier le compte principal. (Si l'agent de service n'est pas répertorié, passez à l'étape suivante.) Le volet Modifier l'accès s'affiche.

      1. Cliquez sur Ajouter un autre rôle, puis recherchez le rôle Diffuseur Pub/Sub.
      2. Sélectionnez le rôle.
      3. Cliquez sur Enregistrer.
    3. Si l'agent de service n'est pas répertorié, cliquez sur Accorder l'accès. Le volet Accorder l'accès s'affiche.

      1. Dans le champ Nouveaux comptes principaux, saisissez l'adresse e-mail de l'agent de service.
      2. Dans la liste Sélectionner un rôle, recherchez le rôle Diffuseur Pub/Sub.
      3. Sélectionnez le rôle.
      4. Cliquez sur Enregistrer.

gcloud

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.

  3. Activez les API App Engine, Eventarc, Firestore, Pub/Sub et Workflows.

    gcloud services enable \
        appengine.googleapis.com \
        eventarc.googleapis.com \
        firestore.googleapis.com \
        pubsub.googleapis.com \
        workflows.googleapis.com
    
  4. Créez un compte de service que votre workflow utilisera pour l'authentification auprès d'autres services Google Cloud et attribuez-lui les rôles appropriés.

    1. Créez le compte de service :

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      Remplacez SERVICE_ACCOUNT_NAME par le nom du compte de service.

    2. Attribuez des rôles au compte de service géré par l'utilisateur que vous avez créé à l'étape précédente. Exécutez la commande suivante une fois pour chacun des rôles IAM suivants:

      • roles/datastore.user: permet d'accéder aux données Firestore en mode Datastore (Datastore).
      • roles/eventarc.eventReceiver: permet de recevoir des événements des fournisseurs d'événements.
      • roles/logging.logWriter: permet d'écrire des journaux.
      • roles/workflows.invoker: permet d'exécuter des workflows et de gérer les exécutions.
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE
      

      Remplacez les éléments suivants :

      • PROJECT_ID: ID du projet dans lequel vous avez créé le compte de service
      • ROLE : rôle à accorder
  5. Pour créer un déclencheur Eventarc qui achemine les événements depuis Cloud Storage, attribuez le rôle Diffuseur Pub/Sub à l'agent de service Cloud Storage. Il s'agit généralement de service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com. Utilisez d'abord gsutil kms serviceaccount pour récupérer l'agent de service Cloud Storage.

    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
    

Créer une base de données Firestore

Firestore stocke vos données dans des documents contenant des champs mappés sur des valeurs. Ces documents sont stockés dans des collections, qui sont des conteneurs de vos documents que vous pouvez utiliser pour organiser vos données et créer des requêtes. En savoir plus sur Firestore

Notez que chaque projet Google Cloud est limité à une base de données Firestore. Si vous devez créer une base de données, procédez comme suit :

Console

  1. Dans la console Google Cloud, accédez à la page Premiers pas de Firestore.

    Accéder à la page Premiers pas

  2. Cliquez sur Sélectionner le mode natif.

    Pour obtenir des conseils sur la sélection d'un mode de base de données et une comparaison fonctionnalité par fonctionnalité, consultez la section Choisir entre le mode natif et le mode Datastore.

  3. Dans la liste Sélectionnez un emplacement, choisissez nam5 (États-Unis).

    Cet emplacement s'applique à la fois à la base de données Firestore et à l'application App Engine dans votre projet Google Cloud. Une fois la base de données créée, vous ne pouvez plus modifier l'emplacement.

  4. Cliquez sur Créer une base de données.

gcloud

Pour créer une base de données Firestore, vous devez d'abord créer une application App Engine, puis exécuter la commande gcloud firestore databases create:

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

Vous pouvez ignorer l'avertissement us-central is not a valid Firestore location. App Engine et Firestore acceptent les mêmes emplacements, mais la région App Engine us-central (Iowa) correspond à l'emplacement multirégional de Firestore nam5 (États-Unis).

Créer un sujet Pub/Sub

Ce tutoriel utilise Pub/Sub comme source d'événements. Créez un sujet Pub/Sub pour pouvoir y publier un message. En savoir plus sur la création et la gestion de thèmes

Console

  1. Dans la console Google Cloud, accédez à la page Sujets de Pub/Sub.

    Accéder aux sujets

  2. Cliquez sur Créer un sujet.

  3. Dans le champ ID du sujet, saisissez topic-callback.

  4. Acceptez les autres valeurs par défaut.

  5. Cliquez sur Créer un sujet.

gcloud

Pour créer un sujet, exécutez la commande gcloud pubsub topics create :

gcloud pubsub topics create topic-callback

Créer un bucket Cloud Storage

Ce tutoriel utilise Cloud Storage comme source d'événements. Créez un bucket Cloud Storage pour y importer un fichier. En savoir plus sur la création de buckets de stockage

Console

  1. Dans la console Google Cloud, accédez à la page Buckets Cloud Storage.

    Accéder à Cloud Storage

  2. Cliquez sur  Créer.

  3. Pour le nom du bucket, saisissez PROJECT_ID-bucket-callback.

    L'ID du projet est utilisé dans le workflow callback-event-sample pour identifier le bucket.

  4. Cliquez sur Continuer.

  5. Pour le type d'emplacement, sélectionnez Région, puis us-central1 (Iowa).

  6. Acceptez les autres valeurs par défaut.

  7. Cliquez sur Créer.

gcloud

Pour créer un bucket, exécutez la commande gcloud storage buckets create:

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

L'ID du projet est utilisé dans le workflow callback-event-sample pour identifier le bucket.

Une fois les sources d'événements créées, vous pouvez déployer le workflow du récepteur d'événements.

Déployer un workflow qui écoute des événements

Le workflow callback-event-listener est déclenché lorsqu'un message est publié dans un sujet Pub/Sub ou lorsqu'un fichier est importé dans un bucket Cloud Storage. Le workflow reçoit l'événement, récupère les détails de rappel appropriés à partir de la base de données Firestore, puis envoie une requête HTTP au point de terminaison de rappel.

Console

  1. Dans la console Google Cloud, accédez à la page Workflows:

    Accéder à "Workflows"

  2. Cliquez sur  Créer.

  3. Attribuez un nom au nouveau workflow: callback-event-listener.

  4. Dans la liste Région, sélectionnez us-central1.

  5. Sélectionnez le compte de service que vous avez créé précédemment.

  6. Cliquez sur Suivant.

  7. Dans l'éditeur de workflow, saisissez la définition suivante pour votre workflow:

    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. Cliquez sur Deploy (Déployer).

gcloud

  1. Créez un fichier de code source pour votre workflow:

    touch callback-event-listener.yaml
    
  2. Dans un éditeur de texte, copiez le workflow suivant dans votre fichier de code source:

    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. Déployez le workflow en saisissant la commande suivante :

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

    Remplacez SERVICE_ACCOUNT_NAME par le nom du compte de service que vous avez créé précédemment.

Déployer un workflow en attente d'événements

Le workflow callback-event-sample stocke ses informations de rappel dans une base de données Firestore, interrompt son exécution, puis attend que des événements spécifiques se produisent.

Console

  1. Dans la console Google Cloud, accédez à la page Workflows:

    Accéder à "Workflows"

  2. Cliquez sur  Créer.

  3. Attribuez un nom au nouveau workflow: callback-event-sample.

  4. Dans la liste Région, sélectionnez us-central1.

  5. Sélectionnez le compte de service que vous avez créé précédemment.

  6. Cliquez sur Suivant.

  7. Dans l'éditeur de workflow, saisissez la définition suivante pour votre workflow:

    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. Cliquez sur Deploy (Déployer).

gcloud

  1. Créez un fichier de code source pour votre workflow:

    touch callback-event-sample.yaml
    
  2. Dans un éditeur de texte, copiez le workflow suivant dans votre fichier de code source:

    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. Déployez le workflow en saisissant la commande suivante :

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

    Remplacez SERVICE_ACCOUNT_NAME par le nom du compte de service que vous avez créé précédemment.

Créer un déclencheur Eventarc pour acheminer les événements Pub/Sub

Un déclencheur Eventarc vous permet d'acheminer des événements en spécifiant des filtres pour le déclencheur, y compris la source de l'événement et le workflow cible. Créez un déclencheur Eventarc pour exécuter le workflow callback-event-listener à la suite de la publication d'un message dans un sujet Pub/Sub. En savoir plus sur le déclenchement d'un workflow

Console

  1. Dans la console Google Cloud, accédez à la page Eventarc.

    Accéder à Eventarc

  2. Cliquez sur Créer un déclencheur.

  3. Saisissez un nom de déclencheur

    Par exemple, trigger-pubsub-events-listener.

  4. Dans la liste Fournisseur d'événements, sélectionnez Cloud Pub/Sub.

  5. Dans la liste Événement, sous Personnalisé, sélectionnez google.cloud.pubsub.topic.v1.messagePublish.

  6. Dans la liste Sélectionner un sujet Cloud Pub/Sub, sélectionnez le sujet que vous avez créé précédemment.

  7. Dans la liste Région, sélectionnez us-central1 (Iowa).

  8. Si vous y êtes invité, attribuez le rôle iam.serviceAccountTokenCreator au compte de service Pub/Sub.

  9. Sélectionnez le compte de service que vous avez créé précédemment.

  10. Dans la liste Destination de l'événement, sélectionnez Workflows.

  11. Dans la liste Sélectionner un workflow, sélectionnez le workflow callback-event-listener.

  12. Cliquez sur Créer.

gcloud

Pour créer un déclencheur, exécutez la commande gcloud eventarc triggers create:

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

Les événements sont transformés et transmis à l'exécution du workflow en tant qu'arguments d'exécution. Notez que l'activation du nouveau déclencheur peut prendre jusqu'à deux minutes.

Créer un déclencheur Eventarc pour acheminer les événements Cloud Storage

Un déclencheur Eventarc vous permet d'acheminer des événements en spécifiant des filtres pour le déclencheur, y compris la source de l'événement et le workflow cible. Créez un déclencheur Eventarc pour exécuter le workflow callback-event-listener à la suite de l'importation d'un fichier dans un bucket Cloud Storage. En savoir plus sur le déclenchement d'un workflow

Console

  1. Dans la console Google Cloud, accédez à la page Eventarc.

    Accéder à Eventarc

  2. Cliquez sur Créer un déclencheur.

  3. Saisissez un nom de déclencheur

    Par exemple, trigger-storage-events-listener.

  4. Dans la liste Fournisseur d'événements, sélectionnez Cloud Storage.

  5. Dans la liste Événement, sous Direct, sélectionnez google.cloud.storage.object.v1.finalized.

  6. Dans la liste Bucket, recherchez le bucket que vous avez créé précédemment et sélectionnez-le.

  7. Dans la liste Région, en fonction de votre bucket Cloud Storage, acceptez la valeur par défaut us-central1 (Iowa).

  8. Si vous y êtes invité, attribuez le rôle iam.serviceAccountTokenCreator au compte de service Pub/Sub.

  9. Sélectionnez le compte de service que vous avez créé précédemment.

  10. Dans la liste Destination de l'événement, sélectionnez Workflows.

  11. Dans la liste Sélectionner un workflow, sélectionnez le workflow callback-event-listener.

  12. Cliquez sur Créer.

gcloud

Pour créer un déclencheur, exécutez la commande gcloud eventarc triggers create:

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

Les événements sont transformés et transmis à l'exécution du workflow en tant qu'arguments d'exécution. Notez que l'activation du nouveau déclencheur peut prendre jusqu'à deux minutes.

Exécuter le workflow principal

L'exécution d'un workflow exécute la définition actuelle du workflow associé au workflow. Exécutez le workflow callback-event-sample. Il s'agit du workflow principal, qui attend que des événements spécifiques se produisent. Il ne reprend son exécution que lorsque le workflow secondaire envoie les requêtes de rappel appropriées.

Console

  1. Dans la console Google Cloud, accédez à la page Workflows.

    Accéder à "Workflows"

  2. Sur la page Workflows, cliquez sur le workflow callback-event-sample pour accéder à sa page d'informations.

  3. Sur la page Détails du workflow, cliquez sur Exécuter.

  4. Cliquez à nouveau sur Exécuter.

    L'exécution du workflow commence. Pendant l'exécution, vous devriez voir un état d'exécution Running et une entrée de journal semblable à la suivante: Started waiting 1hr for an event from source topic-callback.

gcloud

Pour mettre en œuvre un workflow, exécutez la commande gcloud workflows run:

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

L'exécution du workflow commence. Pendant l'exécution, un état semblable à celui-ci doit s'afficher:

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

Générer des événements et vérifier l'état de l'exécution

Vous pouvez vérifier que les résultats sont conformes aux attentes en générant des événements, en affichant les entrées de journal et en vérifiant l'état d'exécution du workflow.

Publier un message

Publiez un message dans le sujet Pub/Sub que vous avez créé précédemment.

Console

  1. Dans la console Google Cloud, accédez à la page Sujets de Pub/Sub.

    Accéder aux sujets

  2. Cliquez sur rappel du sujet.

  3. Cliquez sur l'onglet Messages.

  4. Cliquez sur Publier un message.

  5. Dans le champ Corps du message, saisissez Hello World.

  6. Cliquez sur Publier.

gcloud

Pour publier un message, exécutez la commande gcloud pubsub topics publish :

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

Importer un objet

Importez un fichier dans le bucket Cloud Storage que vous avez créé précédemment.

Console

  1. Dans la console Google Cloud, accédez à la page Buckets Cloud Storage.

    Accéder à la page "Buckets"

  2. Cliquez sur le nom du bucket que vous avez créé précédemment.

  3. Dans l'onglet Objets, effectuez l'une des opérations suivantes:

    • Glissez-déposez le fichier souhaité depuis votre bureau ou votre gestionnaire de fichiers vers le volet principal de la console Google Cloud.

    • Cliquez sur Importer des fichiers, sélectionnez le fichier que vous souhaitez importer, puis cliquez sur Ouvrir.

gcloud

Pour importer un fichier, exécutez la commande gcloud storage cp:

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

Remplacez OBJECT_LOCATION par le chemin d'accès local de votre objet. Exemple :random.txt

Afficher les entrées de journal et l'état d'exécution

Confirmez que le workflow callback-event-sample s'est bien déroulé.

Console

  1. Dans la console Google Cloud, accédez à la page Workflows.

    Accéder à "Workflows"

  2. Sur la page Workflows, cliquez sur le workflow callback-event-sample pour accéder à sa page d'informations.

  3. Sur la page Détails du workflow, cliquez sur l'ID d'exécution approprié pour récupérer les détails d'une exécution particulière.

    L'état de l'exécution doit indiquer Réussite et, dans le volet "Sortie", vous devriez voir les événements Pub/Sub et Cloud Storage reçus.

gcloud

  1. Filtrez les entrées de journal et renvoyez la sortie au format JSON :

    gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \
        --format=json
    
  2. Recherchez les entrées de journal semblables à la suivante:

    "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. Vérifiez l'état de la dernière tentative d'exécution:

    gcloud workflows executions wait-last
    

    Le résultat doit ressembler à ce qui suit:

    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
    

Effectuer un nettoyage

Si vous avez créé un projet pour ce tutoriel, supprimez-le. Si vous avez utilisé un projet existant et que vous souhaitez le conserver sans les modifications du présent tutoriel, supprimez les ressources créées pour ce tutoriel.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet :

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer les ressources créées dans ce tutoriel

  1. Supprimez des données de Firestore.

  2. Supprimez un sujet Pub/Sub.

  3. Supprimez un bucket Cloud Storage.

  4. Supprimez un déclencheur Eventarc.

  5. Supprimer un workflow

Étapes suivantes