ワークフローでの実行順序の制御

このページでは、ジャンプまたはループを使用して、ワークフローのステップの実行順序を制御する方法について説明します。基本的なジャンプでは、ワークフローが次に実行するステップを定義できます。条件付きジャンプは、基本的なジャンプに基づいて構築され、条件付きを使用して、ワークフローを介して実行の順序を制御できます。たとえば、別のワークフロー ステップからの変数またはレスポンスが特定の条件を満たしている場合にのみ、特定のステップを実行できます。

このページの例では、曜日を返すサンプル API を使用します。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  5. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  6. 実行順序を変更する既存のワークフローがすでに存在している必要があります。ワークフローを作成してデプロイする方法については、ワークフローの作成と更新をご覧ください。

ジャンプを使用して実行順序を変更する

デフォルトでは、すべてのワークフローは、ワークフローのソースコードに定義された順序で各ステップが実行される、順序付きリストです。ジャンプを使用することで、このデフォルトの順序をオーバーライドすることもできます。

基本ジャンプ

基本的なジャンプを使用して、ワークフローの次に実行するステップを指定できます。

Console

  1. Google Cloud Console で [ワークフロー] ページを開きます。
    [ワークフロー] に移動

  2. 既存のステップの実行順序を変更するワークフローの名前を選択します。

  3. [ワークフローの編集] ページで、[次へ] を選択してワークフロー エディタに移動します。

  4. ステップの最後に next フィールドを追加して、特定のステップにジャンプするようにワークフローに指示します。

    YAML

         - step_a:
             ...
             next: STEP_NAME_TO_JUMP_TO
         - step_b:
             ...
         - next_step:
             ...

    JSON

        [
          {
            "step_a": {
              ...
              "next": "STEP_NAME_TO_JUMP_TO"
            }
          }
          {
            "step_b": {
              ...
            }
          }
          {
            "next_step": {
              ...
            }
          }
        ]

    STEP_NAME_TO_JUMP_TO は、ワークフローが次に実行するステップの名前に置き換えます。例: next_step

  5. [デプロイ] を選択します。

gcloud

  1. テキスト エディタでワークフローの定義ファイルを開きます。

  2. ステップの最後に next フィールドを追加して、特定のステップにジャンプするようにワークフローに指示します。

    YAML

         - step_a:
             ...
             next: STEP_NAME_TO_JUMP_TO
         - step_b:
             ...
         - next_step:
             ...

    JSON

      [
        {
          "step_a": {
            ...
            "next": "STEP_NAME_TO_JUMP_TO"
          }
        }
        {
          "step_b": {
            ...
          }
        }
        {
          "next_step": {
            ...
          }
        }
      ]

    STEP_NAME_TO_JUMP_TO は、ワークフローを実行するステップの名前に置き換えます。例: next_step

  3. ワークフロー ファイルを保存します。

  4. ワークフローをデプロイするには、次のコマンドを入力します。

    gcloud workflows deploy WORKFLOW_NAME \
    --source=WORKFLOW_FILE.YAML
    

    以下を置き換えます。

    • WORKFLOW_NAME: 必須。ワークフローの名前。

    • WORKFLOW_FILE.YAML: 必須。ワークフローのソースファイル。

たとえば、次のワークフローを例にとると、ステップの順番がばらばらになっています。

YAML

  - get_time:
     call: http.get
     args:
         url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
     result: currentTime
  - return_daylight_savings_bool:
     return: ${daylightSavings}
  - get_daylight_savings_bool:
     assign:
         - daylightSavings: ${currentTime.body.isDayLightSavingsTime}

JSON

    [
      {
        "get_time": {
          "call": "http.get",
          "args": {
            "url": "https://us-central1-workflowsample.cloudfunctions.net/datetime"
          },
          "result": "currentTime"
        }
      },
      {
        "return_daylight_savings_bool": {
          "return": "${daylightSavings}"
        }
      },
      {
        "get_daylight_savings_bool": {
          "assign": [
            {
              "daylightSavings": "${currentTime.body.isDayLightSavingsTime}"
            }
          ]
        }
      }
    ]

この例では、next フィールドが get_daylight_savings_bool ステップと return_daylight_savings_bool ステップに追加され、ステップが正しい順序で実行されるようになっています。

YAML

  - get_time:
     call: http.get
     args:
         url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
     result: currentTime
     next: get_daylight_savings_bool
  - return_daylight_savings_bool:
     return: ${daylightSavings}
  - get_daylight_savings_bool:
     assign:
         - daylightSavings: ${currentTime.body.isDayLightSavingsTime}
     next: return_daylight_savings_bool

JSON

    [
      {
        "get_time": {
          "call": "http.get",
          "args": {
            "url": "https://us-central1-workflowsample.cloudfunctions.net/datetime"
          },
          "result": "currentTime",
          "next": "get_daylight_savings_bool"
        }
      },
      {
        "return_daylight_savings_bool": {
          "return": "${daylightSavings}"
        }
      },
      {
        "get_daylight_savings_bool": {
          "assign": [
            {
              "daylightSavings": "${currentTime.body.isDayLightSavingsTime}"
            }
          ],
          "next": "return_daylight_savings_bool"
        }
      }
    ]

条件付きジャンプ

条件付きジャンプを使用すると、ワークフローで次に実行するステップを決定できます。条件付きジャンプでは、特定の条件が満たされたときに指定されたステップにジャンプする switch ブロックが使用されます。各 switch ブロックには、最大 10 個の条件を含めることができます。

Console

  1. Google Cloud Console で [ワークフロー] ページを開きます。
    [ワークフロー] に移動

  2. switch ブロックを追加するワークフローの名前を選択します。

  3. [ワークフローの編集] ページで、[次へ] を選択してワークフロー エディタに移動します。

  4. [ワークフローの定義] ページに、ワークフローの現在の定義が表示されます。条件文に基づいて特定のステップが実行されるように、ワークフローを編集するには、switch ブロックを使用するステップを追加します。

    YAML

         - SWITCH_STEP_NAME:
             switch:
                 - condition: ${EXPRESSION_ONE}
                   next: STEP_A
                 - condition: ${EXPRESSION_TWO}
                   next: STEP_B
                 ...
             next: STEP_C
         - STEP_A
             ...
         - STEP_B
             ...
         - STEP_C
             ...

    JSON

        [
          {
            "SWITCH_STEP_NAME": {
              "switch": [
                {
                  "condition": "${EXPRESSION_ONE}",
                  "next": "STEP_A"
                },
                {
                  "condition": "${EXPRESSION_TWO}",
                  "next": "STEP_B"
                }
              ],
              "next": "STEP_C"
            }
            "STEP_A": {
              ...
            }
            "STEP_B": {
              ...
            }
            "STEP_C": {
              ...
            }
          }
        ]

    次のように置き換えます。

    • SWITCH_STEP_NAME: switch ブロックを含むステップの名前。

    • EXPRESSION_ONE: 評価する最初の式。この式が true と評価された場合、ワークフローでは次に STEP_A が実行されます。この式が false と評価されると、ワークフローは次の式を評価します。

    • EXPRESSION_TWO: 評価する 2 番目の式。この式が true と評価された場合、ワークフローでは次に STEP_B が実行されます。この式が false と評価された場合、ワークフローでは STEP_C が実行されます。

    • STEP_ASTEP_BSTEP_C: プレースホルダのステップ名。

  5. [デプロイ] を選択します。

gcloud

  1. テキスト エディタでワークフローの定義を開きます。

  2. 条件文に基づいて特定のステップが実行されるように、ワークフローを編集するには、switch ブロックを使用するステップを追加します。

    YAML

     - SWITCH_STEP_NAME:
         switch:
             - condition: ${EXPRESSION_ONE}
               next: STEP_A
             - condition: ${EXPRESSION_TWO}
               next: STEP_B
             ...
         next: STEP_C
     - STEP_A
         ...
     - STEP_B
         ...
     - STEP_C
         ...
    

    JSON

    [
      {
        "SWITCH_STEP_NAME": {
          "switch": [
            {
              "condition": "${EXPRESSION_ONE}",
              "next": "STEP_A"
            },
            {
              "condition": "${EXPRESSION_TWO}",
              "next": "STEP_B"
            }
          ],
          "next": "STEP_C"
        }
        "STEP_A": {
          ...
        }
        "STEP_B": {
          ...
        }
        "STEP_C": {
          ...
        }
      }
    ]
      

    次のように置き換えます。

    • SWITCH_STEP_NAME: switch ブロックを含むステップの名前。

    • EXPRESSION_ONE: 評価する最初の式。この式が true と評価された場合、ワークフローでは次に STEP_A が実行されます。この式が false と評価されると、ワークフローは次の式を評価します。

    • EXPRESSION_TWO: 評価する 2 番目の式。この式が true と評価された場合、ワークフローでは次に STEP_B が実行されます。この式が false と評価された場合、ワークフローでは STEP_C が実行されます。

    • STEP_ASTEP_BSTEP_C: プレースホルダのステップ名。

  3. ワークフロー ファイルを保存します。

  4. ワークフローをデプロイするには、次のコマンドを入力します。

    gcloud workflows deploy WORKFLOW_NAME \
    --source=WORKFLOW_FILE.YAML
    

    以下を置き換えます。

    • WORKFLOW_NAME: 必須。ワークフローの名前。

    • WORKFLOW_FILE.YAML: 必須。ワークフローのソースファイル。

たとえば、このワークフローではスイッチ ブロックを使用して、ワークフローの実行順序を制御します。

YAML

  - getCurrentTime:
      call: http.get
      args:
          url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
      result: currentTime
  - conditionalSwitch:
      switch:
          - condition: ${currentTime.body.dayOfTheWeek == "Friday"}
            next: friday
          - condition: ${currentTime.body.dayOfTheWeek == "Saturday" OR currentTime.body.dayOfTheWeek == "Sunday"}
            next: weekend
      next: workWeek
  - friday:
      return: "It's Friday! Almost the weekend!"
  - weekend:
      return: "It's the weekend!"
  - workWeek:
      return: "It's the work week."
    

JSON

    [
      {
        "getCurrentTime": {
          "call": "http.get",
          "args": {
            "url": "https://us-central1-workflowsample.cloudfunctions.net/datetime"
          },
          "result": "currentTime"
        }
      },
      {
        "conditionalSwitch": {
          "switch": [
            {
              "condition": "${currentTime.body.dayOfTheWeek == "Friday"}",
              "next": "friday"
            },
            {
              "condition": "${currentTime.body.dayOfTheWeek == "Saturday" OR currentTime.body.dayOfTheWeek == "Sunday"}",
              "next": "weekend"
            }
          ],
          "next": "workWeek"
        }
      },
      {
        "friday": {
          "return": "It's Friday! Almost the weekend!"
        }
      },
      {
        "weekend": {
          "return": "It's the weekend!"
        }
      },
      {
        "workWeek": {
          "return": "It's the work week."
        }
      }
    ]
      

この例では、switch ブロックに 2 つの条件があります。パーサーは各条件を順番に評価し、条件の式の結果が true の場合、その条件の next ステップが呼び出されます。どの条件も満たされない場合、ワークフローは switch ブロックの外にある next フィールドで指定されたステップを呼び出します。この例では、ステップ workWeek です。

たとえば、曜日が "Saturday" の場合、ワークフローはステップ weekend にジャンプし、メッセージ "It's the weekend!" を返します。ワークフローではこのステップが実行されません。friday 条件付きジャンプではスキップされるため、ワークフローはステップを実行しません。workWeek 理由: return ワークフローの終了を、weekendステップに進みます。

for ループを使用して反復処理を行う

for ループを使用することで、一連の数値や、リストやマップなどのデータのコレクションに対する反復処理を行えます。

リストやマップ内のすべての項目は、アイテムベースの反復処理を使用して処理できます。反復する特定の数値範囲がある場合は、範囲ベースの反復処理を使用できます。

詳細と例については、反復処理の構文リファレンスをご覧ください。

次のステップ