🎉

Direct VPC egress で Cloud Run と VPC のアクセスが簡単になりました!

2023/08/17に公開

こんにちは、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 を選んで任意のネットワークを指定するだけです。

alt

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 までに改善していることを期待しましょう。

構築例

alt

Cloud Run 専用のサブネット領域を切り出し、VPC 内の AlloyDB と通信しています。
専用サブネットを利用することで既存の VM を考慮せず、Cloud Run の設定のみを見て IP アドレス量を決めれるようにしています。
また AlloyDB は現在時点で VPC 内のローカル通信のみ利用できる状況ですが、この構成なら難なくアクセス可能です。

まとめ

まだ Preview ということもあり少々癖のある制限がありますが、それを差し引いても非常に有用なアップデートだと感じています。
皆様もぜひこの機会に構築して実際に使ってみてください。

そして、不便だと感じた所はどしどし Google へフィードバックをしましょう。
そのフィードバックが、GA 時の利便性に寄与する……かもしれません。

Discussion