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)への直接アクセスができなくなります。非公開のサービスにアクセスするためには、リクエストに認証情報(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通りがあります。以下の記事で設定手順などを解説しています。

blog.g-gen.co.jp

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 にアクセスすると、Cloud Run サービスが実行されます。

佐々木 駿太 (記事一覧)

G-gen 最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月に G-gen にジョイン。Google Cloud Partner Top Engineer に選出(2024 / 2025 Fellow / 2026)。好きな Google Cloud プロダクトは Cloud Run。

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