こんにちは。SCSKの磯野です。
Cloud Run jobsを利用するにあたり、VPC/NAT/IPアドレスの作成単位や設計に迷ったので、当チームで最終的に採用したものをご紹介します。なぜ(Why)その方針としたのか、どのように(How)実装したのか、という2つの観点で記載しています。
前提
当チームに存在するCloud Run jobsの種類
当チームでは、Cloud Run jobsを用いて外部からのデータ取得を行っています。一般公開されているデータから、購入しているデータまで、さまざまなデータをAPIやスクレイピングを通して取得しています。
アクセス先の外部サービスによっては接続元のIPアドレスを固定する必要があるため、当チームのCloud Run jobsには以下の2種類が存在します。
- 静的外部IPアドレスが必要なCloud Run jobs
- 静的外部IPアドレスが不要なCloud Run jobs
当チームの環境
dev/stg/prdの3環境で構成されています。
NW設計方針
共有VPCを利用
Why?(なぜその方針としたか)
組織全体に対するルートやファイアウォール、サブネット IP アドレス範囲、VPN 接続などの作成を一元管理するため、共有VPCを利用しています。
How?(どのように実装したか)
公式ドキュメントを参照ください。
Cloud Runからの egress(外向き)通信をNAT経由とする
Why?(なぜその方針としたか)
- 「前提」に記載した通り、外部サービス側にて静的外部IPアドレスのホワイトリスト登録が必要なケースがあります。静的外部IPアドレスを設定するためには、NAT経由の通信とする必要がありました。
- 一方で、静的外部IPアドレスが不要なCloud Runについても、NAT経由の通信を採用しています。理由は以下の通りです。
- ソースIP/ポート枯渇を避けられる (参考)
- Cloud Runから大量の同時接続が必要な場合、NATに外部IPを追加してポート数を増やすことができるため。NATを経由しない場合は、IP/ポートを調整不可のため、枯渇する可能性があり。
- egressをNAT経由にする=VPC経由となるので、Google/Google Cloud APIへの通信をGoogleのネットワーク内に閉じることが可能。スループット/セキュリティ面の向上につながる。
- ログ分析と監査の容易さ
全ての通信がNATを経由することで、外部向け通信とログ確認や監査がしやすくなる (接続不可時のトラフィック状況の確認や、コードベースを乗っ取られデータ漏洩していることの確認等)。
- ソースIP/ポート枯渇を避けられる (参考)
How?(どのように実装したか)
Cloud Run サービスまたはジョブから VPC ネットワークに下り(外向き)トラフィックを送信する方法としては、以下の2種類があります。
費用・パフォーマンスの観点から「ダイレクト VPC 下り(外向き)」を採用していますが、執筆時点ではCloud Run ジョブにおける「ダイレクト VPC 下り(外向き)」はプレビュー版 です。利用の際はご注意ください。
静的外部IPアドレスの作成単位:原則、環境ごと(dev/stg/prd)に分離する
Why?(なぜその方針としたか)
- devからの通信が多すぎることでNATのポートが枯渇し、prdの通信ができなくなることを防ぐため、静的外部IPアドレスは環境ごとに(dev/stg/prd)に分離しています。
- 費用の観点から用途ごとには分けず、チーム全体で共通のIPアドレスを使用する
- サービスによっては登録できるIPアドレス数が限られているため、状況に応じてdev/stg/prdで同じIPを使用しています。
How?(どのように実装したか)
Cloud Run jobsで静的外部IPアドレスを設定する方法は、下記の記事を参照ください。
NATの作成単位:静的外部IPアドレスの要否・環境(dev/stg/prd)を考慮した計4つとする
NATの作成単位は以下の4つとしました。
- 静的外部IPアドレスが不要なCloud Run用のNAT:1つ
- 静的外部IPアドレスが必要なCloud Run用のNAT:各環境(dev/stg/prd)ごとに1つずつ
「静的外部IPアドレスが必要なCloud Run用のNAT」を以下①②のどちらのパターンとするか迷ったのですが、①を採用しました。サブネットは用途ごとに分けているため、それぞれのNATに複数のサブネットが紐づくイメージとなります
①「静的外部IPアドレスが必要なCloud Run用のNAT」を環境ごとに分ける。
②「静的外部IPアドレスが必要なCloud Run用のNAT」を全環境で共通とする。前述の通り、静的外部IPアドレスは環境ごとに作成するため、本パターンの場合は、1つのNATに複数のIPアドレスを紐づける形式となる。(技術的には可能)
Why?(なぜその方針としたか)
1つのNATにdev/stg/prdのIPを紐づけた場合に下記課題が発生するため、②は不採用としました。
- Cloud Runで指定できるのはsubnetだけであり、静的外部IPアドレスを直接指定することはできない。
- subnetと固定IPは紐づいていない。固定IPと紐づいているのはNATだけ
→よって、Cloud Run側でdevのsubnetを指定しても、どの環境(dev/stg/prd)の静的外部IPアドレスが使われるかわからない。環境分離ができなくなってしまうため、②は不採用とする。
How?(どのように実装したか)
設計通りに作成するだけなので省略。
結論・構成図
以下のような構成となりました。
まとめ
いかがだったでしょうか。
今回は、当チームでCloud Run jobsを利用する際に採用したNW設計方針についてご紹介しました。
※あくまでも当チームでどのような方針を採用したか、という内容となります。環境によって最適な方針は異なりますのでご留意ください。
本記事が皆様のお役に立てれば幸いです。