Cloud Runサービスを「認証が必要」に設定したらブラウザからアクセスできなくなった

記事タイトルとURLをコピーする

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 はロードバランサのバックエンドサービスに対して有効化するため、ロードバランサの作成が必須となります。以下の記事で設定手順などを解説しています。

blog.g-gen.co.jp

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 2024に選出。好きなGoogle CloudプロダクトはCloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。