📝

Cloud Run のネットワーク構成で考慮した点

2023/12/14に公開
2

はじめに

こんにちは。クラウドエースで SRE ディビジョンに所属している kazz と申します。
最近、Cloud Run のネットワーク構築に取り組む機会がありましたので、構成を考えるにあたって考慮した点をまとめていきたいと思います。

Cloud Run について

Cloud Run は、コンテナを使用して、サーバーレスでアプリケーションを実行できるプロダクトです。
Cloud Run を使用すると、コンテナ イメージをデプロイして、HTTP リクエストに応答する Web アプリケーションを簡単に作成できます。
しかし、初期設定では、Cloud Run はオープンなインターネット構成になっているため、セキュリティやネットワークの観点から、適切な設定を行う必要があります。
本記事では、Cloud Run のネットワーク構成で考慮した点について、外部からのアクセス、認証、外向きの接続、の3つの観点でまとめていきます。

外部からのアクセスをどうするか

Cloud Run の外部からのアクセス(Ingress)には、All 、Internal 、Internal + Cloud load balancing の3つの設定があります。
デフォルトでは、All に設定されていますが、Cloud Run のユースケースに合わせて適切な設定を選択する必要があります。

All(全ての通信を許可)

0
Ingress の制御を All に設定すると、Cloud Run はインターネットからのすべてのリクエストを直接受け入れるように構成されます。
これにより、Cloud Run 上のアプリケーションを簡単に一般公開することができますが、不正なアクセスや攻撃に対しても開かれた状態となるため、要件などをしっかりと考慮してから選択する必要があります。

Internal(内部通信のみ許可)

1
Ingress の制御を Internal に設定すると、Cloud Run は VPC ネットワーク内のリソース、または特定の Google Cloud プロダクトからのリクエストのみを受け入れるように構成されます。
これにより、Cloud Run はインターネットから隔離され、内部ネットワーク内でのみアクセスが可能になります。
マイクロ サービスとして Cloud Run を使用する場合などにはこの設定を選択しましょう。

Internal + Cloud load balancing

2
Ingress の制御を Internal に設定した上で、Cloud Load Balancing を設置すると、Cloud Run は内部通信によって許可されるリソースと Cloud Load Balancing 経由のリクエストのみを受け入れるようになります。
この構成では、アプリケーションを公開しつつ、アクセス制御やトラフィックの負荷分散をすることができます。
また、以下のような構成を実装したい場合には、Cloud Load Balancing を設置する必要があります。

  • Cloud Armor を使用したい(ファイア ウォール ルールの適用)
  • Identity-Aware Proxy を使用したい(ユーザーのアクセス制限)
  • 独自ドメインを使用したい

認証をどうするか

Cloud Run では 「未認証の呼び出しを許可」と「認証が必要」という2つの認証設定が選択できます。
ユースケースに合わせて適切な設定を選択することで、セキュリティを向上させることができます。

未認証の呼び出しを許可

この設定にすると、サービスへのアクセスに対して認証が不要になるため、ユーザーは簡単にサービスにアクセスできます。
一般公開されたアプリケーションを作成する場合などにはこの設定を選択しましょう。

認証が必要

この設定にすると、 roles/run.invoker の IAM ロールを持つユーザーまたはサービス アカウントだけが、サービスにアクセスできるようになります。
未認証のリクエストは自動的に拒否されるため、不正アクセスや悪意のある使用を防止できます。
IAM でしかアクセス制御は行えないため、アプリケーションにエンドユーザーの認証を実装したいなどの場合は、追加で Cloud Load Balancing + IAP の構成が必要です。

外向きの接続をどうするか

Cloud Run の外向きの接続(Egress)では、主に IP アドレスの固定、VPC 内部リソースへの直接アクセスの必要性についての考慮が必要です。
デフォルトの設定では、Cloud Run は自動で Google Cloud のインフラを経由して外部ネットワークと通信します。
ただし、デフォルトの設定は、VPC ネットワーク内のリソースへのアクセスはできず、外部 IP アドレスは動的になり、固定することができません。
そのため、VPC 内部リソースへのアクセスが必要な場合や、IP アドレスを固定したい場合は、適切な構成にする必要があります。

VPC 内のリソースへのアクセスが必要な場合

VPC 内のリソースへのアクセスが必要という場合は、Direct VPC Egress か、サーバレス VPC アクセスを使用する必要があります。

Direct VPC Egress

4
Direct VPC Egress は 2024/04/24 に一般提供(GA)が開始した機能です。
Direct VPC Egress を使用すると、Cloud Run はサブネットのIPアドレスを使用して直接 VPC ネットワーク内のリソースにアクセスできるようになります。
VPC Peering と組み合わせることで、異なる VPC 間でのプライベート アクセスも可能になります。

サーバレス VPC アクセス

3
サーバレス VPC アクセスは、VPC 内にコネクタを作成し、Cloud Run からコネクタを経由して VPC ネットワーク内のリソースにアクセスする機能です。
インスタンスを介すため、Direct VPC Egress と比較してパフォーマンスが劣ります。

どちらを使えばいいのか

以下の記事の通り、Direct VPC Egress の方が性能、コスト、構成の簡潔さといった複数の面で優れているため、基本的には Direct VPC Egress を使用することをおすすめします。
https://zenn.dev/cloud_ace/articles/direct-vpc-nat-support-for-run#まとめ
しかし、Direct VPC Egress はインスタンス数に応じた IP アドレス空間の管理が必要であったり、VPC フローログや、ファイアウォール ルールのロギングができないなどの注意点があるため、要件に合わせて使い分ける必要があります。
注意点を詳しく知りたい方は以下の記事を参照ください。
https://zenn.dev/cloud_ace/articles/cloudrun-direct-vpc-egress-preview#注意点

外部接続への IP アドレスを固定をしたい場合

5
外部接続への IP アドレスを固定したい場合、 Cloud NAT で外部ネットワークへのアクセス経路を確保しつつ、Direct VPC Egress、もしくはサーバーレス VPC アクセスを使用した構成にする必要があります。
Cloud Run から接続する外部サービスが、特定の IP アドレスからの接続のみを許可する場合などはこの構成にしましょう。
Cloud NAT を使用して IP アドレスを使用する場合も、基本的には Direct VPC Egress を使用することをおすすめします。

まとめ

本記事では、Cloud Run のネットワーク構成で考慮した点について、外部からのアクセス、認証、外向きの接続、の3つの観点でまとめてきました。
ネットワーク以外にも考慮すべき点は多くありますが、本記事で紹介した点を踏まえて、適切な構成を選択していただければと思います。

Discussion

shuuji3shuuji3

とてもわかり易い解説をありがとうございます。特に、3種類のIngress設定の違いは初めて利用する時にわかりにくい部分だと思うので、図を使った説明がよかったです。

記事公開後のアップデートですが、Direct VPC egressは2024年4月24日にGAになったので、現在は本番環境でも利用可能です。

参考リンク:
Cloud Run のダイレクト VPC 下り(外向き)の一般提供を開始 | Google Cloud 公式ブログ - https://cloud.google.com/blog/ja/products/serverless/direct-vpc-egress-for-cloud-run-is-now-ga

クラウドエース株式会社クラウドエース株式会社

shuuji3 様

この度は、貴重なコメントをいただき、誠にありがとうございます。
本記事の内容についてアップデートを実施いたしました。

今後とも弊社技術ブログをよろしくお願い申し上げます。