このチュートリアルでは、ワークフローの実行レートを規制できる Cloud Tasks キューを作成する方法について説明します。
同時に実行できるアクティブなワークフロー実行には最大数があります。この割り当てが使い果たされ、実行バックログが無効になっている場合、またはバックログ実行の割り当てに達した場合、新しい実行は HTTP 429 Too many requests ステータス コードで失敗します。Cloud Tasks キューで定義したレートで子ワークフローを実行できるようにすることで、Workflows の割り当て関連の問題を回避し、実行速度を向上させることが可能です。
Cloud Tasks は、「少なくとも 1 回」を基本に処理を行うように設計されています。ただし、Workflows は Cloud Tasks からの重複リクエストの 1 回限りの処理が保証されません。
次の図では、親ワークフローが、ディスパッチ レートが適用された Cloud Tasks キューによって規制される子ワークフローを呼び出しています。
目標
このチュートリアルの内容は次のとおりです。
- 親ワークフローと子ワークフローの間の仲介役として機能する Cloud Tasks キューを作成する。
- 親ワークフローからデータを受け取る子ワークフローを作成してデプロイする。
- Cloud Tasks キューを介して子ワークフローを実行する親ワークフローを作成してデプロイする。
- 子ワークフローの実行を呼び出すディスパッチ レートの制限なしで親ワークフローを実行する。
- Cloud Tasks キューにディスパッチ制限を適用し、親ワークフローを実行する。
- 子ワークフローが Cloud Tasks キューで定義されたレートで実行されることを確認する。
Google Cloud コンソールで次のコマンドを実行するか、ターミナルまたは Cloud Shell で Google Cloud CLI を使用できます。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
コンソール
-
Google アカウントにログインします。
Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Tasks, Compute Engine, and Workflows APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Tasks, Compute Engine, and Workflows APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.- Google Cloud コンソールで、[IAM] ページに移動して、Compute Engine のデフォルト サービス アカウントの権限を設定します。
Compute Engine のデフォルトのサービス アカウントをメモしておいてください。テスト目的で、このチュートリアルのワークフローにこのサービス アカウントを関連付けます。このサービス アカウントは、Compute Engine を使用する Google Cloud サービスを有効にするか、使用すると自動的に作成されます。メールアドレスの形式は次のとおりです。
PROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBERは、使用するGoogle Cloud プロジェクト番号に置き換えます。プロジェクト番号は、 Google Cloud コンソールの [ようこそ] ページで確認できます。本番環境では、新しいサービス アカウントを作成して、必要最小限のアクセス許可を含む、最小権限の原則に従った 1 つ以上の IAM ロールを付与することを強くおすすめします。
- Compute Engine のデフォルトのサービス アカウントを選択し、その行で [プリンシパルを編集] をクリックします。
- 表示されたダイアログ ボックスで、[ 別のロールを追加] をクリックして、次のロールを追加します。
- [ロールを選択] リストで、[Workflows] > [Workflows 起動元] を選択します。これにより、アカウントにワークフローの実行をトリガーする権限が付与されます。
- [ロールを選択] リストで、[Cloud Tasks] > [ Cloud Tasks へのデータ追加] を選択します。これにより、アカウントにタスクを作成する権限が付与されます。
- [保存] をクリックします。
gcloud
-
Google アカウントにログインします。
Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。ロールを付与する方法を確認する。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Cloud Tasks API、Compute Engine API、Workflows API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。ロールを付与する方法を確認する。gcloud services enable cloudtasks.googleapis.com
compute.googleapis.com workflows.googleapis.com -
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。ロールを付与する方法を確認する。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Cloud Tasks API、Compute Engine API、Workflows API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。ロールを付与する方法を確認する。gcloud services enable cloudtasks.googleapis.com
compute.googleapis.com workflows.googleapis.com 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 ロールを付与することを強くおすすめします。
- プロジェクトの 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 プロジェクト IDPROJECT_NUMBER: Google Cloud プロジェクト番号
- 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 キューを作成します。
コンソール
Google Cloud コンソールで、[Cloud Tasks] ページに移動します。
[push キューを作成] をクリックします。
[キュー名] に「
queue-workflow-child」と入力します。[リージョン] リストで [us-central1 (Iowa)] を選択します。
[作成] をクリックします。
gcloud
QUEUE=queue-workflow-child LOCATION=us-central1 gcloud tasks queues create $QUEUE --location=$LOCATION
子ワークフローを作成してデプロイする
子ワークフローは、親ワークフローからデータを受け取って処理できます。次の処理を行う子ワークフローを作成してデプロイします。
- 引数として
iterationを受け取る - 一部の処理をシミュレートするために10 秒間スリープする
実行が成功すると文字列を返す
コンソール
Google Cloud コンソールで [ワークフロー] ページに移動します。
[ 作成] をクリックします。
新しいワークフローに「
workflow-child」という名前を入力します。[リージョン] リストで [us-central1 (Iowa)] を選択します。
[サービス アカウント] リストで、[Compute Engine のデフォルトのサービス アカウント] を選択します。
[次へ] をクリックします。
ワークフロー エディタで、次のワークフローの定義を入力します。
[デプロイ] をクリックします。
gcloud
ワークフローのソースコード ファイルを作成します。
touch workflow-child.yamlテキスト エディタでソースコード ファイルを開き、次のワークフローをファイルにコピーします。
ワークフローをデプロイします。
gcloud workflows deploy workflow-child \ --source=workflow-child.yaml \ --location=us-central1 \ --service-account=
PROJECT_NUMBER-compute@developer.gserviceaccount.com
親ワークフローを作成してデプロイする
親ワークフローは、for ループを使用して子ワークフローの複数のブランチを実行します。
親ワークフローを定義するソースコードをコピーします。
このワークフローは次のパートで構成されています。
子ワークフローと Cloud Tasks キューの名前を参照する定数を割り当てるために使用されるマップ。詳細については、マップをご覧ください。
子ワークフローを繰り返し呼び出すために実行される
forループ。詳細については、イテレーションをご覧ください。子ワークフローを実行するために、多数のタスクを作成して Cloud Tasks キューに追加するワークフロー ステップ。詳細については、Cloud Tasks API コネクタをご覧ください。
ワークフローをデプロイします。
コンソール
Google Cloud コンソールで、[ワークフロー] ページに移動します。
[ 作成] をクリックします。
新しいワークフローに「
workflow-parent」という名前を入力します。[リージョン] リストで [us-central1 (Iowa)] を選択します。
[サービス アカウント] リストで、[Compute Engine のデフォルトのサービス アカウント] を選択します。
[次へ] をクリックします。
ワークフロー エディタで、親ワークフローの定義を貼り付けます。
[デプロイ] をクリックします。
gcloud
ワークフローのソースコード ファイルを作成します。
touch workflow-parent.yamlテキスト エディタでソースコード ファイルを開き、親ワークフローの定義を貼り付けます。
ワークフローをデプロイします。
gcloud workflows deploy workflow-parent \ --source=workflow-parent.yaml \ --location=us-central1 \ --service-account=
PROJECT_NUMBER-compute@developer.gserviceaccount.com
レート制限なしで親ワークフローを実行する
親ワークフローを実行し、Cloud Tasks キューを介して子ワークフローを呼び出します。実行が完了するまでに 10 秒ほどかかります。
コンソール
Google Cloud コンソールで、[ワークフロー] ページに移動します。
[ワークフロー] ページで、[workflow-parent] ワークフローをクリックして詳細ページに移動します。
[ワークフローの詳細] ページで [play_arrow 実行] を選択します。
もう一度 [Execute] をクリックします。
親ワークフローが実行中の場合は、[ワークフロー] ページに戻り、[workflow-child] ワークフローをクリックして詳細ページに移動します。
[Executions] タブをクリックします。
以下のように、子ワークフローの実行がほぼ同じ時間に実行されていることがわかります。

gcloud
ワークフローを実行します。
gcloud workflows run workflow-parent \ --location=us-central1
ワークフローの実行がトリガーされたことを確認するには、直近の 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 回呼び出すワークフローを作成してデプロイしました。
レート制限を使用して親ワークフローを実行する
Cloud Tasks キューに 1 秒あたり 1 回のディスパッチのレート制限を適用し、親ワークフローを実行します。
コンソール
Google Cloud コンソールで、[Cloud Tasks] ページに移動します。
[queue-workflow-child] をクリックし、作成した Cloud Tasks キューをクリックして、[キューを編集] をクリックします。
[タスク ディスパッチのレート上限] セクションの [最大ディスパッチ数] フィールドに「1」と入力します。
[保存] をクリックします。
[Workflows] ページに移動
[workflow-parent] ワークフローをクリックして、詳細ページに移動します。
[ワークフローの詳細] ページで [play_arrow 実行] を選択します。
もう一度 [Execute] をクリックします。
親ワークフローが実行中の場合は、[ワークフロー] ページに戻り、[workflow-child] ワークフローをクリックして詳細ページに移動します。
[Executions] タブをクリックします。
以下のように、子ワークフローの実行が 1 秒あたり 1 件のリクエストで実行されていることがわかります。

gcloud
Cloud Tasks キューを更新して、1 秒あたり 1 回のディスパッチのレート制限を適用します。
gcloud tasks queues update $QUEUE \ --max-dispatches-per-second=1 \ --location=us-central1
ワークフローを実行します。
gcloud workflows run workflow-parent \ --location=us-central1
ワークフローの実行がトリガーされたことを確認するには、直近の 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 回呼び出すワークフローが正常にデプロイされました。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトの削除
課金されないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Google Cloud コンソールで [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
チュートリアル リソースの削除
このチュートリアルで作成したワークフローと Cloud Tasks リソースを削除します。
Console
ワークフローを削除する手順は次のとおりです。
Google Cloud コンソールで、[ワークフロー] ページに移動します。
ワークフローのリストからワークフローをクリックして、[ワークフローの詳細] ページに移動します。
[削除] をクリックします。
ワークフローの名前を入力し、[確認] をクリックします。
Cloud Tasks キューを削除する手順は次のとおりです。
Google Cloud コンソールで、[Cloud Tasks] ページに移動します。
削除するキューの名前を選択し、[キューの削除] をクリックします。
削除を確認します。
gcloud
ワークフローを削除するには、次のコマンドを実行します。
gcloud workflows delete workflow-child gcloud workflows delete workflow-parent
Cloud Tasks キューを削除するには、次のコマンドを実行します。
gcloud tasks queues delete queue-workflow-child
次のステップ
- Cloud Tasks を使用してワークフローをキューに入れ、非同期で実行する方法については、Cloud Tasks を使用してワークフローの実行をキューに入れるをご覧ください。
- ワークフローの構文の詳細については、ワークフローの構文のリファレンスをご覧ください。