Cloud Run jobs 利用におけるNW設計

こんにちは。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を経由することで、外部向け通信とログ確認や監査がしやすくなる (接続不可時のトラフィック状況の確認や、コードベースを乗っ取られデータ漏洩していることの確認等)。

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設計方針についてご紹介しました。
※あくまでも当チームでどのような方針を採用したか、という内容となります。環境によって最適な方針は異なりますのでご留意ください。

本記事が皆様のお役に立てれば幸いです。

タイトルとURLをコピーしました