🐷
他プロジェクトの要認証Cloud Runを呼び出す
前提
プロジェクトAにあるfirebase functionsからプロジェクトBにある要認証Cloud Runを呼び出します。
workload-identityを有効にする
これが有効になってなくて永遠に詰まってました。。。
プロジェクトAでの準備
-
functionsを実行するサービスアカウント([project_id]@appspot.gserviceaccount.com)に
サービス アカウント トークン作成者
というロールをつけます。
簡単のためfunctionsで使うデフォルトのやつを使っています。 -
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