Cloud Tasks ハンドラは、GKE、Compute Engine、さらにはオンプレミス ウェブサーバーなどの外部 IP アドレスを持つ任意の HTTP エンドポイントで実行できます。タスクは、これらのサービスのいずれでも、信頼性が高く構成可能な方法で実行できます。
このページでは、基本的な HTTP Target タスクをプログラムで作成し、Cloud Tasks キューに入れる方法を示します。
HTTP ターゲット(明示的な App Engine ターゲットではない)を持つタスクの場合、タスクを作成する方法は 2 つあります。
CreateTask
メソッド: タスク オブジェクトを明示的に作成する必要があります。このメソッドは、キュー内のタスクが異なるルーティング構成を持つ場合に使用してください。この場合、タスクレベルでルーティングを指定することになり、キューレベルのルーティングは使用できません。この方法では、CreateTask
メソッドを使用します。BufferTask
メソッド: サービスの前にタスクをバッファリングするようにキューが設定されている場合は、このメソッドを使用します。キューにはキューレベルのルーティングが必要です。 この方法では、BufferTask
メソッドを使用します。
CreateTask
メソッドを使用してタスクを作成します。
このセクションでは、タスク オブジェクトを構築してタスクを作成する方法について説明します。CreateTask
メソッドを使用します。
CreateTask
メソッドを使用してタスクを作成すると、タスク・オブジェクトが明示的に作成および定義されます。タスクを処理するサービスとハンドラを指定する必要があります。
タスク固有のデータは、必要に応じてハンドラに渡せます。また、タスクが実行される将来の時間をスケジューリングすることや、タスクが失敗した場合に再試行する回数を制限することなど、タスクの構成を細かく調整することもできます(詳細構成を参照)。
次の例では、Cloud Tasks クライアント ライブラリを使用し、CreateTask
メソッドを呼び出してタスクを作成します。
C#
Go
Java
pom.xml
ファイルをメモします。
Node.js
package.json
ファイルをメモします。
PHP
composer.json
ファイルをメモします。
Python
requirements.txt
ファイルをメモします。
Ruby
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
HTTP ターゲット ハンドラの認証用のサービス アカウントを設定する
Cloud Tasks から HTTP ターゲット ハンドラを呼び出すことができます。このハンドラにアクセスするには認証が必要であり、サービス アカウントに適切な認証情報が設定されている必要があります。
適切なロールを付与すれば、現在のサービス アカウントを使用できます。ここでは、この機能専用の新しいサービス アカウントを作成する方法について説明します。Cloud Tasks の認証に使用する既存または新しいサービス アカウントは、Cloud Tasks キューと同じプロジェクトにあることが必要です。
Google Cloud コンソールで、[サービス アカウント] ページに移動します。
必要に応じて、該当するプロジェクトを選択します。
[サービス アカウントを作成] をクリックします。
[サービス アカウントの詳細] セクションで、アカウントに名前を付けます。コンソールでアカウントに関連するメール アカウント名が作成されます。この名前でアカウントが参照されます。アカウントの用途の説明を追加することもできます。[作成して続行] をクリックします。
[このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、[ロールを選択] をクリックします。[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)トークンをタスク自体に指定します。
CreateTask
メソッド
次の例では、Cloud Tasks クライアント ライブラリで CreateTask
メソッドを使用して、ヘッダー トークンの作成も含むタスクを作成します。この例では ID トークンが使用されます。
アクセス トークンを使用する場合は、リクエストの作成時に OIDC パラメータを、それぞれの言語に応じて適切な OAuth パラメータに置き換えます。
Go
Java
pom.xml
ファイルをメモします。
Node.js
package.json
ファイルをメモします。
Python
requirements.txt
ファイルをメモします。
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
次のコードサンプルでは、お使いの認証トークンの値を指定してください。
独自の 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 サービス エージェント(roles/cloudtasks.serviceAgent
)のロールは、Cloud Tasks のプライマリ サービス エージェントである Cloud Tasks サービス アカウントに手動で追加できます。
この操作は、Cloud Tasks API を 2019 年 3 月 19 日より前に有効にした場合のみ必要になります。
コンソール
- Google Cloud コンソールの [ようこそ] ページで、 Google Cloud プロジェクトのプロジェクト番号を見つけてコピーします。
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 プロジェクト ID。PROJECT_NUMBER
: Google Cloudプロジェクト番号。
その他の構成
構成可能なタスク属性は多数あります。完全なリストについては、タスク リソース定義をご覧ください。たとえば、次の属性をカスタマイズできます。
- 名前付け: タスクの名前を指定した場合、Cloud Tasks はその名前を使用してタスクの重複排除を行いますが、必要な処理によってレイテンシが増加する場合があります。
- スケジュール: タスクを将来の任意の時間にスケジュール設定できます。これは
CreateTask
でのみサポートされ、BufferTask
ではサポートされません。
ルーティングのオーバーライド、レート制限、再試行パラメータなどのキュー属性を構成することもできます。これらの構成は、キュー内のすべてのタスクに適用されます。詳細については、Cloud Tasks キューを構成するをご覧ください。
次のステップ
- RPC API リファレンスで HTTP ターゲット タスクの詳細を確認する。
- REST API リファレンスで HTTP ターゲット タスクの詳細を確認する。