1. はじめに

Cloud Tasks は、大量のタスクの実行、ディスパッチ、配信を管理するためのフルマネージド キューイング サービスです。
Cloud Tasks を使用すると、メインのアプリケーション フローの外部で独立して実行できる作業(データベース エントリを更新するタスクなど)をタスクとして分離し、作成したハンドラを使用した非同期での処理に回すことができます。
オフロードされるタスクはキューに追加され、正常に実行されるか失敗するまでタスクは保持されます。構成に基づいて、キューはディスパッチ フロー制御の役割を果たすこともできます。Cloud Tasks サービスによって管理されるキューを作成して構成します。タスクが追加されると、キューはそのタスクをディスパッチし、ワーカーによって確実に処理されるようにします。

Cloud Tasks の主な機能は次のとおりです。
- HTTP ターゲット: 業界標準の OAuth/OIDC 認証を使用して、Compute Engine、Google Kubernetes Engine、Cloud Run、Cloud Functions、オンプレミス システムで実行されている任意の HTTP サービスを宛先としたタスクを安全に追加できます。
- タスクの重複除去: 同じタスクが複数回追加されても、ディスパッチは 1 回のみ行われます。
- 配信保証: タスクは少なくとも 1 回配信されることが保証されており、ほとんどのタスクは 1 回だけ配信されます。
- レートと再試行の制御: タスクがディスパッチされるレート、試行の最大回数、試行間の最小の待機時間を設定して実行を制御できます。
- 将来のスケジューリング: タスクが実行される時刻を制御します。
この Codelab では、まず HTTP ターゲット タスク用の通常の Cloud Tasks キューを作成して使用する方法を学びます。次に、キューレベルの HTTP URI のオーバーライドと新しい BufferTask API を使用して、Cloud Tasks で HTTP リクエストをより簡単にバッファリングする方法について学習します。
学習内容
- HTTP ターゲット タスクを作成する方法。
- 新しいキューレベルの HTTP URI オーバーライドを使用して HTTP ターゲット タスクを作成する方法。
- 新しいキューレベルの HTTP URI オーバーライドを使用して保留中のタスクを変更する方法。
- 新しい BufferTask API を使用して HTTP リクエストをより簡単にバッファリングする方法。
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell の起動
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。
3. HTTP ターゲット タスクの通常のキューを作成する
この最初のステップでは、通常の Cloud Tasks キューを作成し、HTTP タスクを追加して Cloud Run サービスをターゲットにする方法を学びます。

HTTP ターゲット タスクとは
HTTP ターゲット タスクは、業界標準の OAuth/OIDC 認証を使用して、Compute Engine、Google Kubernetes Engine、Cloud Run、Cloud Functions、オンプレミス システムで実行されている任意の HTTP サービスを安全にターゲットにできます。
Cloud Run サービスをデプロイする
まず、必要な API が有効になっていることを確認します。
gcloud services enable \ cloudtasks.googleapis.com \ run.googleapis.com
HTTP タスクのターゲットとして機能する Cloud Run サービスをデプロイします。
SERVICE1=hello1 REGION=us-central1 gcloud run deploy $SERVICE1 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
Cloud Tasks キューを作成する
通常の Cloud Tasks キューを作成します。
QUEUE1=http-queue LOCATION=us-central1 gcloud tasks queues create $QUEUE1 --location=$LOCATION
キューを一時的に一時停止して、HTTP タスクの作成を観察します。
gcloud tasks queues pause $QUEUE1 --location=$LOCATION
4. HTTP タスクを作成してテストする
このステップでは、先ほど作成したキューをターゲットとする HTTP タスクを作成します。
HTTP タスクを作成する
gcloud を使用して HTTP タスクを作成できます。
gcloud tasks create-http-task \
--queue=$QUEUE1 \
--location=$LOCATION \
--url=$SERVICE1_URL \
--method=GET
省略可: クライアント ライブラリを使用して HTTP タスクを作成することもできます。たとえば、Program.cs では、HTTP リクエストが Task と TaskRequest でラップされてから CloudTasksClient で Cloud Tasks に送信される C# サンプルを確認できます。
var taskRequest = new CreateTaskRequest
{
Parent = new QueueName(projectId, location, queue).ToString(),
Task = new Task
{
HttpRequest = new HttpRequest
{
HttpMethod = HttpMethod.Get,
Url = url
}
}
};
var client = CloudTasksClient.Create();
var response = client.CreateTask(taskRequest);
次のように実行して、タスクを作成してキューに追加できます。
dotnet run $PROJECT_ID $LOCATION $QUEUE1 $SERVICE1_URL
HTTP タスクをテストする
この時点で、タスクは作成されますが、キューが一時停止されているため、まだ実行されません。キューを一覧表示することで、これを確認できます。
gcloud tasks queues list --location=$LOCATION
キューが PAUSED 状態になっているはずです。
QUEUE_NAME STATE http-queue PAUSED
キューを再開します。
gcloud tasks queues resume $QUEUE --location=$LOCATION
Cloud Run サービスのログを確認します。
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1
Cloud Run サービスが Cloud Tasks から HTTP GET リクエストを受信したことが表示されます。
httpRequest: latency: 0.227597158s protocol: HTTP/1.1 remoteIp: 35.243.23.192 requestMethod: GET requestSize: '415' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.32.53 status: 200 userAgent: Google-Cloud-Tasks
5. ルーティング構成を使用してキューを作成する
このステップでは、キューレベルのタスク ルーティング構成機能を使用して、HTTP URI オーバーライドを追加するルーティング構成で Cloud Tasks キューを作成する方法について説明します。次に、HTTP タスクを追加して最初の Cloud Run サービスをターゲットにし、ルーティング構成が URI をオーバーライドしてタスクを 2 番目の Cloud Run サービスにルーティングすることを確認します。

キューレベルのタスク ルーティング構成とは
キューレベルのタスク ルーティング構成は、保留中と新規のすべてのタスクのキュー全体について、HTTP タスク ルーティングを変更します。これにより、HTTP ターゲットをタスクレベルで設定する必要がなくなり、より簡単にタスクを作成できるようになります。また、サービス プロバイダは、キュー内のすべてのタスクのターゲットを設定できる立場になり、これまで以上に制御がしやすくなります(元のバックエンドがダウンした場合にトラフィックを別のバックエンドにルーティングするなど)。
次の構成はキューレベルで設定できます。
- ヘッダー: キューレベルで指定されたキューレベルのヘッダーは、キュー内のすべてのタスクのヘッダーを upsert します。
- HTTP メソッド: キューレベルで指定された HTTP メソッドは、キュー内のすべてのタスクの HTTP メソッドをオーバーライドします。
- ターゲット URI: ホスト、パス、クエリ、ポート、スキーム(HTTP または HTTPS)は個別にオーバーライドできます。
- 認可: キューレベルで指定された OIDC/OAuth 構成は、タスクレベルの OIDC/OAuth 構成をオーバーライドします。
2 つ目の Cloud Run サービスをデプロイする
後で HTTP URI のオーバーライドのターゲットとして機能する 2 つ目の Cloud Run サービスをデプロイします。
SERVICE2=hello2 REGION=us-central1 gcloud run deploy $SERVICE2 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
後で使用するために、サービス URL のホストを保存します。
SERVICE2_URL=$(gcloud run services describe $SERVICE2 --region $REGION --format 'value(status.url)') SERVICE2_HOST=$(echo $SERVICE2_URL | sed 's,http[s]*://,,g')
ルーティング構成を使用して Cloud Tasks キューを作成する
2 番目の Cloud Run サービスへの HTTP URI オーバーライドを含むルーティング構成でキューを作成します。
QUEUE2=http-queue-uri-override gcloud beta tasks queues create $QUEUE2 \ --http-uri-override=host:$SERVICE2_HOST \ --location=$LOCATION
URI のオーバーライドは 2 番目の Cloud Run サービスを参照します。キューに追加された HTTP タスクの元の URI ホストはオーバーライドされます。キューの構成を確認できます。
gcloud beta tasks queues describe $QUEUE2 --location=$LOCATION
httpTarget に、2 番目のサービスのホストを指す uriOverride があることを確認します。
httpTarget:
uriOverride:
host: hello2-idcwffc3yq-uc.a.run.app
pathOverride: {}
queryOverride: {}
...
キューを一時的に一時停止して、HTTP タスクの作成を観察します。
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
6. ルーティング構成を使用してキューの HTTP タスクを作成してテストする
このステップでは、最初のサービスをターゲットとする HTTP タスクを作成し、その URI がキューによってオーバーライドされて 2 番目のサービスを指すことを確認します。
HTTP タスクを作成する
最初のサービスの URL を使用して HTTP タスクを作成します。
gcloud tasks create-http-task \
--queue=$QUEUE2 \
--location=$LOCATION \
--url=$SERVICE1_URL \
--method=GET
HTTP タスクをテストする
キューを再開します。
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
オーバーライドにより、2 番目(1 番目ではない)の Cloud Run サービスが Cloud Tasks から HTTP GET リクエストを受信したことがわかります。
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE2" --limit 1
--- httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello2-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
7. ルーティング構成を使用して保留中のタスクを変更する
ルーティング構成を使用して、キューに追加されている保留中のすべてのタスクの HTTP URI を変更することもできます。これは、バックエンド サービスがダウンした場合に、別のサービスにすばやくルーティングする場合に便利です。このステップで、その仕組みを見てみましょう。
キューを再度一時停止します。
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
タスク URL として google.com を使用して HTTP タスクを作成します。
gcloud tasks create-http-task \
--queue=$QUEUE2 \
--location=$LOCATION \
--url=https://www.google.com \
--method=GET
キューが一時停止しているため、タスクは保留状態になります。
次に、最初のサービスを指すように HTTP URI のオーバーライドを更新します。これにより、保留中のタスクのホストが google.com から最初のサービスのホストにオーバーライドされます。
SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)') SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g') gcloud beta tasks queues update $QUEUE2 \ --http-uri-override=host:$SERVICE1_HOST \ --location=$LOCATION
キューを再開します。
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
最初の Cloud Run サービスが(google.com ではなく)オーバーライドにより Cloud Tasks から HTTP GET リクエストを受信したことがわかります。
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1 --- httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
8. BufferTask API のキューを作成する
通常、タスクは gcloud または Tasks クライアント ライブラリから Tasks API を使用して作成します。これにより、アプリケーションはクライアント ライブラリを使用して HTTP リクエストを Tasks でラップする必要が生じ、アプリケーションと Tasks クライアント ライブラリの間に依存関係が生まれます。
このステップでは、キューレベルの HTTP URI のオーバーライドと新しい BufferTask API を利用して、HTTP リクエストを送信するだけで HTTP ターゲット タスクを簡単に作成する方法について説明します。HTTP リクエストを送信できるアプリケーションであれば、HTTP ターゲット タスクを作成できるようになりました。

BufferTask API とは
CreateTask API はタスクを作成する古い方法であり、クライアントは必要なすべてのフィールドが設定された Task オブジェクトを API に送信する必要があります。
BufferTask API は、タスク構成(HTTP URL、ヘッダー、認証)を提供することなく HTTP タスクを作成できる新機能です。これにより、メッセージやリクエストの本文を Buffer API に簡単に送信できます。
これにより、クライアント側でコードを変更することなく、Cloud Tasks をサービスの前にデプロイできるようになり、サービスとの統合が容易になります。BufferTask API に送信された任意の HTTP リクエストは、Task オブジェクトとしてラップされ、キューレベルで設定された宛先に配信されます。
BufferTask API を使用するには、キューにターゲット URI 構成が設定されている必要があります。つまり、キューレベル ルーティング構成機能は、BufferTask API を使用するための前提条件になります。
ルーティング構成を使用して Cloud Tasks キューを作成する
前のステップでデプロイした最初のサービスを指すルーティング構成を使用して、キューを作成します。
SERVICE1=hello1 SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)') SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g') QUEUE3=http-queue-uri-override-buffer gcloud beta tasks queues create $QUEUE3 \ --http-uri-override=host:$SERVICE1_HOST \ --location=$LOCATION
キューを一時的に一時停止して、HTTP タスクの作成を観察します。
gcloud tasks queues pause $QUEUE3 --location=$LOCATION
9. BufferTask API を使用して HTTP リクエストをバッファリングする
このステップでは、BufferTask API を使用して単純な HTTP GET リクエストまたは POST リクエストをバッファリングします。Cloud Tasks は、これらの HTTP リクエストをキューのデフォルトのルーティング構成設定で HTTP タスクにラップします。
まず、ログインしてアクセス トークンを取得し、いくつかの変数を設定します。
gcloud auth application-default login ACCESS_TOKEN=$(gcloud auth application-default print-access-token) PROJECT_ID=$(gcloud config get-value project) TASKS_QUEUES_API="https://cloudtasks.googleapis.com/v2beta3/projects/$PROJECT_ID/locations/$LOCATION/queues"
HTTP タスクを作成する
BufferTask API を使用して HTTP タスクを作成します。タスクを作成する必要のない単純な HTTP GET リクエストであることにご注目ください。
curl -X GET "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \ -H "Authorization: Bearer $ACCESS_TOKEN"
HTTP POST と本文を含む別の HTTP タスクを作成します。
curl -X POST "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d "{'message': 'Hello World'}"
省略可: クライアント ライブラリを使用して HTTP タスクを作成することもできます。たとえば、Program.cs をご覧ください。これは、HTTP GET リクエストを Task でラップしたり、Cloud Tasks のクライアント ライブラリを必要とすることなく、BufferTask API に直接送信する C# サンプルです。
var BufferTaskApiUrl = $"https://cloudtasks.googleapis.com/v2beta3/projects/{ProjectId}/locations/{Location}/queues/{Queue}/tasks:buffer";
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {AccessToken}");
var response = await client.GetAsync(BufferTaskApiUrl);
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {content}");
}
次のように実行できます。
dotnet run $PROJECT_ID $LOCATION $QUEUE3 $ACCESS_TOKEN
BufferTask API は、HTTP リクエストからタスクを作成し、キューのルーティング構成設定から URI の URL を追加します。
HTTP タスクをテストする
キューを再開します。
gcloud tasks queues resume $QUEUE3 --location=$LOCATION
Cloud Run サービスが Cloud Tasks から HTTP GET リクエストと POST リクエストを受信したことがわかります。
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 4
--- httpRequest: latency: 0.002279292s protocol: HTTP/1.1 remoteIp: 35.243.23.42 requestMethod: POST requestSize: '777' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5450' serverIp: 216.239.32.53 status: 200 userAgent: Google-Cloud-Tasks ... httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
10. 完了
お疲れさまでした。これでこの Codelab は終了です。
フォローアップとして、Pub/Sub と Cloud Run との間のバッファとしての Cloud Tasks を試して、Cloud Tasks のこれらの新機能がサービス間のバッファキューを簡単に作成するのにどのように役立つかの実例を確認してください。
クリーンアップ(省略可)
課金されないようにするには、リソースをクリーンアップすることをおすすめします。
プロジェクトが不要になった場合は、プロジェクトを削除します。
gcloud projects delete $PROJECT_ID
プロジェクトが必要な場合は、リソースを個別に削除できます。
Cloud Run サービスを削除します。
gcloud run services delete $SERVICE1 --region $REGION gcloud run services delete $SERVICE2 --region $REGION
Cloud Tasks キューを削除します。
gcloud tasks queues delete $QUEUE1 --location=$LOCATION gcloud tasks queues delete $QUEUE2 --location=$LOCATION gcloud tasks queues delete $QUEUE3 --location=$LOCATION
学習した内容
- HTTP ターゲット タスクを作成する方法。
- 新しいキューレベルの HTTP URI オーバーライドを使用して HTTP ターゲット タスクを作成する方法。
- 新しいキューレベルの HTTP URI オーバーライドを使用して保留中のタスクを変更する方法。
- 新しい BufferTask API を使用して HTTP リクエストをより簡単にバッファリングする方法。