コンテンツにスキップ
Dev Classmethod Jp Articles Multi Az Snat Instance

接続元IPアドレスを絞りたいと言われた時用に特定のプライベートIPアドレスにSNATする仕組みを自作してみた

  • URL: https://dev.classmethod.jp/articles/multi-az-snat-instance
  • 日付: 2026-06-25
  • Tier: Tier 2
  • 要旨: 閉域接続で送信元IP固定・1つまでという制約下で、Multi-AZ対応のSNAT仕組みを自作した。フローティングIPをVPC内で実現し、SNATインスタンスを2台常時起動してActive/Standy構成で切り替え。ヘルスチェックと EventBridge トリガーで異常検知から30秒以内にフェイルオーバー完了。

詳細

制約条件はSingle-AZなら Private NAT Gateway で解決するが、Multi-AZではAZ障害時にIPが変わる。フローティングIP 10.10.0.85 を実装するには、それが属するサブネット CIDR ブロックを事前に作成しないと AWS は経路追加を拒否する。VPC CIDRの一部として 10.10.0.80/28 など小さなサブネットを確保。ルートテーブルではそのサブネット宛トラフィックを Active SNATインスタンスの ENI に指定。戻り通信は VPC Gateway のエッジルートテーブルで同じ ENI へ向けることで両方向の対称性確保。ヘルスチェックは systemd-timer で30秒間隔実行、IP フォワーディング有効・SNAT ルール存在・VPN ルーター到達可能の3点検査。1つ失敗すれば CloudWatch カスタムメトリクスで 0 発行、アラーム側が異常判定。EventBridge で EC2 起動・停止・アラーム状態変化をトリガーに Lambda 関数実行、対象ルートテーブル2つ(クライアント側・VGWエッジ側)を Healthy な反対 AZ へ切り替え。ダウンタイムを1-2分以内に圧縮するため、常時2台起動でコスト受容。IAM で各インスタンスに MetricData PUT 権限、ルートテーブル更新権限を付与。検証では通常時・インスタンス停止時・iptables SNAT ルール削除時すべてで正常にフェイルオーバー確認。