Cloud Tasks キューを使用してワークフローの実行をバッファリングする


このチュートリアルでは、ワークフローの実行レートを規制できる Cloud Tasks キューを作成する方法について説明します。

同時に実行できるアクティブなワークフロー実行には最大数があります。この割り当てが使い果たされ、実行バックログが無効になっている場合、またはバックログ実行の割り当てに達した場合、新しい実行は HTTP 429 Too many requests ステータス コードで失敗します。Cloud Tasks キューで定義したレートで子ワークフローを実行できるようにすることで、Workflows の割り当て関連の問題を回避し、実行速度を向上させることが可能です。

Cloud Tasks は、「少なくとも 1 回」を基本に処理を行うように設計されています。ただし、Workflows は Cloud Tasks からの重複リクエストの 1 回限りの処理が保証されません。

次の図では、親ワークフローが、ディスパッチ レートが適用された Cloud Tasks キューによって規制される子ワークフローを呼び出しています。

Cloud Tasks キューを介して子ワークフローのイテレーションを呼び出す親ワークフロー

目標

このチュートリアルの内容は次のとおりです。

  1. 親ワークフローと子ワークフローの間の仲介役として機能する Cloud Tasks キューを作成する。
  2. 親ワークフローからデータを受け取る子ワークフローを作成してデプロイする。
  3. Cloud Tasks キューを介して子ワークフローを実行する親ワークフローを作成してデプロイする。
  4. 子ワークフローの実行を呼び出すディスパッチ レートの制限なしで親ワークフローを実行する。
  5. Cloud Tasks キューにディスパッチ制限を適用し、親ワークフローを実行する。
  6. 子ワークフローが Cloud Tasks キューで定義されたレートで実行されることを確認する。

Google Cloud コンソールで次のコマンドを実行するか、ターミナルまたは Cloud Shell で Google Cloud CLI を使用できます。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。

コンソール

  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 Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

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

    Go to project selector

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

  7. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  8. Google Cloud コンソールの [IAM] ページに移動して、Compute Engine のデフォルトのサービス アカウントの権限を設定します。

    [IAM] に移動

    Compute Engine のデフォルトのサービス アカウントをメモしておいてください。テスト目的で、このチュートリアルのワークフローに関連付けるためです。このサービス アカウントは、Compute Engine を使用する Google Cloud サービスを有効にするか、使用すると自動的に作成されます。メールアドレスの形式は次のとおりです。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、Google Cloud コンソールの [ようこそ] ページで確認できます。

    本番環境では、新しいサービス アカウントを作成して、必要最小限のアクセス許可を含む、最小権限の原則に従った 1 つ以上の IAM ロールを付与することを強くおすすめします。

  9. Compute Engine のデフォルトのサービス アカウントを選択し、その行で [プリンシパルを編集] をクリックします。
  10. 表示されたダイアログ ボックスで、 [別のロールを追加] をクリックし、次のロールを追加します。
    1. [ロールを選択] リストで、[Workflows] > [Workflows 起動元] を選択します。これにより、アカウントにワークフローの実行をトリガーする権限が付与されます。
    2. [ロールを選択] リストで、[Cloud Tasks] > [ Cloud Tasks へのデータ追加] を選択します。これにより、アカウントにタスクを作成する権限が付与されます。
  11. [保存] をクリックします。

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 Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

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

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

  11. Enable the Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  12. Compute Engine のデフォルトのサービス アカウントをメモしておいてください。テスト目的で、このチュートリアルのワークフローに関連付けるためです。このサービス アカウントは、Compute Engine を使用する Google Cloud サービスを有効にするか、使用すると自動的に作成されます。メールアドレスの形式は次のとおりです。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、次のコマンドで確認できます。

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    本番環境では、新しいサービス アカウントを作成して、必要最小限のアクセス許可を含む、最小権限の原則に従った 1 つ以上の IAM ロールを付与することを強くおすすめします。

  13. プロジェクトの Workflows 起動元のロールroles/workflows.invoker)を Compute Engine のデフォルト サービス アカウントに付与し、ワークフローの実行をトリガーする権限を付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/workflows.invoker

    以下を置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID
    • PROJECT_NUMBER: Google Cloud プロジェクト番号。

  14. Compute Engine のデフォルトのサービス アカウントにプロジェクトの Cloud Tasks へのデータ追加ロールroles/cloudtasks.enqueuer)を付与します。これにより、アカウントにタスクを作成する権限が付与されます。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudtasks.enqueuer

Cloud Tasks キューを作成する

親ワークフローで使用でき、ワークフローの実行レートを規制できる Cloud Tasks キューを作成します。

Console

  1. Google Cloud コンソールで、[Cloud Tasks] ページに移動します。

    Cloud Tasks に移動

  2. [push キューを作成] をクリックします。

  3. キュー名 queue-workflow-child を入力します。

  4. [リージョン] リストで [us-central1 (Iowa)] を選択します。

  5. [作成] をクリックします。

gcloud

QUEUE=queue-workflow-child
LOCATION=us-central1
gcloud tasks queues create $QUEUE --location=$LOCATION

子ワークフローを作成してデプロイする

子ワークフローは、親ワークフローからデータを受け取って処理できます。次の処理を行う子ワークフローを作成してデプロイします。

  • 引数として iteration を受け取る
  • 一部の処理をシミュレートするために10 秒間スリープする
  • 実行が成功すると文字列を返す

Console

  1. Google Cloud コンソールの [ワークフロー] ページに移動します。

    [ワークフロー] に移動

  2. [ 作成] をクリックします。

  3. 新しいワークフローに「workflow-child」という名前を入力します。

  4. [リージョン] リストで [us-central1 (Iowa)] を選択します。

  5. [サービス アカウント] リストで、[Compute Engine のデフォルトのサービス アカウント] を選択します。

  6. [次へ] をクリックします。

  7. ワークフロー エディタで、次のワークフローの定義を入力します。

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  8. [デプロイ] をクリックします。

gcloud

  1. ワークフローのソースコード ファイルを作成します。

    touch workflow-child.yaml
  2. テキスト エディタでソースコード ファイルを開き、次のワークフローをファイルにコピーします。

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  3. ワークフローをデプロイします。

    gcloud workflows deploy workflow-child \
        --source=workflow-child.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

親ワークフローを作成してデプロイする

親ワークフローは、for ループを使用して子ワークフローの複数のブランチを実行します。

  1. 親ワークフローを定義するソースコードをコピーします。

    main:
      steps:
        - init:
            assign:
              - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
              - project_number: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
              - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
              - workflow_child_name: "workflow-child"
              - queue_name: "queue-workflow-child"
        - enqueue_tasks_to_execute_child_workflow:
            for:
              value: iteration
              range: [1, 100]
              steps:
                  - iterate:
                      assign:
                        - data:
                            iteration: ${iteration}
                        - exec:
                            # Encode object to JSON string in expression for workflow argument
                            argument: ${json.encode_to_string(data)}
                  - create_task_to_execute_child_workflow:
                      call: googleapis.cloudtasks.v2.projects.locations.queues.tasks.create
                      args:
                          parent: ${"projects/" + project_id + "/locations/" + location + "/queues/" + queue_name}
                          body:
                            task:
                              httpRequest:
                                body: ${base64.encode(json.encode(exec))}
                                url: ${"https://workflowexecutions.googleapis.com/v1/projects/" + project_id + "/locations/" + location + "/workflows/" + workflow_child_name + "/executions"}
                                oauthToken:
                                  serviceAccountEmail: ${project_number + "-compute@developer.gserviceaccount.com"}

    このワークフローは次のパートで構成されています。

    • 子ワークフローと Cloud Tasks キューの名前を参照する定数を割り当てるために使用されるマップ。詳細については、マップをご覧ください。

    • 子ワークフローを繰り返し呼び出すために実行される for ループ。詳細については、イテレーションをご覧ください。

    • 子ワークフローを実行するために、多数のタスクを作成して Cloud Tasks キューに追加するワークフロー ステップ。詳細については、Cloud Tasks API コネクタをご覧ください。

  2. ワークフローをデプロイします。

    Console

    1. Google Cloud コンソールの [ワークフロー] ページに移動します。

      [ワークフロー] に移動

    2. [ 作成] をクリックします。

    3. 新しいワークフローに「workflow-parent」という名前を入力します。

    4. [リージョン] リストで [us-central1 (Iowa)] を選択します。

    5. [サービス アカウント] リストで、[Compute Engine のデフォルトのサービス アカウント] を選択します。

    6. [次へ] をクリックします。

    7. ワークフロー エディタで、親ワークフローの定義を貼り付けます。

    8. [デプロイ] をクリックします。

    gcloud

    1. ワークフローのソースコード ファイルを作成します。

      touch workflow-parent.yaml
    2. テキスト エディタでソースコード ファイルを開き、親ワークフローの定義を貼り付けます。

    3. ワークフローをデプロイします。

      gcloud workflows deploy workflow-parent \
          --source=workflow-parent.yaml \
          --location=us-central1 \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

レート制限なしで親ワークフローを実行する

親ワークフローを実行し、Cloud Tasks キューを介して子ワークフローを呼び出します。実行が完了するまでに約 10 秒かかります。

Console

  1. Google Cloud コンソールの [ワークフロー] ページに移動します。

    [ワークフロー] に移動

  2. [ワークフロー] ページで、[workflow-parent] ワークフローをクリックして詳細ページに移動します。

  3. [ワークフローの詳細] ページで [ 実行] を選択します。

  4. もう一度 [Execute] をクリックします。

  5. 親ワークフローが実行中の場合は、[ワークフロー] ページに戻り、[workflow-child] ワークフローをクリックして詳細ページに移動します。

  6. [Executions] タブをクリックします。

    以下のように、子ワークフローの実行がほぼ同じ時間に実行されていることがわかります。

    ほぼ同時に実行された子ワークフローの実行の詳細。

gcloud

  1. ワークフローを実行します。

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. ワークフローの実行がトリガーされたことを確認するには、直近の 4 つの実行を一覧表示します。

    gcloud workflows executions list workflow-child --limit=4

    実行数(100)が Workflows の同時実行数の制限を下回っているため、結果は次のようになります。数千件の実行を同時に送信すると、割り当ての問題が発生する可能性があります。

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/1570d06e-d133-4536-a859-b7b6a1a85524
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:15.093934448Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/82724960-7d92-4961-aa2c-a0f0be46212c
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.903007626Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/598126fb-37f9-45bc-91d8-aea7d795d702
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.698260524Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/d2e9960b-f93f-4df4-a594-3e7e5c2be53f
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.503818840Z
    END_TIME: 

子ワークフローのイテレーションを 100 回呼び出すワークフローを作成してデプロイしました。

レート制限を使用して親ワークフローを実行する

1 秒あたり 1 回のディスパッチのレート制限を Cloud Tasks キューに適用し、親ワークフローを実行します。

Console

  1. Google Cloud コンソールで、[Cloud Tasks] ページに移動します。

    Cloud Tasks に移動

  2. [queue-workflow-child] をクリックし、作成した Cloud Tasks キューをクリックして、[キューを編集] をクリックします。

  3. [タスク ディスパッチのレート上限] セクションの [最大ディスパッチ数] フィールドに「1」と入力します。

  4. [保存] をクリックします。

  5. [Workflows] ページに移動

    [ワークフロー] に移動

  6. [workflow-parent] ワークフローをクリックして、詳細ページに移動します。

  7. [ワークフローの詳細] ページで [ 実行] を選択します。

  8. もう一度 [Execute] をクリックします。

  9. 親ワークフローが実行中の場合は、[ワークフロー] ページに戻り、[workflow-child] ワークフローをクリックして詳細ページに移動します。

  10. [Executions] タブをクリックします。

    以下のように、子ワークフローの実行が 1 秒あたり 1 件のリクエストで実行されていることがわかります。

    1 秒あたりのリクエストで実行される子ワークフローの詳細。

gcloud

  1. Cloud Tasks キューを更新して、1 秒あたり 1 回のディスパッチのレート制限を適用します。

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. ワークフローを実行します。

    gcloud workflows run workflow-parent \
       --location=us-central1
  3. ワークフローの実行がトリガーされたことを確認するには、直近の 4 つの実行を一覧表示します。

    gcloud workflows executions list workflow-child --limit=4

    結果は次のようになり、1 秒間に 1 つのワークフローが実行されます。

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/becf4957-9fb2-40d9-835d-0ff2dd0c1249
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:24.446361457Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/6c1e7c4b-7ac6-4121-b351-1e2d56d10903
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:23.448213989Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/f2ba5027-af40-4cd3-8cd0-b8033bcc6211
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:22.431485914Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/ecc61ee5-fe87-49eb-8803-89dba929f6c8
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:21.443466369Z
    END_TIME: 

1 秒あたり 1 回のディスパッチ レートで子ワークフローのイテレーションを 100 回呼び出すワークフローが正常にデプロイされました。

クリーンアップ

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。

プロジェクトを削除する

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  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.

チュートリアル リソースの削除

このチュートリアルで作成したワークフローと Cloud Tasks リソースを削除します。

Console

  • ワークフローを削除する手順は次のとおりです。

    1. Google Cloud コンソールの [ワークフロー] ページに移動します。

      [ワークフロー] に移動

    2. ワークフローのリストからワークフローをクリックして、[ワークフローの詳細] ページに移動します。

    3. [削除] をクリックします。

    4. ワークフローの名前を入力し、[確認] をクリックします。

  • Cloud Tasks キューを削除する手順は次のとおりです。

    1. Google Cloud コンソールで、[Cloud Tasks] ページに移動します。

      Cloud Tasks に移動

    2. 削除するキューの名前を選択し、[キューの削除] をクリックします。

    3. 削除を確認します。

gcloud

  • ワークフローを削除するには、次のコマンドを実行します。

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

  • Cloud Tasks キューを削除するには、次のコマンドを実行します。

    gcloud tasks queues delete queue-workflow-child

次のステップ