G-gen の佐々木です。当記事では Cloud Run 利用時のよくあるトラブルとして、「認証が必要」の設定を行ったサービスにブラウザからアクセスできない事象とその原因、対処法について解説します。

事象
Cloud Run にデプロイしたサービスの URL(*.a.run.app の URL)にブラウザからアクセスすると、ブラウザに以下のエラーメッセージが表示されました。
Your client does not have permission to get URL / from this server.

原因
Cloud Run の設定画面では、すべてのユーザーがサービスにアクセスできるようにしたい場合は「未認証を許可」、IAM でサービスに対するアクセス権限を持っているユーザーのみアクセスさせたい場合は「認証が必要」に設定する必要があるように見えます。

しかし、「認証が必要」に設定されているサービス(以下、非公開のサービスと呼びます)は、基本的にはブラウザからサービスの URL(*.a.run.app)への直接アクセスができなくなります。非公開のサービスにアクセスするためには、リクエストに認証情報(ID トークン)を含める必要があるためです。
たとえば curl コマンドを使用してサービスにアクセスする場合、以下のように gcloud auth コマンドで取得した ID トークンをリクエストのヘッダーに設定します。Cloud Run 起動元(roles/run.invoker)ロール等を付与されたユーザーがこのコマンドを実行すれば、適切な ID トークンを取得できます。適切な ID トークンを Authorization ヘッダーに設定してリクエストすることで、非公開のサービスを起動できます。
# 非公開の Cloud Run サービスにアクセスする $ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" {サービスのURL}
また、アプリケーションから Cloud Run にアクセスする場合は、Google Cloud SDK などで API を利用して認証を行い、取得したトークンを Cloud Run へのリクエストに含めることができます。
しかし、一般的な Web ブラウザからサービスの URL に直接アクセスする場合は、上記のようなトークン取得と、ヘッダへの付与ができません。
解決策
Identity-Aware Proxy(IAP)を使用する
Identity-Aware Proxy(IAP)を Cloud Run の前段に配置することで、IAP において、Google アカウントによるユーザー認証が行われます。
サービスにアクセスできるユーザーは、IAP で保護されたウェブアプリ ユーザー(roles/iap.httpsResourceAccessor)ロールが付与されている Google Cloud 組織内のユーザーのみに制限されます。こちらの方法は、社内向けのサービスを Cloud Run にホストする場合などで使用します。
Cloud Run に IAP を設定するには、ロードバランサーを使った方法と、Cloud Run サービスに直接 IAP を設定する方法の2通りがあります。以下の記事で設定手順などを解説しています。
Identity Platform を使用する
Identiry Platform を使用する方法では、ユーザーは Identity Platform で認証を行い、取得した ID トークンを Cloud Run に送信します。
メールアドレスとパスワード、電話番号、または Google や Facebook などのソーシャルプロバイダを使用して認証を行うことができるため、エンドユーザーの認証を独自に実装したい場合は、この方法を使用します。
Cloud Run プロキシを使用する
テスト時など、非公開サービスに対して一時的にアクセスするだけであれば、Google Cloud CLI に含まれる Cloud Run プロキシを使用する方法があります。
Cloud Run 起動元(roles/run.invoker)ロール等が付与されたユーザーで以下のコマンドを実行することで、ローカルで実行されるプロキシを経由して非公開サービスにアクセスできます。
# Cloud Run プロキシの実行 $ gcloud run services proxy {サービス名} --project {プロジェクトID} ----- 出力例 ----- Proxying to Cloud Run service [myservice] in project [myproject] region [asia-northeast1] http://127.0.0.1:8080 proxies to https://myservice-xxxxxxxxxx-an.a.run.app
プロキシが実行されている状態でブラウザから http://127.0.0.1:8080 にアクセスすると、Cloud Run サービスが実行されます。
佐々木 駿太 (記事一覧)
G-gen 最北端、北海道在住のクラウドソリューション部エンジニア
2022年6月に G-gen にジョイン。Google Cloud Partner Top Engineer に選出(2024 / 2025 Fellow / 2026)。好きな Google Cloud プロダクトは Cloud Run。
趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。
Follow @sasashun0805