Cloud Load Balancingを使い、Cloud RunサービスにIAPで認証を追加する
今回やりたかったのは Cloud IAP という Google がいい具合に処理してくれる認証用の proxy サーバを Cloud Run の前段に置き、特定の人しかアクセスできないようにすること。
Cloud Run には直接 IAP を設定することができず、必要な準備がいくつかある。今回はこの実現のために必要な準備を確認した。
Cloud IAP, Cloud Load Balancingをおさらい
Cloud Run は Cloud Functions 同様、そもそも認証情報付きでしかアクセスできないようにすることもできるが、Cloud IAP ( Indentity-Aware Proxy ) はアカウント単位で許可する人を登録したり、Google Workspace と組み合わせてドメイン丸ごとに対して設定することで、社内限定公開のようなものをお手軽に実現できるスグレモノだ。ただし Cloud IAP を直接設定できるのは App Engine ( GAE ) だけで、それ以外は Cloud Load Balancing のアプリケーションロードバランサと組み合わせる必要がある。
Cloud Load Balancing には L7 アプリケーションロードバランサ(外部/内部)、L4 ネットワークロードバランサ(外部/内部、プロキシ/パススルー)があるが、今回利用するのは外部アプリケーションロードバランサになる。VPN を使わず、インターネット越しのアクセスに対して特定の人のみアクセスできるようにしたい。
この辺は Load Balancing 側のドキュメントではなく IAP 側のドキュメントから参照していくと寄り道が減って分かりやすい。
外部 HTTP(S) ロードバランサの設定 | Identity-Aware Proxy | Google Cloud
※ 意識が発散しやすい人は各ロードバランサの役割の違いなどが気になるだろうが、グッと我慢しないと帰ってこれないので注意。
まとめ
Cloud Run はよくできてる。欲しいものは service の設定画面からポチポチでだいたい追加できそうな勢い。App Engine と違ってサービス単位で Logging などへの遷移がしやすいようになっているし、とても気が利いている。
IAP を利用するための Load Balancing の設定も 2024-02 時点では preview だが、Integration からサクッと設定できてしまう。
確認したこと
- Cloud Run の Integration ( preview ) 機能で Custom domains - Google Cloud Load Balancing を追加
- その後別途手作業で Load Balancing ( Frontend + Backend ) + Serverless NEG
両方試した。2 は 加えて Frontend に
- Custom Domain
- Google-managed Certificate
を設定し、Backend に
- Identity-Aware Proxy
を設定した。いずれも手作業であり、自動化はしていない。
分かったこと
- IAP は Load Balancer の Backend service 単位に設定できる。これは GAE に対する IAP の設定の様子と似ている。GAE は service を複数持つことができ、service ごとに IAP の設定を分割できるが、それと同じと考えることができそうだ。Load Balancer が前に立つので GAE に限定されない。
- ただし Cloud Storage に対しては IAP をセットできないので静的サイトのアクセス制限は GAE の static_files の設定を利用するなど工夫が必要
- URL map は host も path もなんでもこい
- 逆に他の Web サービスのように独自の名前を持たず、ユーザーとの間の単一エンドポイントを提供するための IP アドレスの払い出ししかしないので、ドメインは最初に自分たちで確保が必要(これがネックになるなら Cloud Run などではなく GAE でまかなえないか考えるのが吉)
- Cloud Run 側の ingress を絞らないと誰でもアクセスできて意味がない
- 固定 IP が振り出されるので IP アドレス代も掛かってるはず
cf.
- 外部 HTTP(S) ロードバランサの設定 | Identity-Aware Proxy | Google Cloud
- Cloud Run、App Engine、または Cloud Functions を使用して従来のアプリケーション ロードバランサを設定する | 負荷分散 | Google Cloud
- App Engine で静的ウェブサイトをホストする | Google App Engine スタンダード環境のドキュメント | Google Cloud
- Google Cloud Storage をロードバランサーのバックエンドにしつつ、直接はアクセスさせたくない場合 | by Seiji Ariga | Medium | google-cloud-jp
思ったこと
- Serveless NEG だけ作る方法はないのか? (Load Balancing 側の設定項目のように見える)
- なんで Network Endpoint Group と呼ぶのに group 設定ができるように見えないんだ?
試していないこと
- 異なるプロジェクトにまたがる Backend を設定すること