状況
社外に公開する API を Cloud Run にデプロイした。run.app の URL を開くと 403 と「Your client does not have permission to get URL / from this server.」が返る。アプリが標準出力に書くログは 1 行も出ていない。デプロイ時のオプションは何も変えていない。
最も疑わしい候補は?
- Aアプリのルーティング(パスの書き間違い)
- Bサービスの IAM で未認証の呼び出しを許可しているか
- Cコンテナが PORT 環境変数のポートで待ち受けているか
- DCloud DNS のレコード
正答
- A
- C
- B
- D
解説
アプリのログが 1 行も無いので、リクエストはコンテナに届く前に Cloud Run の手前で拒否されている。だからアプリのルーティング(A)は原因になりえない。run.app の URL は Google が管理するドメインで、DNS(D)を自分で設定する余地は無い。ポートの不一致(C)ならデプロイ自体が失敗し、403 ではなく起動エラーになる。残るのは IAM。Cloud Run のサービスは既定で認証が必要で、ID トークンなしでアクセスすると、この文言の 403 になる。社外公開が目的なら allUsers に Cloud Run 起動元(roles/run.invoker)を付ける。ただし社内向けのサービスで同じ症状が出たときに allUsers を付けると、誰でも呼べる API になってしまう。付ける前に「公開してよいサービスか」を確かめる。
この問題を含む Google Cloud のテストを制限時間つきで解く
Google Cloudクイズへ