このページでは、Pub/Sub を使用してメッセージを Cloud Run サービスのエンドポイントに push する方法を説明します。このエンドポイントでは、メッセージが HTTP リクエストとしてコンテナに配信されます。このページでは、同じ Google Cloud プロジェクトの Pub/Sub サブスクリプションから push されたメッセージを、サービスで安全に処理する方法について説明します。
サービス アカウントと IAM 権限を利用することで、Cloud Run サービスを公開することなく、Cloud Run で Pub/Sub を非公開かつ安全に使用できます。設定した Pub/Sub サブスクリプションのみがサービスを呼び出せます。
Cloud Run の確認応答期限
Pub/Sub サブスクリプションの確認応答期限(ackDeadlineSeconds
)を 600 秒以下にしてください。Cloud Run サービスは 600 秒以内にレスポンスを返すことで Pub/Sub メッセージに応答する必要があります。応答しなかった場合、Pub/Sub はメッセージを再配信するため、Cloud Run サービスで重複トリガーが発生します。
ユースケース
考えられるユースケースには、次のようなものがあります。
- Cloud Storage バケットへのファイル アップロードのイベントを受信した後、データを変換する。
- Google Cloud のオペレーション スイートのログを Pub/Sub にエクスポートして Cloud Run で処理する。
- Cloud Run サービスから独自のカスタム イベントをパブリッシュして処理する。
統合の概要
サービスを Pub/Sub と統合するには:
- Pub/Sub トピックを作成します。
- 作成したトピックに送信された Pub/Sub メッセージに応答するコードを、Cloud Run サービスに追加します。
- 必要な権限を持つサービス アカウントを作成します。
- Pub/Sub サブスクリプションを作成し、サービス アカウントに関連付けます。このサブスクリプションは、トピックにパブリッシュされているすべてのメッセージをサービスに送信します。
始める前に
- Cloud Run の設定ページの説明に従って環境を設定します(まだ設定していない場合)。
- このガイドでは、すでに Cloud Run サービスが存在していて、それを Pub/Sub と統合するコードを追加する場合を前提としています。このようなサービスがない場合は、このページではなく、Pub/Sub の Cloud Run チュートリアルをご覧ください。
Pub/Sub からのメッセージを処理するコードを追加する
既存のサービスコードを編集して、Pub/Sub のサポートに必要なコードを追加します。サービスはリクエストからメッセージを抽出し、所定の成功コードを返す必要があります。以下の代表的な言語のスニペット(任意の言語を使用可能)では、単純な Hello World メッセージを出力する方法を示します。
Node.js
Python
Go
Java
正確な HTTP レスポンス コードを返すようにサービスをコーディングする必要があります。HTTP 200
や 204
などの成功コードは、Pub/Sub メッセージの処理の完了を意味します。HTTP 400
や HTTP 500
などのエラーコードは、push を使用したメッセージの受信で説明されているとおり、メッセージが再試行されることを示します。
上記の Pub/Sub コードで更新した後、Cloud Run サービスをビルドしてデプロイします。
サブスクリプション用のサービス アカウントを作成する
Pub/Sub サブスクリプションに関連付けるサービス アカウントを作成し、Cloud Run サービスの呼び出し権限を付与する必要があります。Cloud Run サービスに push された Pub/Sub メッセージには、このサービス アカウントの ID が含まれています。
既存のサービス アカウントを使用して Pub/Sub サブスクリプション ID とするか、新しいサービス アカウントを作成することが可能です。
新しいサービス アカウントを作成し、Cloud Run サービスを呼び出す権限を付与するには:
コンソール
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 は、Pub/Sub によって呼び出されるサービスの名前に置き換えます。
- 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
ファイルに次の行を追加します。サービス アカウントにサービスを呼び出す権限を付与するには、既存の
.tf
ファイルに次の行を追加します。
Pub/Sub トピックを作成する
サービスへのリクエストは Pub/Sub トピックに公開されたメッセージによってトリガーされるため、トピックを作成する必要があります。
コンソール
Google Cloud コンソールの [Pub/Sub トピック] ページにアクセスします。
[トピックを作成] をクリックします。
トピックに一意の名前(MyTopic など)を入力します。
コマンドライン
gcloud pubsub topics create TOPIC-NAME
TOPIC-NAME は、Google Cloud プロジェクト内で一意のトピック名に置き換えます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
このセクションでは、Terraform で Google Cloud Platform Provider の google_pubsub_topic
リソースを使用して、Terraform 構成にサービスを定義する方法を説明します。
次の内容を既存の .tf
ファイルに追加します。
push サブスクリプションを作成してサービス アカウントに関連付ける
Pub/Sub トピックを作成後、トピックに送信されたメッセージを受信するためにサービスを登録し、サービス用に作成したサービス アカウントにサブスクリプションを関連付ける必要があります。Google Cloud コンソールまたは gcloud コマンドラインのいずれかを使用できます。
コンソール
[Pub/Sub トピック] ページに移動します。
登録するトピックをクリックします。
[サブスクリプションを作成] をクリックして登録フォームを表示します。
フォームで次の操作を行います。
- 配信タイプで [push] を指定します。
- [エンドポイント URL] で、サービスの URL を指定します。この URL はサービスの詳細ページに表示されます。
- [サービス アカウント] プルダウンから、必要な権限付きで作成したサービス アカウントを選択します。
- サブスクリプションの有効期限と 600 秒の確認応答期限を設定します。
- [作成] をクリックします。
登録が完了しました。これで、トピックに送信されたメッセージがサービスに push されるようになります。
コマンドライン
Pub/Sub がプロジェクトで認証トークンを作成できるようにします。
gcloud projects add-iam-policy-binding PROJECT-ID \ --member=serviceAccount:service-PROJECT-NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
次のように置き換えます。
- PROJECT-ID は、Google Cloud プロジェクト ID に置き換えます。
PROJECT-NUMBER は、Google Cloud プロジェクト番号に置き換えます。
プロジェクト ID とプロジェクト番号は、Google Cloud コンソールで、対象プロジェクトの [プロジェクト情報] パネルに表示されます。
必要な権限付きで作成されたサービス アカウントで、Pub Sub サブスクリプションを作成します。
gcloud pubsub subscriptions create SUBSCRIPTION-ID --topic TOPIC-NAME \ --ack-deadline=600 \ --push-endpoint=SERVICE-URL/ \ --push-auth-service-account=SERVICE-ACCOUNT-NAME@PROJECT-ID.iam.gserviceaccount.com
次のように置き換えます。
- TOPIC-NAME は、以前に作成したトピックに置き換えます。
- SERVICE-URL は、サービスをデプロイしたときに指定した HTTPS URL に置き換えます。これを確認するには、サービスの名前を指定してコマンド
gcloud run services describe
を実行し、出力結果の中からdomain
で始まる行を探します。 - PROJECT-ID は、Google Cloud プロジェクト ID に置き換えます。
--push-auth-service-account
フラグは、認証と認可用に Pub/Sub の push 機能を有効にします。確認応答期限は最大 600 秒に設定されています。
登録が完了しました。これで、トピックに送信されたメッセージがサービスに push されるようになります。次のコマンドを使用して、テスト メッセージをトピックに push できます。
gcloud pubsub topics publish TOPIC --message "hello"
TOPIC は、作成したトピックの名前に置き換えます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
-
Pub/Sub がプロジェクトで認証トークンを作成できるようにします。次のコードを
.tf
ファイルに追加します。 -
必要な権限付きで作成されたサービス アカウントで、Pub/Sub サブスクリプションを作成します。次のコードを
.tf
ファイルに追加します。 -
登録が完了しました。これで、トピックに送信されたメッセージがサービスに push されるようになります。次のコマンドを使用して、テスト メッセージをトピックに push できます。
gcloud pubsub topics publish TOPIC --message "hello"
TOPIC は、作成したトピックの名前に置き換えます。
次のステップ
- 内部 Ingress 制御を使用して上り(内向き)を制限することで本番環境のセキュリティを向上させる方法については、上り(内向き)の制限をご覧ください。
- サンプル アプリケーション全体は、Pub/Sub の Cloud Run チュートリアルをご覧ください。
- Pub/Sub を使用した非同期画像処理のサンプルについては、Cloud Storage の Cloud Run チュートリアルをご覧ください。
- Pub/Sub の詳細については、Pub/Sub のドキュメントをご覧ください。