本文へスキップ
hdknr blog

NAT ゲートウェイ(AWS)

プライベートサブネットのリソースが外にだけ出られるようにする AWS のマネージド出口。送信元 IP を 1 つの EIP に揃える役割も持ち、削除や EIP の変更は本番に大きく響く

概要

NAT ゲートウェイは、パブリック IP を持たないプライベートサブネットのリソースが、インターネットへ「出ていく」ための出口。インスタンスの代わりに自分の Elastic IP(EIP)で外と通信し、応答を返す。内 → 外はできるが、外 → 内の接続開始はできない一方通行の部品である。

もう 1 つの重要な役割が送信元 IP の固定。背後のインスタンスが何台あっても、外から見える送信元は EIP 1 つに揃う。月数十ドルかかるわりに働きが見えにくく、リソース整理で真っ先に疑われがちだが、「出口」と「身元」の 2 つを担っている。

詳細

マネージドであることとコスト

NAT インスタンス(EC2 1 台)でも同じ機能は作れるが、NAT ゲートウェイは OS パッチや監視が不要で、AZ 内で冗長化され帯域も自動スケールする。代わりに時間課金+データ処理量課金がかかる(東京リージョンでおおむね $0.062/時間 ≒ 月 $45 前後+処理量 1GB あたり $0.062、別に EIP のパブリック IPv4 料金が月 $3.6 ほど。最新は公式で確認)。

構成月額の目安主な課題
NAT ゲートウェイ 1 本約 $49 + 処理量費用
インスタンスごとに EIP約 $3.6 × 台数下記の利点をすべて失う
NAT インスタンス数ドル〜パッチ・監視・冗長化を自前で

AZ 単位のリソースなので、可用性重視なら AZ ごとに 1 本、コスト重視なら 1 本(その AZ 障害時は外に出られない)。

典型構成と「外に出たい」用途

入口は ALB(+CDN / WAF)、アプリサーバーはプライベートサブネット、外向き通信は NAT が出口という 3 層構成が定番。アプリが外へ出る用途は多い — 外部 SaaS / API、SES などの AWS API(VPC エンドポイントがなければインターネット経由)、S3、reCAPTCHA、OS パッケージ更新や git pull。

送信元 IP が 1 つに揃うので、外部 SaaS の接続元 IP 制限、IAM ポリシーの aws:SourceIp 条件、SPF レコードなどの IP アローリストに EIP を登録して使われる。

Auto Scaling 配下の Web アプリでの利点

  1. アプリサーバーを晒さない — パブリック IP が不要で、入口を ALB に絞れる。セキュリティグループが緩くても直接到達する経路がない(多層防御)
  2. インスタンスが入れ替わっても送信元 IP が変わらない — インスタンスに EIP を直接付けると、起動のたびの付け直しや、スケールアウト時の 2 つ目の EIP が要る
  3. アローリストの管理が 1 か所 — 台数分の IP を登録する構成では、登録漏れが平常時には見えず「ピーク時だけメールが送れない」ような見つけにくい障害になる
  4. 運用の手間が少ない

事例:唯一の出口を消して本番が止まった

リソース整理で、本番の唯一の出口だった NAT ゲートウェイと EIP が削除された。使われていない VPC の NAT と並んでいた、EIP が「インスタンスに割り当てられていない」ように見えた、処理量課金がわずかだった、という理由で「消してよさそう」に見えた。

教訓

  1. NAT の EIP は「誰にも割り当てられていない」ように見えるが使われている。割り当て先が NAT かを必ず確認する
  2. 削除前にルートテーブルを見る。0.0.0.0/0 が NAT を指し稼働中のインスタンスがあれば使われている。処理量の少なさは未使用の根拠にならない
  3. 解放した EIP が戻る保証はない(aws ec2 allocate-address --address で取り戻せる場合もあるが確実ではない)。削除前にアローリストを洗い出す
  4. IP 依存はドキュメントに書く。IAM の aws:SourceIp 条件は aws iam get-account-authorization-details を jq で総当たりして探せる(バケットポリシーなどリソース側のポリシーは別途確認)
  5. 外向き通信の詰まりがヘルスチェックの失敗に連鎖しないよう、ヘルスチェックは静的ファイルにし、外部通信のタイムアウトを短くする

NAT への依存を減らす

施策効果注意点
S3 のゲートウェイ型 VPC エンドポイント(無料)S3 通信が NAT を通らないaws:SourceIp が含まれなくなるので、条件を aws:SourceVpce / aws:SourceVpc などに変える作業とセット
IAM ユーザーをやめてインスタンスロールに長期キーがなくなり IP 縛りの必要性が下がるアプリの認証情報の読み方を変える
SES などのインターフェース型 VPC エンドポイントAWS API を NAT 経由にしないエンドポイントごとに時間課金。IP 条件の見直しが要る
共通基盤の出口プロキシ外向き通信を組織で一元管理接続先ごとの申請、送信元 IP の扱いを確認

AWS API への依存を外していくと、最後まで固定 IP が要るのは IP 制限をかけている外部 SaaS だけになり、そこを NAT の EIP 1 つで受けるのが最も単純で壊れにくい。

関連ページ

ソース記事