Exécuter un workflow qui exécute d'autres workflows en parallèle


Ce tutoriel vous explique comment créer et exécuter un workflow parent qui exécute plusieurs workflows enfants en parallèle.

Dans le schéma suivant, quatre exécutions parallèles du workflow enfant sont invoquée. Cela permet au workflow parent de traiter les données dans des branches parallèles, et réduit le temps d'exécution global. Le workflow parent attend la fin de toutes les exécutions de workflow enfant avant de renvoyer un résumé des exécutions réussies et des échecs, ce qui simplifie la détection des erreurs.

Workflow parent appelant des itérations parallèles d'un workflow enfant

Objectifs

Au cours de ce tutoriel, vous allez :

  1. Créez et déployez un workflow enfant qui reçoit des données d'un workflow parent.
  2. Créez et déployez un workflow parent qui exécute plusieurs workflows enfants à l'aide d'une boucle for parallèle.
  3. Exécuter le workflow parent qui appelle des exécutions parallèles de l'élément enfant du workflow.
  4. Les résultats de toutes les exécutions de workflow enfant réussies et échouées sont stockés et renvoyés dans une carte.

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

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

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. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the Workflow Executions and Workflows APIs.

    Enable the APIs

  5. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the Workflows > Workflows Invoker role to the service account.

      To grant the role, find the Select a role list, then select Workflows > Workflows Invoker.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  8. Enable the Workflow Executions and Workflows APIs.

    Enable the APIs

  9. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the Workflows > Workflows Invoker role to the service account.

      To grant the role, find the Select a role list, then select Workflows > Workflows Invoker.

    6. Click Continue.
    7. Click Done to finish creating the service account.

gcloud

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  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 Workflow Executions and Workflows APIs:

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  7. Set up authentication:

    1. Create the service account:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Replace SERVICE_ACCOUNT_NAME with a name for the service account.

    2. Grant the roles/workflows.invoker IAM role to the service account:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=roles/workflows.invoker

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account
  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. 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.

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

  12. Enable the Workflow Executions and Workflows APIs:

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  13. Set up authentication:

    1. Create the service account:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Replace SERVICE_ACCOUNT_NAME with a name for the service account.

    2. Grant the roles/workflows.invoker IAM role to the service account:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=roles/workflows.invoker

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account

Créer et déployer un workflow enfant

Un workflow enfant peut recevoir et traiter les données d'un workflow parent. Le workflow enfant illustre cela en procédant comme suit :

  • Reçoit un nombre entier en tant qu'argument
  • Mise en veille pendant 10 secondes pour simuler un traitement
  • Renvoie un indicateur (selon que l'entier est un nombre impair ou pair) pour simuler la réussite ou l'échec de l'exécution du workflow.

Console

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

    Accéder à "Workflows"

  2. Cliquez sur  Créer.

  3. Saisissez le nom, workflow-child, du nouveau workflow.

  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: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - check_iteration_even_or_odd:
            switch:
              - condition: ${iteration % 2 == 0}
                next: raise_error
        - return_message:
            return: ${"Hello world"+iteration}
        - raise_error:
            raise: ${"Error with iteration "+iteration}
  8. Cliquez sur Déployer.

gcloud

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

    touch workflow-child.yaml
  2. Ouvrez votre fichier de code source dans un éditeur de texte et copiez-y le workflow suivant.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - check_iteration_even_or_odd:
            switch:
              - condition: ${iteration % 2 == 0}
                next: raise_error
        - return_message:
            return: ${"Hello world"+iteration}
        - raise_error:
            raise: ${"Error with iteration "+iteration}
  3. Déployez le workflow :

    gcloud workflows deploy workflow-child \
        --source=workflow-child.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 créé précédemment.

Créer et déployer le workflow parent

Le workflow parent exécute plusieurs branches du workflow enfant à l'aide d'un boucle for parallèle.

  1. Copiez le code source pour la définition du workflow. Il se compose des éléments suivants :

    1. Une carte permet de stocker les résultats des exécutions de workflow enfants. Pour en savoir plus, consultez Maps.

      main:
        steps:
          - init:
              assign:
                - execution_results: {} # results from each execution
                - execution_results.success: {} # successful executions saved under 'success' key
                - execution_results.failure: {} # failed executions saved under 'failure' key
    2. Une boucle for est exécutée en parallèle pour appeler le workflow enfant. Pour en savoir plus, consultez les sections Étapes parallèles et Itération.

      - execute_child_workflows:
          parallel:
            shared: [execution_results]
            for:
              value: iteration
              in: [1, 2, 3, 4]
              steps:
                  - iterate:
    3. Le workflow enfant est appelé à l'aide d'un connecteur. Chaque itération de la le workflow enfant reçoit l'argument iteration. Le workflow parent attend et stocke le résultat de chaque exécution de workflow enfant. Pour plus pour en savoir plus, consultez Connecteur de l'API Workflows Executions et les arguments d'exécution.

      try:
        steps:
          - execute_child_workflow:
              call: googleapis.workflowexecutions.v1.projects.locations.workflows.executions.run
              args:
                workflow_id: workflow-child
                #location: ...
                #project_id: ...
                argument:
                  iteration: ${iteration}
              result: execution_result
          - save_successful_execution:
              assign:
                - execution_results.success[string(iteration)]: ${execution_result}
      except:
          as: e
          steps:
            - save_failed_execution:
                assign:
                  - execution_results.failure[string(iteration)]: ${e}
    4. Les résultats de l'exécution sont renvoyés. Pour en savoir plus, consultez la section Achever l'exécution d'un workflow.

      - return_execution_results:
          return: ${execution_results}
  2. Déployez le workflow :

    Console

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

      Accéder à "Workflows"

    2. Cliquez sur  Créer.

    3. Saisissez le nom, workflow-parent, du nouveau workflow.

    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, collez la définition du workflow parent.

    8. Cliquez sur Déployer.

    gcloud

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

      touch workflow-parent.yaml
    2. Ouvrez votre fichier de code source dans un éditeur de texte et collez la définition du workflow parent.

    3. Déployez le workflow :

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

      Remplacez SERVICE_ACCOUNT_NAME par le nom de compte de service créé précédemment.

Exécuter le workflow parent

Exécutez le workflow parent afin que les invocations du workflow enfant s'exécutent en parallèle. Les exécutions doivent prendre environ 10 secondes.

Console

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

    Accéder à "Workflows"

  2. Sur la page Workflows, cliquez sur le workflow-parent 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.

  5. Affichez les résultats du workflow dans le volet Output (Résultat).

    Les résultats devraient être semblables à ce qui suit, indiquant des erreurs avec les itérations 2 et 4, et le succès avec les itérations 1 et 3.

    "failure": {
      "2": {
        "message": "Execution failed or cancelled.",
        "operation": {
          "argument": "{\"iteration\":2}",
          "duration": "10.157992541s",
          "endTime": "2023-07-11T13:13:13.028424329Z",
          "error": {
            "context": "RuntimeError: \"Error with iteration 2\"\nin step \"raise_error\", routine \"main\", line: 18",
            "payload": "\"Error with iteration 2\"",
    ...
      "4": {
        "message": "Execution failed or cancelled.",
        "operation": {
          "argument": "{\"iteration\":4}",
          "duration": "10.157929734s",
          "endTime": "2023-07-11T13:13:13.061289142Z",
          "error": {
            "context": "RuntimeError: \"Error with iteration 4\"\nin step \"raise_error\", routine \"main\", line: 18",
            "payload": "\"Error with iteration 4\"",
    ...
    "success": {
      "1": "Hello world1",
      "3": "Hello world3"

gcloud

Exécutez le workflow :

gcloud workflows run workflow-parent \
    --location=us-central1

Les résultats devraient ressembler à ce qui suit, indiquant des erreurs pour les itérations 2 et 4, et un succès pour les itérations 1 et 3.

Waiting for execution [06c753e4-6947-4c62-ac0b-2a9d53fb1b8f] to complete...done.
argument: 'null'
duration: 14.065415004s
endTime: '2023-07-11T12:50:43.929023883Z'
name: projects/386837416586/locations/us-central1/workflows/workflow-parent/executions/06c753e4-6947-4c62-ac0b-2a9d53fb1b8f
result: '{"failure":{"2":{"message":"Execution failed or cancelled.","operation":{"argument":"{\"iteration\":2}","duration":"10.143718070s","endTime":"2023-07-11T12:50:40.673209821Z","error":{"context":"RuntimeError:
...
"Error with iteration 2\"\nin step \"raise_error\", routine \"main\", line: 18","payload":"\"Error
...
"Error with iteration 4\"\nin step \"raise_error\", routine \"main\", line: 18","payload":"\"Error
...
"success":{"1":"Hello world1","3":"Hello world3"}}'
startTime: '2023-07-11T12:50:29.863608879Z'
state: SUCCEEDED

Vous avez créé et déployé un workflow qui appelle un workflow enfant, exécute quatre itérations du workflow enfant dans des branches parallèles et renvoie un indicateur de réussite ou d'échec pour chaque exécution du workflow enfant.

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

Supprimer les ressources du tutoriel

Supprimez les workflows créés dans ce tutoriel :

gcloud workflows delete workflow-child
gcloud workflows delete workflow-parent

Étape suivante