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


Ce tutoriel 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 appelées. Cela permet au workflow parent de traiter les données dans des branches parallèles, ce qui réduit le temps d'exécution global. Le workflow parent attend la fin de toutes les exécutions du workflow enfant avant de renvoyer un résumé des exécutions ayant réussi et échoué, 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 du workflow enfant
  4. Les résultats de toutes les exécutions de workflow enfant ayant abouti ou ayant échoué sont stockés et renvoyés sous forme de mappage.

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.

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. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

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

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activer les API Workflow Executions and Workflows.

    Activer les API

  5. Créez un compte de service :

    1. Dans la console Google Cloud, accédez à la page Créer un compte de service.

      Accéder à la page "Créer un compte de service"
    2. 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 quickstart.

    4. Cliquez sur Créer et continuer.
    5. Attribuez le rôle Workflows > Workflows Invoker au compte de service.

      Pour accorder le rôle, trouvez la liste Sélectionner un rôle, puis sélectionnez Workflows > Workflows Invoker.

    6. Cliquez sur Continuer.
    7. Cliquez sur OK pour terminer la création du compte de service.

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

    Accéder au sélecteur de projet

  7. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  8. Activer les API Workflow Executions and Workflows.

    Activer les API

  9. Créez un compte de service :

    1. Dans la console Google Cloud, accédez à la page Créer un compte de service.

      Accéder à la page "Créer un compte de service"
    2. 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 quickstart.

    4. Cliquez sur Créer et continuer.
    5. Attribuez le rôle Workflows > Workflows Invoker au compte de service.

      Pour accorder le rôle, trouvez la liste Sélectionner un rôle, puis sélectionnez Workflows > Workflows Invoker.

    6. Cliquez sur Continuer.
    7. Cliquez sur OK pour terminer la création du compte de service.

gcloud

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

  2. Installez Google Cloud CLI.
  3. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  4. Créez ou sélectionnez un projet Google Cloud.

    • Créez un projet Google Cloud :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud.

  5. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  6. Activer les API Workflow Executions and Workflows :

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  7. Configurez l'authentification :

    1. Créez le compte de service :

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Remplacez SERVICE_ACCOUNT_NAME par le nom que vous souhaitez donner au compte de service.

    2. Attribuez le rôle IAM roles/workflows.invoker au compte de service.

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

      Remplacez les éléments suivants :

      • SERVICE_ACCOUNT_NAME : nom du compte de service.
      • PROJECT_ID : ID du projet dans lequel vous avez créé le compte de service.
  8. Installez Google Cloud CLI.
  9. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  10. Créez ou sélectionnez un projet Google Cloud.

    • Créez un projet Google Cloud :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud.

  11. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  12. Activer les API Workflow Executions and Workflows :

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  13. Configurez l'authentification :

    1. Créez le compte de service :

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Remplacez SERVICE_ACCOUNT_NAME par le nom que vous souhaitez donner au compte de service.

    2. Attribuez le rôle IAM roles/workflows.invoker au compte de service.

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

      Remplacez les éléments suivants :

      • SERVICE_ACCOUNT_NAME : nom du compte de service.
      • PROJECT_ID : ID du projet dans lequel vous avez créé le compte de service.

Créer et déployer un workflow enfant

Un workflow enfant peut recevoir et traiter des données d'un workflow parent. Le workflow enfant le démontre en procédant comme suit:

  • Reçoit un 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 pair ou impair) 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 du nouveau workflow (workflow-child).

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

gcloud

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

    touch workflow-child.yaml
    
  2. Ouvrez le 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 que vous avez 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'une boucle for parallèle.

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

    1. Un mappage permet de stocker les résultats des exécutions du workflow enfant. 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 É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. L'argument iteration est transmis à chaque itération du workflow enfant. Le workflow parent attend et stocke le résultat de chaque exécution du workflow enfant. Pour en savoir plus, consultez les pages Connecteur de l'API Workflows Executions et 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 Terminer 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 à la page Workflows:

      Accéder à "Workflows"

    2. Cliquez sur  Créer.

    3. Saisissez le nom du nouveau workflow (workflow-parent).

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

    gcloud

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

      touch workflow-parent.yaml
      
    2. Ouvrez le fichier de code source dans un éditeur de texte, puis 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 du compte de service que vous avez créé précédemment.

Exécuter le workflow parent

Exécutez le workflow parent afin que les appels du workflow enfant s'exécutent en parallèle. Les exécutions devraient 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 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 un 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 être semblables à ce qui suit, indiquant des erreurs avec les itérations 2 et 4, et un succès avec 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. 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 du tutoriel

Supprimez les workflows créés dans ce tutoriel:

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

Étapes suivantes