🔒

Pub/SubからマルチリージョンCloud Runへのpush認証をカスタムオーディエンスで実現する

に公開

概要

Cloud Pub/SubからCloud RunへのpushリクエストをIAMで認証する場合、通常はPub/SubサブスクリプションのオーディエンスにCloud RunのURLを指定することで、セキュアな通信を実現できます。

しかし、ロードバランサを介したマルチリージョン構成のCloud Runにpushする場合、この方法では認証がうまくいかない場合があります。どのリージョンのCloud Runにリクエストが振り分けられるか決まっていないため、オーディエンスとリクエストを実際に処理するCloud Runサービスが一致しない可能性があるからです。

この課題をカスタムオーディエンスを利用して解決し、マルチリージョン環境でもセキュアな通信を実現する方法についてまとめました。

前提

プロジェクトAのPub/Subサブスクリプションから、プロジェクトBのロードバランサ経由でマルチリージョンのCloud Runにpushするシナリオを想定します。

  • プロジェクトA
    • Cloud Pub/Subのトピックと、push型のサブスクリプションが作成済みであること
    • サブスクリプションにプロジェクトBのCloud Runを呼び出すロール(roles/run.invokerなど)の付与されているサービスアカウントが設定されていること
  • プロジェクトB
    • 複数のリージョンにCloud Runサービスがデプロイ済みであること
    • サーバーレスNEG(Network Endpoint Group)を使用するグローバル外部アプリケーションロードバランサが設定済みで、Cloud Runにリクエストを振り分けられる状態であること

設定手順

1. Cloud Runへのカスタムオーディエンス設定

各リージョンのCloud Runサービスに、共通のカスタムオーディエンスを設定します。

この設定はコンソール上からは設定できないように見えますが(2025/9/8現在)、gcloudコマンドやTerraformなどを利用して実施することができます。下記ドキュメントを参考にしてください。
https://cloud.google.com/run/docs/configuring/custom-audiences?hl=ja

2. Pub/Subサブスクリプションへのオーディエンス設定

Pub/Subサブスクリプションに対して、先ほどCloud Runに設定したカスタムオーディエンスを指定します。

こちらはコンソールからでも設定可能で、「トークン オーディエンス(省略可)」の項目に、設定したカスタムオーディエンスの値を入力します。

コンソールやgcloudコマンドで設定する場合の詳細は、下記を参考にしてください。
https://cloud.google.com/pubsub/docs/authenticate-push-subscriptions?hl=ja#configure_for_push_authentication

Terraformを使用する場合は、下記のとおりoidc_tokenブロックにオーディエンス設定を追加します。
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/pubsub_subscription#audience-1

以上の設定で、Pub/Subは指定されたカスタムオーディエンスを持つトークンを生成し、ロードバランサ経由でいずれかのCloud Runにリクエストが到達した際に、Cloud Run側がそのトークンを正しく検証できるようになります。

参考資料

https://cloud.google.com/load-balancing/docs/https/setting-up-https-serverless?hl=ja#pubsub

レスキューナウテックブログ

Discussion