概要
プライベートサブネットの EC2 インスタンスからインターネットへ出るために NAT ゲートウェイを置くと、請求書で NAT ゲートウェイの料金が思ったより大きくなっていることがあります。NAT ゲートウェイは、使用可能な時間 1 時間ごとの料金に加えて、処理したデータ 1 GB ごとの料金がかかるからです。
見落としやすいのが、同じリージョンの Amazon S3 や Amazon DynamoDB への通信も、ルートが 0.0.0.0/0 → NAT ゲートウェイのままなら NAT ゲートウェイを通っているという点です。バックアップやログ、データ分析のファイルを S3 とやり取りしているワークロードでは、このデータ量がそのまま NAT ゲートウェイのデータ処理料金になります。
この記事では、NAT ゲートウェイまわりの料金の構造を整理し、S3 と DynamoDB への通信を ゲートウェイ VPC エンドポイント(追加料金なし)に逃がす方法を説明します。実践では、プライベートサブネットの EC2 から S3 の 300 MB のファイルをダウンロードし、NAT ゲートウェイの CloudWatch メトリクスが増えることを確かめます。そのうえで S3 のゲートウェイエンドポイントを作り、同じダウンロードをしても NAT ゲートウェイのメトリクスが増えなくなることを確かめます。

クラウドおさる猿山の門(NAT ゲートウェイ)は、通ったバナナの量で通行料を取るのでござる。山のすぐ隣の倉庫(S3)へ行くだけなのに門を通っていたら、もったいないでござるな。今日は門を通らない裏道を作るでござるよ。
この記事のメリット
- NAT ゲートウェイの料金が「時間」と「処理したデータ量」の 2 つでできていることを説明できるようになる
- 同じリージョンの S3・DynamoDB への通信が NAT ゲートウェイを通っていると、データ処理料金がかかることが分かる
- ゲートウェイエンドポイントとインターフェイスエンドポイントの料金と使える範囲の違いを区別できるようになる
- NAT ゲートウェイを通るデータ量を CloudWatch メトリクスで確かめられるようになる
- S3 のゲートウェイエンドポイントを作り、ルートテーブルにプレフィックスリストのルートが入る仕組みを確かめられる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



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



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



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
NAT ゲートウェイまわりの料金の構造
NAT ゲートウェイを作ると、NAT ゲートウェイが使用可能な時間 1 時間ごと、およびゲートウェイが処理したデータ 1 GB ごとに課金されます。データ処理料金は、通信の行き先がインターネットのサーバーでも、同じリージョンの S3 でも同じようにかかります。
NAT ゲートウェイを減らす・避ける選択肢も含めて、料金の構造を整理すると次のとおりです。具体的な単価はリージョンや時期で変わるので、Amazon VPC の料金 と AWS PrivateLink の料金 のページで確認してください。
| 経路・リソース | かかる料金 | 使える行き先 |
|---|---|---|
| NAT ゲートウェイ | 使用可能な時間ごとの料金 + 処理したデータ量(GB)ごとの料金 | インターネット、AWS のサービス |
| ゲートウェイ VPC エンドポイント | 追加料金なし(時間料金もデータ処理料金もかからない) | 同じリージョンの S3 と DynamoDB だけ |
| インターフェイス VPC エンドポイント | AZ ごとにプロビジョニングされた時間ごとの料金 + 処理したデータ量(GB)ごとの料金 | インターフェイスエンドポイントに対応した AWS のサービス(S3 を含む) |
| AZ をまたぐデータ転送 | 同じリージョン内でも AZ 間の転送には料金がかかる(同じ AZ 内の転送は無料) | ― |
この表から、NAT ゲートウェイの料金を下げる打ち手は次の 3 つに整理できます。AWS のナレッジセンターでも、この順で確かめることを勧めています。
| 打ち手 | 効くケース |
|---|---|
| 同じリージョンの S3・DynamoDB への通信をゲートウェイエンドポイントに逃がす | NAT ゲートウェイを通るデータの多くが S3・DynamoDB 宛て |
| インターフェイスエンドポイントに逃がす | NAT ゲートウェイを通るデータの多くが、インターフェイスエンドポイントに対応した他の AWS のサービス宛て(エンドポイントの料金と比べて判断する) |
| 通信の多いリソースと同じ AZ に NAT ゲートウェイを置く | 別の AZ の NAT ゲートウェイを通っていて、AZ 間のデータ転送料金も重なっている |
3 つ目の「AZ ごとに NAT ゲートウェイを置く」構成は、AZ 障害対策にもなります。詳しくは NAT ゲートウェイの AZ 障害対策 ── プライベートサブネットから外に出られなくなるのを防ぐ で扱っています。



門の通行料は「門番を雇っている時間」と「通ったバナナの量」の二本立てでござる。隣の倉庫(S3・DynamoDB)への荷物を裏道に回せば、量のほうの通行料がまるごと浮くのでござるな。
どこに料金がかかっているかを見つける
料金を下げる前に、NAT ゲートウェイを通っているデータが本当に多いのかを確かめます。
- CloudWatch メトリクス: NAT ゲートウェイのメトリクスは名前空間
AWS/NATGatewayに 1 分間隔で送られます。データ量は次の 4 つで見られます(単位はバイト、統計はSumが有用)
| メトリクス | 意味 |
|---|---|
BytesInFromSource | VPC 内のクライアントから NAT ゲートウェイが受け取ったバイト数(アップロード方向) |
BytesOutToDestination | NAT ゲートウェイから送信先へ送ったバイト数 |
BytesInFromDestination | 送信先から NAT ゲートウェイが受け取ったバイト数(ダウンロード方向) |
BytesOutToSource | NAT ゲートウェイから VPC 内のクライアントへ送ったバイト数 |
- VPC フローログ: メトリクスで通信が急に増えた時間帯が分かったら、VPC フローログを CloudWatch Logs Insights や Amazon Athena でクエリして、どのインスタンスがどの宛先と大量に通信しているかを調べます
- Cost Explorer: 「使用タイプ」でフィルタやグループ化をすると、NAT ゲートウェイの時間の料金と、処理したデータ量の料金を分けて見られます。どちらが大きいかで、打ち手が変わります
ゲートウェイエンドポイントの仕組み
ゲートウェイエンドポイントは、VPC にインターネットゲートウェイや NAT デバイスが無くても S3 と DynamoDB に接続できるようにするものです。他の VPC エンドポイントと違い、AWS PrivateLink は使いません。
作成するときに、エンドポイントを使わせたいサブネットのルートテーブルを選びます。選んだルートテーブルには、次のルートが自動で追加されます。
| 送信先 | ターゲット |
|---|---|
サービスのプレフィックスリスト(pl- で始まる ID。中身は S3 のそのリージョンの IP アドレス範囲) | ゲートウェイエンドポイント(vpce- で始まる ID) |
ルートテーブルは、通信に一致するルートのうち最も具体的なルート(最長プレフィックス一致)を使います。0.0.0.0/0 → NAT ゲートウェイ のルートが残っていても、同じリージョンの S3 宛ての通信はプレフィックスリストのルートに一致するので、エンドポイントを通るようになります。インターネットなど他の宛先への通信は、これまでどおり NAT ゲートウェイを通ります。


使うときの注意点は次のとおりです。
- ゲートウェイエンドポイントは、作成したリージョンでしか使えません。プレフィックスリストはリージョン固有なので、別のリージョンの S3・DynamoDB 宛ての通信はエンドポイントを通りません
- オンプレミスのネットワーク、他のリージョンのピア接続された VPC、トランジットゲートウェイからは使えません。この場合は、追加料金のかかるインターフェイスエンドポイントを使います
- 追加されたエンドポイントのルートは、確認はできますが変更・削除はできません。ルートテーブルとの関連付けを解除すると、ルートも自動で消えます
- エンドポイントを作成・変更すると、ルートが切り替わり、開いている TCP 接続が切断されます。重要な処理が動いていないときに作業します
- S3 から見た送信元 IP アドレスが、パブリック IP アドレスから VPC 内のプライベート IP アドレスに変わります。バケットポリシーで
aws:SourceIpを使って IP アドレスを絞っている場合は、aws:VpcSourceIpなどに書き換える必要があります
ゲートウェイエンドポイントの作り方の基本や、インターフェイスエンドポイントとの違いは VPC エンドポイントで AWS サービスへプライベート接続する で扱っています。



裏道が通じているのは、この山の隣の倉庫だけでござる。遠くの山(別のリージョン)の倉庫へは、相変わらず門を通るでござるよ。それと、倉庫の番人が「門の向こうから来た猿だけ通す」(aws:SourceIp)と決めていると、裏道から来た猿は締め出されるので気をつけるでござる。
実践
プライベートサブネットの EC2 インスタンスが、S3 への通信も NAT ゲートウェイ経由で行っている状態から始めます。まず S3 から 300 MB のファイルをダウンロードして NAT ゲートウェイのメトリクスが増えることを確かめ、S3 のゲートウェイエンドポイントを作ってから同じダウンロードをもう一度行い、メトリクスが増えないことを確かめます。
前提条件
- リージョン:
ap-northeast-1(東京) - VPC・EC2・S3・CloudWatch・Systems Manager の操作権限を持つ IAM ユーザーまたはロールでコンソールにログイン済みであること
以下のリソースが作成済みであることを前提とします。プライベートサブネットの EC2 には、Session Manager で接続でき、バケットを読み書きできる IAM ロールが付いています。
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| VPC | natcost-vpc | CIDR 10.0.0.0/16 | Amazon VPC で仮想ネットワークを構築しサブネットを設定する |
| パブリックサブネット | natcost-public-1a | 10.0.1.0/24(ap-northeast-1a)。インターネットゲートウェイ natcost-igw へのルートあり | 同上 |
| プライベートサブネット | natcost-private-1a | 10.0.11.0/24(ap-northeast-1a) | 同上 |
| NAT ゲートウェイ | natcost-nat | natcost-public-1a に配置。Elastic IP 付き | NAT ゲートウェイでプライベートサブネットからの外部通信を実現する |
| ルートテーブル | natcost-private-rt | natcost-private-1a に関連付け。0.0.0.0/0 → natcost-nat のみ | VPC のルートテーブルでトラフィックの流れを制御する |
| S3 バケット | natcost-data-<アカウント ID> | 300 MB のオブジェクト sample-300mb.bin が入っている | Amazon S3 でバケットを作成しオブジェクトを管理する |
| EC2 インスタンス | natcost-app | natcost-private-1a に配置。パブリック IP なし。Session Manager で接続でき、上のバケットを読み書きできる | ― |
このハンズオンで作成するリソースは以下のとおりです。
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| VPC エンドポイント(ゲートウェイ) | natcost-s3-gw | S3 への通信を NAT ゲートウェイから逃がす |
NAT ゲートウェイは、作成している間ずっと時間単位で課金され、処理したデータ量にも課金されます。このハンズオンでは数百 MB のデータが NAT ゲートウェイを通ります。Elastic IP も課金対象です。検証が終わったら必ず削除し、Elastic IP を解放してください。ゲートウェイエンドポイントには追加料金はかかりません。
手順 1: S3 への通信が NAT ゲートウェイを通っていることを確かめる
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
上部の検索バーに VPC と入力し、「VPC」を選択します。左側ナビゲーションの「ルートテーブル」を選択し、検索ボックスに natcost と入力して絞り込みます。natcost-private-rt のルートテーブル ID をクリックして詳細画面を開き、「ルート」タブを確認します。ローカルのルートのほかは 0.0.0.0/0 → natcost-nat の ID(nat- で始まる)だけで、S3 宛ての通信もこのルートで NAT ゲートウェイへ向かう状態です。


上部の検索バーに EC2 と入力し、「EC2」を選択します。「インスタンス」で natcost-app を選択し、「接続」をクリックします。「Session Manager」タブで「接続」をクリックし、表示されたターミナルで次のコマンドを実行します。<アカウント ID> は自分の AWS アカウント ID に置き換えます。
aws s3 cp s3://natcost-data-<アカウント ID>/sample-300mb.bin /tmp/ --region ap-northeast-1
ls -lh /tmp/sample-300mb.bin300 MB のファイルがダウンロードできたことを確認します。ダウンロードを終えた時刻を控えておきます。


手順 2: NAT ゲートウェイのメトリクスでダウンロード量を確かめる
上部の検索バーに CloudWatch と入力し、「CloudWatch」を選択します。左側ナビゲーションの「メトリクス」→「クラシックメトリクス」を選択します。「参照」タブで「NATGateway」→「NatGatewayId」の順に選び、検索ボックスに BytesOutToSource と入力します。natcost-nat の ID の行にチェックを入れます。
「グラフ化したメトリクス」タブで、統計を 合計、期間を 1 分 にします。グラフの時間範囲を 1 時間 にして、メトリクスが反映されるまで数分待ちます(グラフの時刻は既定で UTC 表示です。日本時間から 9 時間引いて読みます)。
手順 1 でダウンロードした時刻のあたりに、約 300 MB(約 3 億バイト)の山が出ていることを確認します。S3 からのダウンロードが、NAT ゲートウェイを通ってインスタンスに届いたことを示しています。この量が、NAT ゲートウェイのデータ処理料金の対象です。


手順 3: S3 のゲートウェイエンドポイントを作る
VPC コンソールの左側ナビゲーションで「エンドポイント」を選択し、「エンドポイントを作成」をクリックします。以下を設定します。
- 名前タグ:
natcost-s3-gw - タイプ:
AWS のサービス - サービス: 検索ボックスに
s3と入力して候補の「サービス名 = com.amazonaws.ap-northeast-1.s3」を選び、表に出た 2 行のうち「タイプ」がGatewayの行を選択 - VPC:
natcost-vpc - ルートテーブル:
natcost-private-rtにチェック - ポリシー:
フルアクセス
その他の項目はデフォルトのままにして、「エンドポイントを作成」をクリックします。


エンドポイントの状態が 使用可能 になったことを確認します。
左側ナビゲーションの「ルートテーブル」で natcost-private-rt のルートテーブル ID をクリックして詳細画面を開き、「ルート」タブを確認します。送信先がプレフィックスリスト(pl- で始まる ID)、ターゲットが natcost-s3-gw の ID(vpce- で始まる)のルートが自動で追加されています。0.0.0.0/0 → NAT ゲートウェイのルートはそのまま残っています。





道案内(ルートテーブル)に「倉庫行きはこっち」という札が 1 枚増えただけでござる。「その他はぜんぶ門へ」の札も残っているが、より細かい札が勝つので、倉庫行きの荷物だけが裏道に回るのでござるな。
手順 4: 同じダウンロードで NAT ゲートウェイのメトリクスが増えないことを確かめる
natcost-app の Session Manager のターミナルに戻ります(エンドポイントの作成で接続が切れていたら、もう一度接続します)。/tmp の空き容量が小さく、同じ場所に 300 MB のファイルをもう一度書き込むと AWS_ERROR_NO_SPACE(空き容量不足)で失敗するため、先に手順 1 でダウンロードしたファイルを削除してから、同じコマンドでもう一度ダウンロードします。
rm /tmp/sample-300mb.bin
aws s3 cp s3://natcost-data-<アカウント ID>/sample-300mb.bin /tmp/ --region ap-northeast-1
ls -lh /tmp/sample-300mb.binNAT ゲートウェイを通らなくなっても、同じように 300 MB のファイルがダウンロードできることを確認します。ダウンロードを終えた時刻を控えておきます。


CloudWatch コンソールに戻り、手順 2 と同じ BytesOutToSource のグラフを開きます。数分待ってからグラフを更新し、2 回目のダウンロードの時刻には約 300 MB の山が出ていないことを確認します。Session Manager の通信など、S3 以外の宛先への小さな通信は引き続き NAT ゲートウェイを通るため、値はゼロにはなりません。


同じ 300 MB のダウンロードが、NAT ゲートウェイのデータ処理料金の対象から外れたことが分かります。



「NAT ゲートウェイの料金を下げたい」「S3・DynamoDB への通信をインターネットに出したくない」と来たら、まずゲートウェイエンドポイントでござる。インターフェイスエンドポイントも S3 に使えるが、こちらは時間とデータ量で料金がかかるので、「追加料金なし」を求められたら取り違えないことでござるな。
まとめ
| 要件 | 選ぶもの |
|---|---|
| 同じリージョンの S3・DynamoDB への通信で、NAT ゲートウェイの料金を下げたい | ゲートウェイ VPC エンドポイント(追加料金なし) |
| オンプレミス・他のリージョンのピア接続された VPC・トランジットゲートウェイから S3 に入りたい | S3 のインターフェイスエンドポイント(有料) |
| S3・DynamoDB 以外の AWS のサービスへの通信が NAT ゲートウェイの多くを占める | そのサービスのインターフェイスエンドポイント(エンドポイントの料金と比べて判断) |
| 別の AZ の NAT ゲートウェイを通っていて、AZ 間の転送料金も重なっている | 通信の多いリソースと同じ AZ に NAT ゲートウェイを置く |
- NAT ゲートウェイは、使用可能な時間ごとの料金と、処理したデータ量(GB)ごとの料金がかかる。行き先が同じリージョンの S3 でもデータ処理料金はかかる
- ゲートウェイエンドポイントは S3 と DynamoDB だけに使え、追加料金はかからない。選んだルートテーブルに「プレフィックスリスト(
pl-)→ エンドポイント(vpce-)」のルートが自動で入る 0.0.0.0/0→ NAT ゲートウェイのルートが残っていても、最も具体的なルートが使われるので、同じリージョンの S3・DynamoDB 宛ての通信だけがエンドポイントを通る- ゲートウェイエンドポイントは作成したリージョンでしか使えない。オンプレミスなどからはインターフェイスエンドポイント(有料)を使う
- NAT ゲートウェイを通るデータ量は CloudWatch の
AWS/NATGatewayのメトリクス(BytesOutToSourceなど)で確かめられる
参照先
- Amazon VPC 内の NAT ゲートウェイにかかるデータ転送料金を削減する方法を教えてください。 – AWS re:Post
- Amazon VPC 内の NAT ゲートウェイを経由するトラフィックを最も増加させている要因を調べるにはどうすればよいですか? – AWS re:Post
- NAT ゲートウェイの料金 – Amazon Virtual Private Cloud
- NAT ゲートウェイのメトリクスおよびディメンション – Amazon Virtual Private Cloud
- Amazon CloudWatch による NAT ゲートウェイのモニタリング – Amazon Virtual Private Cloud
- CloudWatch メトリクスを発行する AWS のサービス – Amazon CloudWatch
- ゲートウェイエンドポイント – Amazon Virtual Private Cloud
- Amazon S3 のゲートウェイエンドポイント – Amazon Virtual Private Cloud
- Amazon DynamoDB のゲートウェイエンドポイント – Amazon Virtual Private Cloud
- AWS のサービス を介したアクセス AWS PrivateLink – Amazon Virtual Private Cloud
- AWS PrivateLink for Amazon S3 – Amazon Simple Storage Service
- データ転送料金について – AWS Data Exports
- 表示するデータのフィルタリング – AWS コスト管理












