2024/03/15
認証が必要な Cloud Run サービスにアクセスする方法まとめ
はじめに
Google Cloud の Cloud Run を使ってインターネット上に公開せず内部からのアクセスのみを受け付けるサービスを構築する場合、いくつかの方法がありますが認証オプションを「認証が必要」にしてデプロイする方法がもっとも簡単です。
この方法でデプロイした Cloud Run サービスの URL にブラウザでアクセスするとリクエストに認証情報が含まれてないため
1Error: Forbidden 2Your client does not have permission to get URL / from this server.
というエラーが表示されます。このエラーを回避して、アクセスする方法のうち代表的な3パターンを紹介します。
前提
Node.js で書かれたアプリケーションがデプロイされた次の 2 つの Cloud Run サービスがデプロイされている環境があるとします。
- 「Front」はインターネット上から直接アクセスされることを想定しているため、認証オプション「未認証のアクセスを許可」を設定してデプロイされている
- 「Internal」は「Front」から内部でアクセスされるもので外部からのアクセスを拒否したいため、認証オプション「認証が必要」を設定してデプロイされている
① 他の Cloud Run サービスからアクセスする方法
「Front」 → 「Internal」
同じプロジェクトでデプロイされた Cloud Run 同士でアクセスする場合、Google Auth Libraryを使うことで認証に必要なトークンを含んだ HTTP ヘッダーが取得できます。
「Front」の Cloud Run サービスをデプロイしたサービスアカウントにCloud Run 起動元
(roles/run.invoker
) ロールが付与されている場合、下記のようなコードでアクセスが可能になります。
1import { GoogleAuth } from "google-auth-library"; 2 3・・・ 4 5const auth = new GoogleAuth(); 6const client = await auth.getIdTokenClient(`${「Internal」のURL}`); 7const headers = await client.getRequestHeaders(); 8 9// headersの中に Authorization: Bearer ${トークン} が設定されている 10await fetch(`${「Internal」のURL}`, { headers });
②Cloud Run 以外のサービスからアクセスする方法
Cloud Scheduler → 「Internal」
Cloud Schedulerから「Internal」にアクセスする場合は、HTTP ターゲットを作成する際、Auth ヘッダーを「OIDC トークンを追加」に設定してサービスアカウントにCloud Run 起動元
(roles/run.invoker
) ロールが付与されているものを設定すると、自動でトークンを付与した HTTP アクセスを行ってくれます。
Cloud Pub/Subなどでも同じように OIDC 認証を設定することでアクセス可能になります。
③ ローカルからアクセスする方法
開発者のローカル PC のコンソール → 「Internal」
gcloud CLI を使うことで開発用の汎用 ID トークンを生成することができます。Cloud Run 起動元
(roles/run.invoker
) ロールが付与されているユーザーでログインして、gcloud auth print-identity-token
を実行するとログインユーザーのトークンが取得できます。
curl コマンドと組み合わせて下記の様に実行することでアクセスが成功します。
1curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${「Internal」のURL}
まとめ
今回紹介した内容はすべて Google Cloud の公式ドキュメントに記載されているものですが、複数のページにまたがって解説されており、個人的に探すのが大変だったのでブログにまとめました。同じような苦労をされている方のお役に立てれば幸いです。
参考リンク
Author Profile
ARIKAWA
バックエンドエンジニアです。 自転車が好きです。
SHARE