😀

SWP(Secure Web Proxy)の2つの大きな罠(Cloud NAT,コスト)

に公開

経緯

現在初めてのGoogle Cloudを使用するプロジェクトでインフラ設計から構築・保守を行っています。
その際にSWPという外部接続用プロキシサーバを使用したのですが、この後に説明する2点で後に苦しむことになったのでここで共有します。
Secure Web Proxyを試したりする記事はありますが、実際のハマりポイントを紹介している記事は少ないので、誰かの参考になればと思います。

Secure Web Proxy(SWP)って何?

Secure Web Proxy は、Google Cloud でのセキュリティを強化するうえで役立っています。アプリケーションからの HTTP と HTTPS の送信トラフィックをフィルタできるようになりました。また、現在使用している VM ベースのソリューションの代わりにネイティブ ソリューションを使用することで、費用を削減できるだけでなく、プロダクトをクラウド ネイティブ サービスに置き換えるという当社の戦略を継続して進めていくことができます。

参考

VPC内サービスから外部サービスに接続を行う際にフィルタリング機能やログ機能が備わっており安全に接続先をコントロールできるようなサービスです。
使い方としてはVPC内のサービスは外部接続する際にexample.comにのみ通信を許可するということができ外部接続先をコントロールすることができます。
外部IPが付与されているVMやVPC内にリクエストをルーティングしないCloud RunなどはSWPを経由しないので注意

AWS Network Firewall にNAT機能も付いたフルマネージドサービスみたいなものという認識でダイジョブです。

料金の罠

Secure Web Proxyは料金がめちゃくちゃに高いです。

起動しておくだけで1.25USD × 24(時) × 30(日) = 900$/月
日本円13万を超えます。(1ドル150円換算)
SWP料金

開発、検証、本番のように3環境に分かれていた場合SWPを起動しておくだけで40万近くになるので予算が少ない小規模案件では開発環境では使用しないようにしたりしましょう。

1つのサービスを起動するだけで10万超えるというのは恐ろしい...

Cloud NATの罠

Secure Web Proxyを構築すると自動でCloud NATやCloud routerも作成され外部接続時にvm→swp→NATを経由してリクエストを送ることができます。
SWPを使用する際にCloud NATの外部IPを外部接続先サービスにてホワイトリスト登録してもらうということはよくあると思います。

ここで二つ目の罠ですが自動生成されたCloud NATはIPは自動でスケーリングされます。
構築した数か月後にはホワイトリスト登録してもらったIPと実IPが異なりリクエストが失敗するという現象が起きます。

そのため外部にNATIPをホワイトリスト登録してもらう際は自動生成されたIPではなく、自身で静的外部IPを作成し、NATゲートウェイにアタッチすることを必ず行いましょう。

これは公式のNATの説明を見れば気づけたのですがSWPを作成時にNATは自動生成されるためCloud NAT自体を意識せず気づくのに時間がかかってしまいましたTT

対策

固定IPをアサインしてNATゲートウェイの設定を変更しよう!

1 固定IPのアサイン数を決定

NATはIPごとに64,512ポート使用できます。 一台当たりの最初割り当てポート数も加味してNATIPを決定しましょう。
NATIPが少ないと外向きパケットがドロップされますので、ピーク時を加味して多めにNATIPをアサインしてください。
参考
こちらの記事も参考になると思います

2 固定IPを予約

terraformだと以下 NATIPの個数分だけ用意しましょう

resource "google_compute_address" "nat_gateway" {
  name   = "static-global-ip1"
  region = "asia-northeast1"
}

3 Cloud NATゲートウェイのIP設定を変更

3.1 Cloud NATのリソース一覧画面からswpによって作成されたゲートウェイを選択し「編集」を押下します。

3.2 「Cloud NAT IPアドレス」が「自動(推奨)」になっていると思うので「手動」に変更し、先ほど作成した固定IPが出てくると思うので選択しましょう。

これでSWPで使用するNATIPの固定化完了です。

SWPはコストは高いですが安全に外部接続できるサービスになっているので上記2点の注意点を考慮したうえで使用しましょう。

ありがとうございました。

Discussion