概要
プライベートサブネットに配置した EC2 インスタンスやデータベースは、インターネットからの直接アクセスを遮断できるため、セキュリティの観点で重要な役割を果たします。一方で、OS やソフトウェアのアップデート、外部 API の呼び出しなど、プライベートサブネット内のリソースからインターネットへ通信したい場面は数多くあります。
NAT ゲートウェイ(NAT Gateway)は、プライベートサブネット内のリソースがインターネットへアウトバウンド通信を行えるようにする AWS のマネージドサービスです。インターネットからプライベートサブネットへのインバウンド通信は許可しないため、リソースを外部に公開せずに「外に出る通信」だけを実現できます。
本記事では、NAT ゲートウェイの仕組みを理解し、パブリックサブネットに NAT ゲートウェイを作成して、プライベートサブネットからインターネットへのアウトバウンド経路を構成するところまで体験します。

この記事のメリット
- NAT ゲートウェイがプライベートサブネットからの外部通信を実現する仕組みを理解できる
- パブリック NAT ゲートウェイとプライベート NAT ゲートウェイの違いを把握できる
- NAT ゲートウェイの配置やルートテーブルの設定方法を習得できる
- NAT ゲートウェイの料金体系と、利用時に注意すべきポイントを学べる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

クラウドおさる
クラウドおさるはじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
NAT ゲートウェイとは



とひさん、前回プライベートサブネットに置いたリソースはインターネットに直接アクセスできないって教わりましたよね。でも、サーバーのアップデートとかはどうするんですか?
いい質問だね!そこで登場するのが NAT ゲートウェイだよ。NAT ゲートウェイは、プライベートサブネット内のリソースがインターネットへ「アウトバウンド通信」をできるようにするマネージドサービスなんだ。



アウトバウンド通信って、外に向かって出ていく通信のことですよね。
そのとおり。ポイントは、プライベートサブネットのリソースから外に向かう通信は許可するけど、インターネット側から勝手に入ってくる通信(未承諾のインバウンド接続)は受け付けないってところなんだ。だから、リソースを外部に公開せずに「外に出る通信」だけを実現できるんだよ。



なるほど!外には出られるけど、外から入ってこられないんですね。安全に保ったままアップデートできるってことか。
そういうこと。NAT は「Network Address Translation(ネットワークアドレス変換)」の略でね。プライベートサブネットのインスタンスが通信を送ると、NAT ゲートウェイが送信元のプライベート IP アドレスを自分のアドレスに置き換えて外に送るんだ。応答が返ってくると、今度は元のインスタンスのアドレスに変換し直して届けてくれる。この変換のおかげで、複数のインスタンスが 1 つの NAT ゲートウェイを共有して外部通信できるんだよ。
NAT ゲートウェイの仕組みと配置



NAT ゲートウェイって、どこに置けばいいんですか?プライベートサブネットを助けるものだから、プライベートサブネットの中ですか?
ここがちょっと意外なところでね。パブリック NAT ゲートウェイは、パブリックサブネットに置くんだ。



えっ、プライベートサブネットを助けるのに、置く場所はパブリックサブネットなんですか?
そうなんだ。NAT ゲートウェイ自身がインターネットと通信できる必要があるからだよ。NAT ゲートウェイはプライベートサブネットからの通信を受け取って、それをインターネットゲートウェイ(IGW)経由で外に出す。だから NAT ゲートウェイ自身は、IGW へのルートを持つパブリックサブネットに置く必要があるんだ。通信の流れを整理するとこうなるよ。
| ステップ | 通信の流れ |
|---|---|
| 1 | プライベートサブネットの EC2 がインターネット宛てに通信を送る |
| 2 | プライベートサブネットのルートテーブルが 0.0.0.0/0 を NAT ゲートウェイに転送 |
| 3 | NAT ゲートウェイ(パブリックサブネット)が送信元 IP を変換 |
| 4 | パブリックサブネットのルートテーブルが 0.0.0.0/0 を IGW に転送 |
| 5 | インターネットゲートウェイ経由で外部へ通信、応答は逆順で戻る |





なるほど!プライベートサブネットのルートテーブルが NAT ゲートウェイを向いていて、NAT ゲートウェイがいるパブリックサブネットのルートテーブルは IGW を向いている。バトンを渡していくみたいなイメージですね。
まさにそのイメージだよ。それと、パブリック NAT ゲートウェイには Elastic IP アドレスを関連付ける必要があるんだ。Elastic IP は固定のパブリック IPv4 アドレスで、NAT ゲートウェイがインターネットと通信するときの送信元アドレスとして使われるよ。NAT ゲートウェイを作成するときに、新しい Elastic IP を割り当てるか、既存のものを選ぶことになるんだ。
パブリック NAT ゲートウェイとプライベート NAT ゲートウェイ



さっきから「パブリック NAT ゲートウェイ」って言ってますけど、パブリックじゃない NAT ゲートウェイもあるんですか?
あるよ。NAT ゲートウェイには「パブリック」と「プライベート」の 2 つのタイプがあるんだ。違いをまとめるとこうなるよ。
| 項目 | パブリック NAT ゲートウェイ | プライベート NAT ゲートウェイ |
|---|---|---|
| 主な用途 | プライベートサブネットからインターネットへの通信 | 他の VPC やオンプレミスネットワークとの通信 |
| 配置先 | パブリックサブネット | プライベートサブネット |
| Elastic IP | 必須(作成時に関連付け) | 関連付け不可 |
| インターネット接続 | インターネットゲートウェイ経由で可能 | 不可(IGW へのトラフィックはドロップされる) |
| インバウンド(未承諾) | 受信不可 | 受信不可 |



プライベート NAT ゲートウェイはインターネットに出られないんですね。それだと何に使うんでしょう?
プライベート NAT ゲートウェイは、Transit Gateway や仮想プライベートゲートウェイを経由して、他の VPC やオンプレミスのネットワークと通信するときに使うんだ。たとえば、複数の VPC で IP アドレス範囲が重複しているようなケースで、アドレス変換のために使われたりするね。インターネットに出る用途で使うのは、今回扱う「パブリック NAT ゲートウェイ」のほうだよ。



なるほど。今回はプライベートサブネットからインターネットに出たいから、パブリック NAT ゲートウェイを使えばいいんですね。
NAT インスタンスとの違い



調べていたら「NAT インスタンス」っていう言葉も出てきたんですけど、NAT ゲートウェイとは違うものなんですか?
いいところに気づいたね。NAT インスタンスは、同じ NAT の役割を EC2 インスタンスで実現する古くからの方式なんだ。NAT ゲートウェイはそれを AWS のマネージドサービスとして提供したものだよ。比較してみよう。
| 項目 | NAT ゲートウェイ | NAT インスタンス |
|---|---|---|
| 管理 | AWS が管理(メンテナンス不要) | 利用者が管理(OS パッチ・ソフト更新) |
| 可用性 | アベイラビリティーゾーン内で冗長化済み | スクリプトで手動フェイルオーバー |
| 帯域幅 | 最大 100 Gbps まで拡張 | インスタンスタイプの帯域に依存 |
| セキュリティグループ | 関連付け不可(背後のリソースで制御) | 関連付け可能 |
| 踏み台サーバー利用 | 不可 | 可能 |



NAT ゲートウェイは AWS が面倒を見てくれて、可用性も帯域幅も優れているんですね。
そうだね。AWS も基本的には NAT ゲートウェイの利用を推奨しているよ。NAT インスタンスは、踏み台サーバーを兼ねたいとか、ポート転送をしたいといった特殊な要件があるときの選択肢って考えるといいかな。新しく構築するなら、まずは NAT ゲートウェイを検討するのが定石だね。
料金に注意



マネージドで便利なのはわかったんですけど…NAT ゲートウェイってお金はかかるんですか?
かかるよ。しかも、NAT ゲートウェイは料金面で注意が必要なサービスなんだ。料金は大きく 2 種類あってね。
| 料金の種類 | 内容 |
|---|---|
| 時間課金 | NAT ゲートウェイが存在している時間に対して課金される |
| データ処理料金 | NAT ゲートウェイを通過したデータ量(GB 単位)に対して課金される |



時間課金ってことは、通信していなくても置いてあるだけで課金されるんですか?
そのとおり。NAT ゲートウェイは存在しているだけで時間あたりの料金が発生するんだ。だから、検証で作ったあとに削除を忘れると、使っていなくても課金が続いてしまうんだよ。



それは怖いですね…。ハンズオンのあとはちゃんと消さないと。
そうだね。それともう一つ、データ処理料金にも気をつけたいポイントがあるよ。たとえば、同じリージョン内の S3 や DynamoDB へアクセスするのに NAT ゲートウェイを経由させると、そのデータ量にもデータ処理料金がかかってしまうんだ。こういう AWS サービス向けの通信は、NAT ゲートウェイではなく VPC エンドポイントを使うことで、NAT ゲートウェイのデータ処理料金を回避できるんだ。



NAT ゲートウェイは便利だけど、料金を意識して使い分けることが大事なんですね。検証が終わったら削除すること、覚えておきます!
実践
NAT ゲートウェイをパブリックサブネットに作成し、プライベートサブネットのルートテーブルを NAT ゲートウェイに向けて、インターネットへのアウトバウンド経路を構成します。
前提条件
以下のリソースが作成済みであることを前提とします。
- リージョン:
ap-northeast-1(東京) - IAM ユーザーまたはロールに VPC・EC2 関連リソースの操作権限があること
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| VPC | nat-vpc | 仮想ネットワーク(CIDR: 10.0.0.0/16) |
| パブリックサブネット | nat-public-subnet | NAT ゲートウェイを配置するサブネット(10.0.1.0/24、AZ: ap-northeast-1a) |
| プライベートサブネット | nat-private-subnet | EC2 を配置するサブネット(10.0.2.0/24、AZ: ap-northeast-1a) |
| インターネットゲートウェイ | nat-igw | VPC とインターネットの接続 |
| ルートテーブル | nat-public-rt | パブリックサブネット用(0.0.0.0/0 → IGW 設定済み) |
| ルートテーブル | nat-private-rt | プライベートサブネット用(0.0.0.0/0 ルートは未設定) |
| EC2 インスタンス | nat-private-server | プライベートサブネットに配置されたインスタンス |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| Elastic IP | nat-eip | NAT ゲートウェイ用の固定パブリック IP |
| NAT ゲートウェイ | nat-gateway | プライベートサブネットからのアウトバウンド通信 |
| ルート | (nat-private-rt 内) | 0.0.0.0/0 → NAT ゲートウェイ |
ステップ1: NAT ゲートウェイ作成前のルーティングを確認する
NAT ゲートウェイを作成する前に、プライベートサブネットのルートテーブルにインターネットへのルートがないことを確認します。
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
VPCと入力し、表示された「VPC」を選択します - 左側ナビゲーションの「ルートテーブル」を選択します
- プライベートサブネット用のルートテーブル
nat-private-rtを選択し、下部の「ルート」タブを選択します - 送信先が
10.0.0.0/16(VPC 内通信用のlocalルート)のみで、0.0.0.0/0のルートが存在しないことを確認します


この時点では、プライベートサブネットの nat-private-server はインターネットへの経路を持たないため、外部へ通信できません。
ステップ2: NAT ゲートウェイを作成する
- 上部の検索バーに
VPCと入力し、表示された「VPC」を選択します - 左側ナビゲーションの「NAT ゲートウェイ」を選択し、「NAT ゲートウェイを作成」をクリックします
- 以下の内容を入力します
- 名前:
nat-gateway - サブネット:
nat-public-subnetを選択 - 接続タイプ:
パブリック(デフォルト) - Elastic IP: 「Elastic IP を割り当て」をクリックして新しい Elastic IP を割り当てます


- 「NAT ゲートウェイを作成」をクリックします
- NAT ゲートウェイ一覧で、作成した
nat-gatewayのステータスが保留中(Pending)から利用可能(Available)に変わることを確認します


ステップ3: プライベートサブネットのルートテーブルにルートを追加する
プライベートサブネットのトラフィックを NAT ゲートウェイに向けるため、ルートテーブルにルートを追加します。
- 左側ナビゲーションの「ルートテーブル」を選択します
nat-private-rtを選択し、下部の「ルート」タブを選択します- 「ルートを編集」をクリックします
- 「ルートを追加」をクリックし、以下を入力します
- 送信先:
0.0.0.0/0 - ターゲット:
NAT ゲートウェイを選択し、表示されたnat-gatewayを選択 - 「変更を保存」をクリックします


- 「ルート」タブで、
0.0.0.0/0のターゲットが NAT ゲートウェイになっていることを確認します
ステップ4: ルーティングと NAT ゲートウェイの構成を確認する
ルートが追加され、プライベートサブネットからインターネットへの経路が構成されたことを確認します。
- 左側ナビゲーションの「ルートテーブル」を選択し、
nat-private-rtを選択します - 「ルート」タブで、
0.0.0.0/0のルートが追加され、ターゲットが NAT ゲートウェイ、ステータスが「アクティブ」になっていることを確認します


ステップ1 で確認したときは local ルートのみでしたが、0.0.0.0/0 宛てのトラフィックが NAT ゲートウェイへ転送されるようになりました。これにより、プライベートサブネットの nat-private-server はインターネットへアウトバウンド通信できるようになります。
- 左側ナビゲーションの「NAT ゲートウェイ」を選択し、
nat-gatewayを選択します - 詳細画面で、状態が「利用可能」であること、プライマリパブリック IPv4 アドレスに Elastic IP が割り当てられていること、配置先サブネットが
nat-public-subnetであることを確認します


プライベートサブネットの EC2 がインターネットへ通信する際は、ここで NAT ゲートウェイに割り当てられた Elastic IP アドレスが送信元アドレスとして使われます。
まとめ
- NAT ゲートウェイは、プライベートサブネット内のリソースがインターネットへアウトバウンド通信を行えるようにするマネージドサービスである
- インターネットからプライベートサブネットへの未承諾のインバウンド通信は許可されない
- パブリック NAT ゲートウェイはパブリックサブネットに配置し、Elastic IP の関連付けが必須である
- プライベートサブネットのルートテーブルで
0.0.0.0/0を NAT ゲートウェイに向けることで外部通信が有効になる - NAT ゲートウェイは時間課金とデータ処理料金が発生するため、不要になったら削除する。AWS サービス向けの通信は VPC エンドポイントの利用も検討する













