Cloud Tasks を使用すると、タスクを安全にキューに追加し、Cloud Run サービスによって非同期に処理されます。主な用途としては、次のようなものがあります。
- 本番環境で予期しないインシデントが発生した場合にリクエストを保存する
- ユーザーが操作していない作業を遅らせてトラフィックの急増を緩和する
- データベースの更新やバッチ処理など、低速のバックグラウンド オペレーションを委任し、別のサービスで処理することで、ユーザーの応答時間を短縮する
- データベースやサードパーティ API などのバッキング サービスに対するコールレートを制限する
このページでは、タスクをキューに追加して、HTTPS プロトコルを介して限定公開の Cloud Run サービスに安全に push する方法について説明します。プライベート Cloud Run サービスに必要な動作、必要なサービス アカウント権限、タスクキューの作成、タスクの作成について説明します。
始める前に
使用しているプロジェクトで Cloud Tasks API を有効にします。
タスクを処理するための Cloud Run サービスのデプロイ
タスクキューに送信されたタスクを受け入れるサービスをデプロイするには、他の Cloud Run サービスと同じ方法でサービスをデプロイします。Cloud Run サービスは、タスクの処理が完了した後に成功を確認するため、HTTP 200
コードを返す必要があります。
タスクは、Cloud Tasks によって HTTPS 要求として、この Cloud Run サービスに push されます。
クラウドタスクへのレスポンスは、構成されたタイムアウト内に行う必要があります。Cloud Tasks のタイムアウトの最大値を超えて実行する必要があるワークロードの場合は、Cloud Run ジョブの使用を検討してください。
Terraform を使用してデプロイする
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
サービスを作成するには、次のコードを .tf
ファイルに追加します。
タスクキューの作成
コマンドライン
タスクキューを作成するには、次のコマンドを使用します。
gcloud tasks queues create QUEUE-ID
QUEUE-ID は、タスクキューに付ける名前に置き換えます。これはプロジェクト内で一意である必要があります。プロジェクトで App Engine アプリを作成するように求められたら、y
と返信して作成します。Cloud Tasks はこれをキューに使用します。Cloud Run サービスで使用しているのと同じロケーションを選択してください。
ほとんどの場合、デフォルトのタスクキュー構成で機能します。ただし、必要に応じて異なるレート制限と再試行パラメータを設定することもできます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
タスクキューを作成するには、次のコードを .tf
ファイルに追加します。
「terraform apply
」と入力して変更を適用します。
タスクに関連付けるサービス アカウントの作成
キューに入れられたタスクに関連付けられるサービス アカウントを作成する必要があります。このサービス アカウントには、タスクキューが Cloud Run サービスにタスクを push することを許可する Cloud Run Invoker IAM ロールが必要です。.
Console
Google Cloud コンソールで、[サービス アカウント] ページに移動します。
プロジェクトを選択します。
Google Cloud コンソールに表示するサービス アカウント名を入力します。
この名前に基づいてサービス アカウント ID が生成され、Google Cloud コンソールに表示されます。必要に応じて ID を編集します。後で ID を変更することはできません。
(省略可)サービス アカウントの説明を入力します。
[作成して続行] をクリックします。
(省略可)[ロールを選択] フィールドをクリックします。
[Cloud Run] > [Cloud Run 起動元] を選択します。
[完了] をクリックします。
コマンドライン
サービス アカウントを作成します。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"
次のように置き換えます。
- SERVICE_ACCOUNT_NAME は、Google Cloud プロジェクト内で一意の小文字の名前(
my-invoker-service-account-name
など)に置き換えます。 - DISPLAYED_SERVICE_ACCOUNT_NAME は、このサービス アカウントに対してコンソール上で表示する名前(
My Invoker Service Account
など)に置き換えます。
- SERVICE_ACCOUNT_NAME は、Google Cloud プロジェクト内で一意の小文字の名前(
Cloud Run では、サービス アカウントにサービスを呼び出す権限を付与します。
gcloud run services add-iam-policy-binding SERVICE \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/run.invoker
次のように置き換えます。
- SERVICE は、Cloud Tasks によって呼び出されるようにするサービスの名前に置き換えます。
- SERVICE_ACCOUNT_NAME は、サービス アカウントの名前に置き換えます。
- PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
サービス アカウントにプロジェクトへのアクセス権を付与すると、プロジェクト内のリソースに対して特定の操作を行う権限が与えられます。
gcloud projects add-iam-policy-binding RESOURCE_ID \ --member=PRINCIPAL --role=roles/run.invoker
次のように置き換えます。
RESOURCE_ID: Google Cloud プロジェクト ID。
PRINCIPAL: プリンシパルまたはメンバーの識別子。通常、PRINCIPAL_TYPE:ID の形式です(たとえば、
user:my-user@example.com
)。PRINCIPAL に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
次のコードを .tf
ファイルに追加します。
サービス アカウントを作成します。
Cloud Run では、サービス アカウントにサービスを呼び出す権限を付与します。
「terraform apply
」と入力して変更を適用します。
認証トークンを使用した HTTP タスクの作成
タスクキューに送信するタスクを作成するときは、プロジェクト、ロケーション、キュー名、タスクに関連付ける以前に作成したサービス アカウントのメールアドレス、タスクを実行するプライベート Cloud Run サービスの URL、送信する必要があるその他のデータを指定します。 これらの値はハードコードすることもできますが、プロジェクト ID、ロケーション、サービス アカウントのメールアドレスなどの値は、Cloud Run メタデータ サーバーから動的に取得できます。
タスクのリクエスト本文の詳細については、Cloud Tasks API のドキュメントをご覧ください。データ ペイロードを含むリクエストでは、HTTP PUT
または POST
メソッドを使用する必要があります。
タスクをキューに追加するコードには、Cloud Tasks Enqueuer のロールなど、タスクをキューに追加するのに必要な IAM 権限が付与されていなければなりません。Cloud Run でデフォルトのサービス アカウントを使用する場合は、必要な IAM 権限がコードに付与されます。
次の例では、タスク リクエストが作成され、ヘッダー トークンの作成も含まれます。この例では OIDC トークンが使用されます。OAuth トークンを使用する場合は、リクエストの作成時に OIDC パラメータを、それぞれの言語に応じて適切な OAuth パラメータに置き換えます。
Python
requirements.txt
ファイルをメモします。
Java
pom.xml
ファイルをメモします。
Go
Node.js
package.json
ファイルをメモします。