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 の URL)への直接アクセスができなくなります。これは非公開のサービスにアクセスするためには、リクエストに認証情報(ID トークン)を含める必要があるためです。
たとえば curl コマンドを使用してサービスにアクセスする場合、以下のように gcloud auth
コマンドで取得した ID トークンをリクエストのヘッダーに設定します。このコマンドを実行したユーザーが Cloud Run 起動元(roles/run.invoker)
などのロールが付与されたユーザーであれば、正常なレスポンスが返ってきます。
# 非公開の Cloud Run サービスにアクセスする $ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" {サービスのURL}
他のアプリケーションから Cloud Run にアクセスする場合、Google Cloud SDK などで API を利用して認証を行い、取得したトークンを Cloud Run へのリクエストに含めることができます(参考)。しかし、ブラウザからサービスの URL に直接アクセスする場合はそれができません。
解決策
Identity-Aware Proxy(IAP)を使用する
IAP を Cloud Run の前段に配置すると、ユーザーは IAP に対してのみ認証を行い、非公開の Cloud Run サービスに対する認証は IAP が代わりに行います。
サービスにアクセスできるユーザーは IAP で保護されたウェブアプリ ユーザー(roles/iap.httpsResourceAccessor)
ロールが付与されている Google 組織内のユーザーのみに制限されます。こちらの方法は、社内向けのサービスを Cloud Run にホストする場合などで使用します。
IAP はロードバランサのバックエンドサービスに対して有効化するため、ロードバランサの作成が必須となります。以下の記事で設定手順などを解説しています。
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
にアクセスすると、サービスが正常に表示されます。
佐々木 駿太 (記事一覧)
G-gen最北端、北海道在住のクラウドソリューション部エンジニア
2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2025 Fellowに選出。好きなGoogle CloudプロダクトはCloud Run。
趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。
Follow @sasashun0805