このチュートリアルでは、ワークフローの実行レートを規制できる 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 環境でアプリケーションを開発するをご覧ください。
コンソール
-
Sign in to your Google Account.
If you don't already have one, sign up for a new account.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Tasks, Compute Engine, and Workflows APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Tasks, Compute Engine, and Workflows APIs.
- 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
-
Sign in to your Google Account.
If you don't already have one, sign up for a new account.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Tasks, Compute Engine, and Workflows APIs:
gcloud services enable cloudtasks.googleapis.com
compute.googleapis.com workflows.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Tasks, Compute Engine, and Workflows APIs:
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 キューを作成します。
Console
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 秒間スリープする
実行が成功すると文字列を返す
Console
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 コネクタをご覧ください。
ワークフローをデプロイします。
Console
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 秒かかります。
Console
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 回呼び出すワークフローを作成してデプロイしました。
レート制限を使用して親ワークフローを実行する
1 秒あたり 1 回のディスパッチのレート制限を Cloud Tasks キューに適用し、親ワークフローを実行します。
Console
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 回呼び出すワークフローが正常にデプロイされました。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
チュートリアル リソースの削除
このチュートリアルで作成したワークフローと 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 を使用してワークフローの実行をキューに入れるをご覧ください。
- ワークフローの構文の詳細については、ワークフローの構文のリファレンスをご覧ください。