1. はじめに
Cloud Tasks は、大量のタスクの実行、ディスパッチ、配信を管理するためのフルマネージド キューイング サービスです。
Cloud Tasks を使用すると、メインのアプリケーション フローの外部で独立して実行できるタスクと呼ばれる複数の作業(データベース エントリを更新するタスクなど)を分離し、作成したハンドラを使用してそれらの作業を非同期で送信して処理できます。
オフロードされたタスクはキューに追加され、正常に実行されるかエラーが発生するまでタスクが保持されます。構成に基づいて、キューはディスパッチ フロー制御としても機能します。ユーザーがキューを作成して構成し、このキューが Cloud Tasks サービスによって管理されます。タスクが追加されると、キューがタスクをディスパッチし、ワーカーがそれらのタスクを確実に処理できるようにします。
Cloud Tasks の主な機能は次のとおりです。
- HTTP ターゲット: Compute Engine、Google Kubernetes Engine、Cloud Run、Cloud Functions、またはオンプレミス システムで実行されている任意の HTTP サービスをターゲットにしたタスクを、業界標準の OAuth/OIDC 認証を使用して安全な方法で追加します。
- タスクの重複除去: タスクが複数回追加されても、ディスパッチは 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 タスクを作成することもできます。たとえば、HTTP リクエストが Task
と TaskRequest
にラップされてから、CloudTasksClient
で Cloud Tasks に送信される C# サンプルの Program.cs
を確認できます。
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. ルーティング構成でキューを作成する
このステップでは、ルーティング構成で Cloud Tasks キューを作成し、キューレベルのタスク ルーティング構成機能を使用して HTTP URI オーバーライドを追加する方法を学習します。次に、1 つ目の Cloud Run サービスをターゲットとする HTTP タスクを追加し、ルーティング構成によって 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 タスクを作成してテストする
このステップでは、1 つ目のサービスを対象とする HTTP タスクを作成し、2 つ目のサービスを指すようにキューによって URI がオーバーライドされることを確認します。
HTTP タスクを作成する
1 つ目のサービスの 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 番目の(最初ではない)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
(google.com
ではなく)オーバーライドにより、最初の Cloud Run サービスが 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 リクエストを ToDo リストにラップするアプリケーションに負担がかかるうえ、アプリケーションと Tasks クライアント ライブラリの間に依存関係も生じます。
このステップでは、キューレベルの HTTP URI オーバーライドと新しい BufferTask API を利用して、HTTP リクエストを送信するだけで簡単に HTTP ターゲット タスクを作成する方法を説明します。HTTP リクエストを送信できるすべてのアプリケーションで、HTTP ターゲット タスクを作成できるようになりました。
BufferTask API とは何ですか?
CreateTask API はタスクを作成するための古い方法であり、クライアントはすべての必須フィールドを設定して Task オブジェクトを API に送信する必要があります。
BufferTask API は、ユーザーがタスクの構成(HTTP URL、ヘッダー、承認)を指定しなくても HTTP タスクを作成できる新機能です。この API を使用すると、メッセージまたはリクエストの本文を送信するだけで 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
の C# サンプルでは、HTTP GET リクエストを BufferTask API に直接送信しています。Task
にラップしたり、Cloud Tasks のクライアント ライブラリを使用したりする必要はありません。
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 リクエストからタスクを作成し、キューのルーティング構成設定にある URL を URI に追加します。
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 リクエストのバッファリングを容易にする方法。