🐷

他プロジェクトの要認証Cloud Runを呼び出す

2023/05/20に公開

前提

プロジェクトAにあるfirebase functionsからプロジェクトBにある要認証Cloud Runを呼び出します。

workload-identityを有効にする

これが有効になってなくて永遠に詰まってました。。。

https://console.cloud.google.com/iam-admin/workload-identity-pools

プロジェクトAでの準備

  1. functionsを実行するサービスアカウント([project_id]@appspot.gserviceaccount.com)にサービス アカウント トークン作成者というロールをつけます。
    簡単のためfunctionsで使うデフォルトのやつを使っています。

  2. IdTokenをつけたリクエストを行う
    audienceはCloud Runのエンドポイントです。リクエストを送るAPIサーバーのパスやクエリパラメータは不要です。
    独自ドメインにマッピングしていたとしても、不変です。このまま使ってください。
    ※2023/05/20時点でプレビューで変更できるようです

import { GoogleAuth } from "google-auth-library";

const audience = "https://[service_name]-aaaaaaaa-an.a.run.app";
const url = "https://[service_name]-aaaaaaaa-an.a.run.app/health";

const auth = new GoogleAuth();
const client = await auth.getIdTokenClient(audience);
const result = await client.request<any>({
  url,
  method: "POST",
  data: {text: "Hello"},
  headers: {
    "Content-Type": "application/json",
  },
});
console.info(result.data);

プロジェクトBでの準備

要認証でデプロイされたCloud Runの権限タブに行き、プリンシパルにfunctionsを実行するサービスアカウント([project_id]@appspot.gserviceaccount.com)を追加します。
ロールにはCloud Run 起動元をつけましょう。

IAMタブからではなくここで追加することで、このCloud Runのサービスのみ呼び出せるようになります。
※IAMタブからでも条件を設定すればできそう。

Discussion