AWSでプライベートサブネットからIPv4のインターネットへ出る代表的な経路は、マネージドのNATゲートウェイと、EC2で組むNATインスタンスの2つです(IPv6の外向き通信はEgress-Only インターネットゲートウェイで出せます)。両者は運用の手間だけでなく課金の仕組みが違い、NATゲートウェイは時間料金とデータ処理料金の両方がかかるため、通信量が増えるほど差が開きます。この記事では、東京リージョン(ap-northeast-1)の公開単価で通信量別の月額を並べ、NATを通る通信を特定して削る手順と、開発環境をNATインスタンスへ置き換えるコマンドまでをまとめます(単価は2026年10月時点のAWS価格データ)。
まとめ:本番はNATゲートウェイ、削るのは台数より通信量
東京リージョンのNATゲートウェイは、1台あたり時間料金が月45.26ドル、割り当てたパブリックIPv4の料金が月3.65ドルで、通信がゼロでも約49ドルかかります。ここに、NATゲートウェイが処理したデータ(送信と戻りの受信の合計)1GBごとに0.062ドルが加わります。t4g.nanoのNATインスタンスなら同じ固定費が約8.4ドルで、1GBあたりの処理料金はかかりません。
それでも本番環境はNATゲートウェイを選ぶべきです。AWS自身がNATゲートウェイを推奨しており、NATインスタンスの冗長化・OS更新・障害対応はすべて利用者の仕事になるためです。費用を下げる最初の一手は、NATゲートウェイを通る通信量を減らすことです。S3とDynamoDBへの通信はゲートウェイ型VPCエンドポイントへ移せば処理料金がかからず、AZをまたぐ経路をなくせば転送料金も消えます。NATインスタンスへの置き換えは、止まっても困らない開発・検証環境に限るのが安全です。
NATゲートウェイとNATインスタンスの違い
どちらもプライベートサブネットの外向き通信を、パブリックIPアドレスに変換してインターネットへ出す仕組みです。違いは「誰が運用するか」と「何に課金されるか」に集約されます。
マネージドのNATゲートウェイ
NATゲートウェイは、AWSが運用するNATサービスです。帯域は100Gbpsまで自動で広がり、OSのパッチ当てやサイズ選定は要りません。AZ内では冗長化された実装で動き、複数AZで使うときはAZごとに1台置く(ゾーナル)か、2025年11月に追加されたリージョナルNATゲートウェイを使います。作成手順やインターネットゲートウェイとの違いはAWS NAT Gateway(NATゲートウェイ)とは?インターネットゲートウェイとの違い・料金・作成手順で扱っています。
EC2で組むNATインスタンス
NATインスタンスは、パブリックサブネットに置いたEC2をNATとして動かす方式です。AWSが以前配布していたNAT用AMIはAmazon Linux AMI 2018.03がベースで、AWSの公式ガイドは2020年12月31日に標準サポート、2023年12月31日にメンテナンスサポートが終わったと明記しています。いまNATインスタンスを使うなら、Amazon Linux 2023などから自分でNAT用AMIを作ります(手順は後述)。自作しない選択肢として、Amazon Linux 2023ベースの公開AMIを配布するOSSのfck-nat(2026年10月時点の最新はv1.4.0)もあります。
機能・運用の比較表
AWSの比較ページの項目のうち、選定に効くものを抜き出しました。
| 観点 | NATゲートウェイ | NATインスタンス |
|---|---|---|
| 可用性 | AZ内で冗長化済み | フェイルオーバーを自作 |
| 帯域 | 100Gbpsまで拡張 | インスタンスタイプ次第 |
| 保守 | 不要(AWS管理) | OS更新・パッチを自分で |
| 基本課金 | 時間+処理データ量 | EC2+EBS |
| セキュリティグループ | 付けられない | 付けられる |
| ポート転送・踏み台 | 不可 | 可 |
| タイムアウト時 | RSTを返す | FINを送る |
タイムアウト時の挙動の差は、長時間アイドルになる接続を持つアプリで効きます。NATゲートウェイはアイドルが350秒続いた接続をタイムアウトさせ、その後に背後のリソースが同じ接続で通信しようとするとRSTを返します。キープアライブを入れていないと、アプリ側では接続リセットのエラーとして現れます。
NATのコストの内訳:東京リージョンの単価
NATゲートウェイの料金ページのとおり、NATゲートウェイは「使用可能な1時間ごと」と「処理するデータ1GBごと」に課金されます。停止という操作は無く、存在する限り時間料金が積み上がります。月額を見積もるときに並べる単価は次のとおりです。
| 項目 | 東京の単価 | かかる方式 |
|---|---|---|
| NATゲートウェイ時間料金 | 0.062ドル/時 | NATゲートウェイ |
| NATゲートウェイ処理料金 | 0.062ドル/GB | NATゲートウェイ |
| パブリックIPv4アドレス | 0.005ドル/時 | 両方 |
| AZ間のデータ転送 | 0.01ドル/GB | 両方 |
| インターネット向け転送(無料枠超過後の最初の10TB) | 0.114ドル/GB | 両方 |
| t4g.nano / t4g.small | 0.0054 / 0.0216ドル/時 | NATインスタンス |
| EBS gp3 | 0.096ドル/GB月 | NATインスタンス |
NATゲートウェイとVPCエンドポイントの単価はAmazon VPCの料金ページ、EC2とEBSはEC2オンデマンド料金ページで確認できます。参考までに、バージニア北部(us-east-1)のNATゲートウェイは0.045ドル/時・0.045ドル/GBで、東京は約4割高い水準です。
NATゲートウェイ1台の固定費は月約49ドル
月730時間で計算すると、時間料金が0.062×730=45.26ドル、パブリックIPv4が0.005×730=3.65ドルで、合計48.91ドルです。NATゲートウェイに関連付けたIPv4にも課金されることは、EC2ユーザーガイドのIPアドレスの章が計算式つきで示しています。2AZにそれぞれ置けば97.82ドルになります。リージョナルNATゲートウェイも時間料金は展開されたAZの数だけかかるため、2AZならゾーナル2台と同額です(損益の詳しい計算はVPCエンドポイントの料金と違い:ゲートウェイ型・インターフェース型の選び方とNATゲートウェイとの損益分岐)。
NATインスタンスはt4g.nanoで月約8.4ドル
t4g.nanoを1台常時起動すると、インスタンス料金0.0054×730=3.94ドル、ルートボリュームのgp3 8GBで0.77ドル、パブリックIPv4で3.65ドル、合計8.36ドルです。処理料金が無いので、通信量が増えてもこの額は変わりません。ただし、T4gは既定のUnlimitedモードでCPUクレジットを超えて使い続けると、1 vCPU時間あたり0.04ドルの追加料金がかかります。以下の試算はこの追加料金が出ない負荷を前提にしています。AZごとに1台ずつ置いても、t4g.small 2台で40.37ドルに収まります。
通信量別の月額比較
インターネット向けの送信(アウト)は、全リージョン・全サービス合算で月100GBの無料枠を超えた分に、東京では最初の10TBまで0.114ドル/GBがかかります。この転送料金とAZ間の転送料金はどちらの方式でも同額なので表から除き、差が出る固定費とNATゲートウェイの処理料金(送受信の合計量に課金)だけを並べました。1TBは1,024GBで計算しています。
| 構成(月額・ドル) | 100GB | 1TB | 5TB |
|---|---|---|---|
| NATゲートウェイ 1台 | 55.11 | 112.40 | 366.35 |
| NATゲートウェイ 2AZ | 104.02 | 161.31 | 415.26 |
| NATインスタンス t4g.nano 1台 | 8.36 | 8.36 | 8.36 |
| NATインスタンス t4g.small 2台 | 40.37 | 40.37 | 40.37 |
この表の構成と単価の条件では、どの通信量でもNATインスタンスのほうが安く、損益分岐点は現れません。差額を埋めているのは、冗長化の仕組みを作る工数、OS更新、夜間の障害対応です。月100GB程度の開発環境なら差は約47ドルで、これを1人の数時間の運用工数と比べて決めることになります。
NATインスタンスのベースライン帯域とバースト上限
EC2の料金表では、t4gファミリーはnanoからmediumまで一律「最大5ギガビット」と表示されます。ところがEC2の汎用インスタンス仕様のネットワーク表には、ベースラインとバーストが分けて載っています。
| インスタンス | ベースライン | バースト |
|---|---|---|
| t4g.nano | 0.032Gbps | 5.0Gbps |
| t4g.micro | 0.064Gbps | 5.0Gbps |
| t4g.small | 0.128Gbps | 5.0Gbps |
| t4g.medium | 0.256Gbps | 5.0Gbps |
| t4g.large | 0.512Gbps | 5.0Gbps |
同じページの注記は、これらのインスタンスがネットワークI/Oクレジットを使って「ベストエフォートで」ベースラインを超えると説明しています。EC2のネットワーク帯域の説明によればクレジットを使い切るとベースラインに戻るので、t4g.nanoが5Gbpsまで出せる可能性があるのはクレジットが残っている間だけで、仕様上の継続帯域は32Mbpsです。実際のNAT転送速度は、パケット数や同時接続数などの制限でこれより低くなることもあります。月の平均に直すと約10TB分に当たるので、少量の通信が散発する開発環境なら足ります。一方、CIでコンテナイメージを毎回数GB取得する、夜間バッチで外部APIから大量に取り込む、といった通信が続く環境ではクレジットが尽きて急に遅くなります。続けて流す量が多いなら、ベースラインからインスタンスタイプを選んでください。fck-natのインスタンス選定表も、t4g.nanoの帯域を32Mbpsとして載せています。
NATのコストを削減する手順
台数や方式を変える前に、NATゲートウェイを何が通っているかを数字で押さえます。処理料金は通信量に比例するので、大口の宛先を1つ外すだけで請求額が大きく動きます。
NATを通る通信量の特定
Cost Explorerで使用タイプを絞ると、時間料金と処理料金の内訳が分かります。東京リージョンの使用タイプ名は APN1-NatGateway-Hours と APN1-NatGateway-Bytes です。
aws ce get-cost-and-usage \
--time-period Start=2026-10-01,End=2026-10-28 \
--granularity MONTHLY \
--metrics UnblendedCost UsageQuantity \
--filter '{"Dimensions":{"Key":"USAGE_TYPE","Values":["APN1-NatGateway-Hours","APN1-NatGateway-Bytes"]}}' \
--group-by Type=DIMENSION,Key=USAGE_TYPE
どのNATゲートウェイが多いかは、CloudWatchの AWS/NATGateway 名前空間で日ごとの量を見ます(NATゲートウェイのメトリクス一覧)。BytesOutToDestination は内側から外へ送った量、BytesInFromDestination は外から戻ってきた量です。
aws cloudwatch get-metric-statistics \
--namespace AWS/NATGateway \
--metric-name BytesOutToDestination \
--dimensions Name=NatGatewayId,Value=nat-0123456789abcdef0 \
--start-time 2026-10-01T00:00:00Z --end-time 2026-10-28T00:00:00Z \
--period 86400 --statistics Sum
この例はゾーナルNATゲートウェイ用です。リージョナルNATゲートウェイのメトリクスは NatGatewayId と AvailabilityZone の組で記録されるため、--dimensions に Name=AvailabilityZone,Value=ap-northeast-1a のように対象AZを足してAZごとに取得します。
宛先まで知りたいときは、NATゲートウェイのENIでVPCフローログを取り、宛先IPごとにバイト数を集計します。S3やECRのIP範囲が上位に来るなら、次のVPCエンドポイントで外せます。ECRはイメージのレイヤーをS3に置いているため、ECRのドキュメントのとおりイメージ取得の通信の大半はS3向けです。有料のECR用エンドポイントを足す前に、無料のS3ゲートウェイエンドポイントで外れる量を先に確かめます。
S3・DynamoDB通信のゲートウェイ型VPCエンドポイント化
S3とDynamoDB向けのゲートウェイ型VPCエンドポイントは、時間料金も処理料金もかかりません。プライベートサブネットのルートテーブルに関連付けると、同じリージョンのS3バケットへの通信がNATゲートウェイを通らなくなります。AWSのS3ゲートウェイエンドポイントの説明にあるとおり、別リージョンのバケットへの通信は対象外で、エンドポイントポリシーやバケットポリシーで許可していない操作は通りません。
aws ec2 create-vpc-endpoint \
--vpc-id vpc-0123456789abcdef0 \
--service-name com.amazonaws.ap-northeast-1.s3 \
--route-table-ids rtb-0123456789abcdef0
ECRやCloudWatch Logsなどほかのサービスは、インターフェース型(東京で0.014ドル/時・AZごと、処理0.01ドル/GB)になります。1本あたり2AZで月20.44ドルの固定費がかかるので、通信量の少ないサービスまで並べるとNATゲートウェイより高くつきます。何本までなら得かはVPCエンドポイントの料金と違いで計算しています。
AZをまたぐ経路の解消
リソースとNATゲートウェイが別のAZにあると、AZ間のデータ転送料金(0.01ドル/GB)が処理料金に上乗せされます。AWSの料金ページも、大量に通信するリソースは同じAZのNATゲートウェイを使うか、AZごとにNATゲートウェイを作るよう勧めています。サブネットごとのルートテーブルが、自分のAZのNATゲートウェイを向いているかを確認してください。
夜間・休日のNATゲートウェイ削除とNATインスタンス停止
NATゲートウェイには停止操作が無いので、使わない時間帯に止めるには削除し、翌朝に作り直します。EventBridge SchedulerとLambdaで自動化する例が多く、作り直すたびにNATゲートウェイIDが変わるので、ルートテーブルの更新も同じ処理に入れます。削除してもElastic IPは残り、使っていないパブリックIPv4として0.005ドル/時がかかり続けます。外向きIPを固定したい場合はこの額を払って保持し、固定が不要なら解放します。NATインスタンスなら停止・起動だけで済み、停止中はインスタンス料金がかかりません。EBSの料金とElastic IPの料金は停止中もかかり、Elastic IPを付けずに自動割り当てのパブリックIPで動かしている場合は、起動のたびに外向きのIPアドレスが変わります。
開発環境をNATインスタンスへ置き換える手順
AWSのNATインスタンス手順は、AL2023かAmazon Linux 2のEC2でNATを設定し、それをAMIにしてから起動する流れです。NAT用のセキュリティグループ(プライベートサブネットのCIDRから80・443番を許可)を付けたEC2で、次を実行します。
# iptablesのサービスを入れて有効化する
sudo yum install iptables-services -y
sudo systemctl enable iptables
sudo systemctl start iptables
# 再起動後もIP転送が有効になるよう設定する
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/custom-ip-forwarding.conf
sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf
# 主ネットワークインターフェース名を確認する(ens5、enX0など)
ip -br link
# 確認した名前でNATを設定し、FORWARDチェーンの既定ルールを消して保存する
sudo /sbin/iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
sudo /sbin/iptables -F FORWARD
sudo service iptables save
このインスタンスからAMIを作り、パブリックサブネットにNAT用セキュリティグループを付けて起動します。パブリックIPの自動割り当てを有効にするか、起動後にElastic IPを関連付けてください。起動したら、送信元/送信先チェックを無効にし、プライベートサブネットのデフォルトルートをNATインスタンスへ向けます。次のCLIは、EC2とルートテーブルを変更できる権限を持つ端末で実行します。
aws ec2 modify-instance-attribute \
--instance-id i-0123456789abcdef0 --no-source-dest-check
aws ec2 replace-route \
--route-table-id rtb-0123456789abcdef0 \
--destination-cidr-block 0.0.0.0/0 \
--instance-id i-0123456789abcdef0
プライベートサブネットのEC2から curl https://checkip.amazonaws.com を実行し、NATインスタンスのパブリックIPが返れば完了です。
置き換えで止まりやすい3つの箇所
- FORWARDチェーンのREJECT:AL2023のiptables-services 1.8.8が同梱する既定の設定ファイル(
/etc/sysconfig/iptables)には-A FORWARD -j REJECTの行があり、systemctl start iptablesでこれが読み込まれます。iptables -F FORWARDを飛ばす、または保存せずに再起動すると、転送がすべて拒否されます。保存後にこのファイルからFORWARDのREJECT行が消え、MASQUERADEの行が入っているかを確かめてください。 - セキュリティグループのポート:公式手順のルールは80番と443番だけです。SSH経由のgit取得やNTPなど、ほかのポートで外へ出る通信は個別に許可が要ります。
- 切り替え時の接続断:ルートを差し替えると既存の接続は切れます。AWSの比較ページも、NATインスタンスとNATゲートウェイの間でルートを変えると現在の接続が切断されると注意しています。
NATインスタンスに置き換えてはいけない構成
次のどれかに当てはまる環境では、月数十ドルの差額のためにNATインスタンスへ移すべきではありません。
- 本番のアプリが外部API・決済・認証基盤へ常時通信している(NATインスタンス1台の停止がそのままサービス停止になる)
- OSの更新や再起動の担当者が決まっていない(旧NAT AMIのように、サポートの切れたOSが残り続ける)
- 続けて流す通信量がt4gのベースラインを超える(クレジット切れで性能が不安定になる)
- 同じ宛先へ大量の同時接続を張る(NATゲートウェイはIPアドレスを追加して接続数を増やせる)
本番の通信量が多くて困っているなら、方式を変えずに、VPCエンドポイントでNATを通る量そのもの(処理料金)を減らし、AZ内で完結する経路でAZ間の転送料金を消すほうが、可用性を落とさずに済みます。NATゲートウェイのポート枯渇やリージョナル方式への移行はNAT Gatewayの構築手順とリージョナル移行:AZ設計とポート枯渇の実装対処、VPC全体のネットワーク費用の見直しはネットワークコストの内訳と計算方法|実額と削減の優先順位が参考になります。構成の見直しを外部に任せたい場合は、一創のAWSを中心としたインフラ構築の支援でも対応しています。
よくある質問
NATゲートウェイの料金は1か月いくらですか?
東京リージョンで1台を1か月置くと、時間料金45.26ドルとパブリックIPv4の3.65ドルで約49ドルです。これに処理したデータ1GBあたり0.062ドルが加わり、月1TB流すと約112ドルになります。
NATゲートウェイの料金が高いと言われるのはなぜですか?
時間料金に加えて、通過したデータ量にも課金されるためです。インターネット向けの転送料金とは別に1GBあたり0.062ドルがかかり、S3やECRへの大量の通信がNAT経由になっていると、その分がまるごと上乗せされます。
NATインスタンスとは何ですか?
パブリックサブネットに置いたEC2を、iptablesのMASQUERADEでNATとして動かす方式です。AWSが配布していたNAT用AMIはサポートが終わったため、現在はAmazon Linux 2023などから自分で作ります。
NATインスタンスはt4g.nanoで足りますか?
散発的な通信の開発環境なら足ります。ただし仕様上の継続帯域は32Mbpsで、最大5Gbpsはクレジットが残っている間にベストエフォートで出る上限です。イメージ取得やバッチで大量に流し続けるなら、t4g.small以上をベースライン帯域で選びます。
NATゲートウェイを使わない時間だけ止められますか?
停止の操作は無いので、削除して作り直します。作り直すとNATゲートウェイIDが変わるため、ルートテーブルの更新を一緒に自動化します。削除後もElastic IPを保持すると0.005ドル/時がかかります。