Cloud Tasks ハンドラは、GKE、Compute Engine、オンプレミス ウェブサーバーなど、外部 IP アドレスを持つ任意の HTTP エンドポイントで実行できます。タスクは、これらのサービスのいずれでも、信頼性が高く構成可能な方法で実行できます。
このページでは、基本的な HTTP Target タスクをプログラムで作成し、Cloud Tasks キューに入れる方法を示します。
HTTP ターゲットを持つタスクの場合(一般的な App Engine ターゲットとは対照的です)、タスクを作成する方法は 2 つあります。
BufferTask
メソッド: サービスの前にタスクをバッファリングするようにキューが設定されている場合は、このメソッドを使用します。キューにはキューレベルのルーティングが必要です。 ほとんどのユースケースでは、これが最適なアプローチです。この方法では、BufferTask
メソッドを使用します。CreateTask
メソッド: より複雑なメソッドです。タスク オブジェクトは、明示的に作成する必要があります。このメソッドは、キュー内のタスクが異なるルーティング構成を持つ場合に使用してください。この場合、タスクレベルでルーティングを指定することになり、キューレベルのルーティングは使用できません。この方法では、CreateTask
メソッドを使用します。
基本的なタスクの作成(BufferTask
メソッド)
このセクションでは、HTTP リクエストを送信してタスクを作成する方法について説明します。使用するメソッドは BufferTask
と呼ばれます。
制限事項
BufferTask
メソッドには次の制限があります。
クライアント ライブラリ:
BufferTask
メソッドは、クライアント ライブラリではサポートされていません。RPC API:
BufferTask
メソッドは、RPC API ではサポートされていません。タスクレベルのルーティング: このメソッドは、タスクレベルのルーティングをサポートしていません。この方法でタスクを作成する際にはルーティング情報を追加する場所がないため、キューレベルのルーティングを使用する必要があります(そうしないと、タスクにルーティング情報がありません)。キューでキューレベルのルーティングを使用していない場合は、HTTP タスクのキューレベル ルーティングを構成するをご覧ください。
BufferTask
メソッドを呼び出す
次の例では、Cloud Tasks API の buffer
エンドポイントに HTTP POST
リクエストを送信してタスクを作成する方法を示します。
curl
次のコード スニペットでは、curl
を使用して BufferTask
メソッドでタスクを作成する例を示します。
curl -X HTTP_METHOD\ "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID/tasks:buffer" \
以下を置き換えます。
HTTP_METHOD
: リクエストの HTTP メソッド(例:GET
またはPOST
)。PROJECT_ID
: Google Cloud プロジェクトの ID。 これは、ターミナルで次のコマンドを実行することで取得できます。gcloud config get-value project
LOCATION
: キューの場所QUEUE_ID
: キューの ID。
Python
高度なタスクの作成(CreateTask
メソッド)
このセクションでは、タスク オブジェクトを構築してタスクを作成する方法について説明します。CreateTask
メソッドを使用します。
CreateTask
メソッドを使用してタスクを作成すると、タスク・オブジェクトが明示的に作成および定義されます。タスクを処理するサービスとハンドラを指定する必要があります。
タスク固有のデータは、必要に応じてハンドラに渡せます。また、タスクが実行される将来の時間をスケジューリングすることや、タスクが失敗した場合に再試行する回数を制限することなど、タスクの構成を細かく調整することもできます(詳細構成を参照)。
次の例では、Cloud Tasks クライアント ライブラリを使用し、CreateTask
メソッドを呼び出してタスクを作成します。
C#
Go
Java
pom.xml
ファイルをメモします。
Node.js
package.json
ファイルをメモします。
PHP
composer.json
ファイルをメモします。
Python
requirements.txt
ファイルをメモします。
Ruby
HTTP ターゲット ハンドラの認証のサービス アカウントの設定
Cloud Tasks から HTTP ターゲット ハンドラを呼び出すことができます。このハンドラにアクセスするには認証が必要であり、サービス アカウントに適切な認証情報が設定されている必要があります。
現在使用しているサービス アカウントがある場合は、適切なロールを付与します。ここでは、この機能専用の新しいサービス アカウントを作成する方法について説明します。Cloud Tasks の認証に使用する既存または新しいサービス アカウントは、Cloud Tasks キューと同じプロジェクトにあることが必要です。
Google Cloud Console で、[サービス アカウント] ページに移動します。
必要に応じて、該当するプロジェクトを選択します。
[サービス アカウントを作成] をクリックします。
[サービス アカウントの詳細] セクションで、アカウントに名前を付けます。コンソールでアカウントに関連するメール アカウント名が作成されます。この名前でアカウントが参照されます。アカウントの説明を追加することもできます。[作成して続行] をクリックします。
[このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、[ロールを選択] をクリックします。[Cloud Tasks へのデータ追加] を検索して選択します。このロールにより、タスクをキューに追加する権限がサービス アカウントに付与されます。
[+ 別の役割を追加] をクリックします。
[ロールを選択] をクリックします。[サービス アカウント ユーザー] を検索して選択します。このロールにより、サービス アカウントは、サービスア アカウントの認証情報を使用してキューがトークンを作成することを承認できます。
ハンドラが Google Cloud の一部である場合は、ハンドラが実行されているサービスへのアクセスに関連付けられたロールをサービスア アカウントに付与します。 Google Cloud 内の各サービスには異なるロールが必要です。たとえば、Cloud Run でハンドラにアクセスするには、Cloud Run 起動元のロールを付与します。作成したサービス アカウントまたはプロジェクト内の他のサービス アカウントを使用できます。
[完了] をクリックして、サービス アカウントの作成を完了します。
Cloud Tasks 自体には、Cloud Tasks Service Agent
ロールが付与された独自のサービス アカウントが必要です。これは、Cloud Tasks サービス アカウントに関連付けられた認証情報に基づいてヘッダー トークンを生成し、ハンドラ ターゲットで認証できるようにするためです。このロールが付与された Cloud Tasks のサービス アカウントは、Cloud Task API を有効にすると自動的に作成されます。ただし、2019 年 3 月 19 日より前にこの API を有効にしていた場合は、このロールを手動で追加する必要があります。
認証トークンがある HTTP ターゲット タスクの使用
Cloud Tasks とそのような認証が必要な HTTP ターゲット ハンドラの間で認証を行うために、Cloud Tasks はヘッダー トークンを作成します。このトークンは、メールアドレスで識別される Cloud Tasks Enqueuer
サービス アカウントの認証情報に基づいて生成されます。認証に使用するサービス アカウントは、Cloud Tasks キューが存在するプロジェクトの一部でなければなりません。リクエストは、ヘッダー トークンとともに HTTPS でキューからハンドラに送信されます。ID トークンまたはアクセス トークンのいずれかを使用できます。ID トークンは通常、Google Cloud で実行されているハンドラ(Cloud RUN Functions や Cloud Run など)で使用されます。主な例外は、*.googleapis.com
でホストされている Google API で、この API ではアクセス トークンが使用されます。
認証は、キューレベルまたはタスクレベルで構成できます。キューレベルで認証を構成するには、Cloud Tasks キューを作成するをご覧ください。認証がキューレベルで構成されている場合、この構成はタスクレベルの構成をオーバーライドします。タスクレベルで認証を構成するには、ID(OIDC)トークンまたはアクセス(OAuth)トークンをタスク自体に指定します。
BufferTask
メソッド
次の例では、BufferTask
メソッドを使用してタスクを作成するときに、アプリケーションのデフォルト認証情報を使用して認証を行います。
curl
curl -X HTTP_METHOD\ "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID/tasks:buffer" \ -H "Authorization: Bearer ACCESS_TOKEN"
以下を置き換えます。
HTTP_METHOD
: リクエストの HTTP メソッド(例:GET
またはPOST
)。PROJECT_ID
: Google Cloud プロジェクトの ID。 これは、ターミナルで次のコマンドを実行することで取得できます。gcloud config get-value project
LOCATION
: キューの場所QUEUE_ID
: キューの ID。ACCESS_TOKEN
:自分のアクセス トークン。これは、ターミナルで次のコマンドを実行することで取得できます。gcloud auth application-default login
gcloud auth application-default print-access-token
Python
次のコードサンプルでは、お使いの認証トークンの値を指定してください。
CreateTask
メソッド
次の例では、Cloud Tasks クライアント ライブラリで CreateTask
メソッドを使用して、ヘッダー トークンの作成も含まれるタスクを作成します。この例では ID トークンが使用されます。
アクセス トークンを使用する場合は、リクエストの作成時に OIDC パラメータを、それぞれの言語に応じて適切な OAuth パラメータに置き換えます。
Go
Java
pom.xml
ファイルをメモします。
Node.js
package.json
ファイルをメモします。
Python
requirements.txt
ファイルをメモします。
独自の HTTP ターゲット タスクハンドラの指定
HTTP Target タスクハンドラは App Engine タスクハンドラとよく似ていますが、次の点が異なります。
- タイムアウト: HTTP ターゲット タスクハンドラでは、デフォルトのタイムアウトは 10 分、最大は 30 分です。
- 認証ロジック: 対象とするサービスで独自のコードを作成してトークンを検証する場合は、ID トークンを使用する必要があります。この操作に関する詳細については、OpenID Connect の、特に ID トークンの検証をご覧ください。
ヘッダー: HTTP ターゲット リクエストには、ハンドラが使用できるタスク固有の情報が含まれたキューによって、ヘッダーが設定されています。これらは App Engine タスク リクエストに設定されたヘッダーと似ていますが、同じではありません。 これらのヘッダーは情報のみを提供します。これらは ID のソースとして使用しないでください。
アプリに対する外部ユーザー リクエストにこのようなヘッダーが含まれている場合、それらは内部ユーザー リクエストによって置換されます。ただし、ログイン済みのアプリケーション管理者からのリクエストは唯一の例外です。アプリケーション管理者は、テストの目的でこのヘッダーを設定することが許可されています。
HTTP ターゲット リクエストには、常に次のヘッダーが含まれます。
ヘッダー 説明 X-CloudTasks-QueueName
キューの名前。 X-CloudTasks-TaskName
タスクの「省略」名。または、作成時に名前が指定されなかった場合は、システムによって生成された一意の ID です。これは、完全なタスク名(task_name = projects/my-project-id/locations/my-location/queues/my-queue-id/tasks/my-task-id
)のmy-task-id
値になります。X-CloudTasks-TaskRetryCount
このタスクが再試行された回数。最初の試行の場合は、この値は 0
です。この試行回数には、5XX エラーコードが原因でタスクが異常終了したため実行フェーズに到達できなかった試行も含まれています。X-CloudTasks-TaskExecutionCount
タスクがハンドラからレスポンスを受け取った合計回数。Cloud Tasks は成功のレスポンスを受け取った時点でタスクを削除するため、それ以前のハンドラからのレスポンスはすべて失敗を意味します。この回数には、5XX エラーコードが原因の失敗は含まれていません。 X-CloudTasks-TaskETA
タスクのスケジュール時間。1970 年 1 月 1 日からの秒数で指定されます。 さらに、Cloud Tasks からのリクエストには次のヘッダーが含まれる場合もあります。
ヘッダー 説明 X-CloudTasks-TaskPreviousResponse
前回の再試行の HTTP レスポンス コード。 X-CloudTasks-TaskRetryReason
タスクを再試行する理由。
Cloud Tasks サービス アカウントに Cloud Tasks サービス エージェントの役割を追加
この操作は、Cloud Tasks API を 2019 年 3 月 19 日より前に有効にした場合のみ必要になります。
コンソール
- プロジェクトのプロジェクト番号は、Google Cloud プロジェクトの設定ページで確認できます。
- その番号をコピーします。
- IAM 管理コンソール ページを開きます。
- [アクセス権を付与] をクリックします。[アクセス権を付与] 画面が開きます。
[プリンシパルの追加] セクションで、次の形式のメールアドレスを追加します:
service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com
PROJECT_NUMBER は、実際の Google Cloud プロジェクトの番号に置き換えます。
[ロールの割り当て] セクションで、Cloud Tasks サービス エージェント ロールを探して選択します。
[保存] をクリックします。
gcloud
プロジェクト番号を確認します。
gcloud projects describe PROJECT_ID --format='table(projectNumber)'
PROJECT_ID は、実際のプロジェクト ID に置き換えます。
その番号をコピーします。
コピーしたプロジェクト番号を使用して、Cloud Tasks サービス アカウントに
Cloud Tasks Service Agent
の役割を付与します。gcloud projects add-iam-policy-binding PROJECT_ID --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com --role roles/cloudtasks.serviceAgent
以下を置き換えます。
PROJECT_ID
: Google Cloud プロジェクト IDPROJECT_NUMBER
: Google Cloud プロジェクト番号。
詳細構成
タスクで構成できる属性はいくつかあります。完全なリストについては、タスクのリソース定義をご覧ください。
カスタマイズできる属性の例:
- 名前付け: タスクの名前を指定した場合、Cloud Tasks はその名前を使用してタスクの重複排除を行いますが、必要な処理によってレイテンシが増加する場合があります。
- スケジュール: タスクを将来の任意の時間にスケジュール設定できます。
CreateTask
でのみサポートされます(BufferTask
ではサポートされません) - 再試行の構成: タスクが失敗した場合の再試行動作を構成します。
CreateTask
でのみサポートされます(BufferTask
ではサポートされません)
次のステップ
- RPC API リファレンスで HTTP ターゲット タスクの詳細を確認する。
- REST API リファレンスで HTTP ターゲット タスクの詳細を確認する。