Direct VPC egress で Cloud Run と VPC のアクセスが簡単になりました!
こんにちは、Zenn では始めまして。
クラウドエースの SRE チームに所属している妹尾です。
今回は Cloud Run の構築が劇的に楽になるアップデートがありましたので紹介したいと思います。
概要
2023/08/14 に Direct VPC egress for Cloud Run がリリースされました!
この機能を使うと、Cloud Run のインスタンスに任意の VPC サブネットワークの IP アドレスを付与することができます。
以前までは Serverless VPC Access を利用して VPC へアクセスさせていたのですが、これが不要になります。
利用方法
すでに Cloud Console(Web UI)から利用可能になっています。
ネットワーク設定から Connect to a VPC for outbound traffic
にチェックを入れて、
その下から Send traffic directly to a VPC
を選んで任意のネットワークを指定するだけです。
gcloud コマンドを利用する場合は
--network
--subnet
を引数に追加するだけで利用できます。
メリットと注意点
Direct VPC egress を利用するメリットと注意点についてまとめながら、詳細な機能紹介をしてきます。
メリット
シンプル
まず何より Serverless VPC Access を利用しないことにより、構成がとてもシンプルになります。
Serverless VPC Access は Cloud Run のサービスが必要とするネットワーク帯域からインスタンスサイズを計算する必要があったり、不要な場合にスケールイン時の対応など、開発者にとって考慮するべき項目が多く、あまり使い勝手が良いとは言えませんでした。
Direct VPC egress はそれ自体の管理が不要で、スケーリングの手間もありません。
煩雑だった操作からは解放されます。
高速
Direct VPC egress は Google 内部で新設されたネットワークパスが利用され、
Serverless VPC Access を使った時と比較してホップ数が減少し、スループットも向上しています。
安価
Serverless VPC Access は内部でインスタンスを利用する都合上、一度構成した後は常時課金が発生してしまっていました。
Direct VPC egress の課金はネットワーク料金のみとなり、従量課金です。
通信がなければ 0 円で利用できますし、通信があっても Cloud Run と同一リージョンにある VM へ通信するのであればサブネット内での通信となり、ノーコストで通信できます。
注意点
インスタンス数に応じた IP アドレス空間の管理が必要になる
サブネット内の IP アドレスをインスタンス毎に割り当てるので、高負荷時にはサブネットの IP アドレスが足りなくなる可能性があります。
割り当て可能な IP アドレスが足りない場合、新しいインスタンスが起動できずスケールアウトできなくなります。
ほぼ手放しでどんなスパイクにも対応できるのが Cloud Run の旨みですが、それが薄まってしまうのは大きなデメリットです。
一時領域も含めて、Cloud Run サービスの最大インスタンス数の 4 倍の範囲を割り当てることが推奨されています。
TCP/UDP 下り専用
内部のファイアウォールルールにより、Direct VPC egress を通過できるのは TCP/UDP の下りパケットに限定されます。
ping などの ICMP は疎通しません。
また、Cloud Run へ VM から通信はできません。
Cloud Run サービスを実行させるには、今まで通り外部から HTTP(S)での通信が必要です。
Cloud NAT を使った通信ができない
Cloud NAT を経由して外部へアクセスはできません。
Serverless VPC Access と Cloud NAT を組み合わせることで、 Cloud Run から外部インターネットへの通信で外部 IP アドレスを固定して使用することができましたが、 Direct VPC egress では使用できません。
固定 IP アドレスが必要なければ、 Traffic routing で プライベート IP へのリクエストだけを VPC コネクタ経由でルーティングする
を設定しておけば、問題なく外部通信とVPC内通信を両立できます。
なお、VPC ピアリングを通じて別の VPC に接続できます。
サービス毎に100インスタンスまで
サービスに対して 100 インスタンス(Job の場合 100 並列タスク)までのサポートとなっています。
それ以上にスケールした場合の動作は保証されません
現時点では大阪リージョン(asia-northeast2)非対応
現在時点で以下のリージョンのみ対応しています。
- asia-northeast1(東京)
- us-central1(アイオワ)
- us-east1(サウスカロライナ)
- europe-west1(ベルギー)
- europe-west3(オランダ)
今後のリリースで拡大していくと予測されますが、まだ利用できるリージョンが少ないことには注意です。
指標やログが一部動かない
現時点で以下のメトリクスが取得できない、もしくは不正な値が報告されます。
- VPC フローログ
- ファイアウォール ルールのロギング
- 送信バイト数(container/network/sent_bytes_count)
- 受信バイト数(container/network/received_bytes_count)
GA までに改善していることを期待しましょう。
構築例
Cloud Run 専用のサブネット領域を切り出し、VPC 内の AlloyDB と通信しています。
専用サブネットを利用することで既存の VM を考慮せず、Cloud Run の設定のみを見て IP アドレス量を決めれるようにしています。
また AlloyDB は現在時点で VPC 内のローカル通信のみ利用できる状況ですが、この構成なら難なくアクセス可能です。
まとめ
まだ Preview ということもあり少々癖のある制限がありますが、それを差し引いても非常に有用なアップデートだと感じています。
皆様もぜひこの機会に構築して実際に使ってみてください。
そして、不便だと感じた所はどしどし Google へフィードバックをしましょう。
そのフィードバックが、GA 時の利便性に寄与する……かもしれません。
Discussion