NAT ゲートウェイの料金を下げる方法 ── S3 と DynamoDB への通信はゲートウェイエンドポイントに逃がす

目次

概要

プライベートサブネットの 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 ゲートウェイのメトリクスが増えなくなることを確かめます。

同じリージョンの S3 への通信は、ゲートウェイエンドポイントに逃がすと NAT の料金がかからない
同じリージョンの 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 が有用)
メトリクス意味
BytesInFromSourceVPC 内のクライアントから NAT ゲートウェイが受け取ったバイト数(アップロード方向)
BytesOutToDestinationNAT ゲートウェイから送信先へ送ったバイト数
BytesInFromDestination送信先から NAT ゲートウェイが受け取ったバイト数(ダウンロード方向)
BytesOutToSourceNAT ゲートウェイから 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 宛てはエンドポイントへ、それ以外は NAT ゲートウェイへ
ルートテーブルは最も具体的なルートを使う。S3 宛てはエンドポイントへ、それ以外は NAT ゲートウェイへ

使うときの注意点は次のとおりです。

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

ゲートウェイエンドポイントの作り方の基本や、インターフェイスエンドポイントとの違いは VPC エンドポイントで AWS サービスへプライベート接続する で扱っています。

クラウドおさる

裏道が通じているのは、この山の隣の倉庫だけでござる。遠くの山(別のリージョン)の倉庫へは、相変わらず門を通るでござるよ。それと、倉庫の番人が「門の向こうから来た猿だけ通す」(aws:SourceIp)と決めていると、裏道から来た猿は締め出されるので気をつけるでござる。

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

プライベートサブネットの EC2 インスタンスが、S3 への通信も NAT ゲートウェイ経由で行っている状態から始めます。まず S3 から 300 MB のファイルをダウンロードして NAT ゲートウェイのメトリクスが増えることを確かめ、S3 のゲートウェイエンドポイントを作ってから同じダウンロードをもう一度行い、メトリクスが増えないことを確かめます。

前提条件

  • リージョン: ap-northeast-1(東京)
  • VPC・EC2・S3・CloudWatch・Systems Manager の操作権限を持つ IAM ユーザーまたはロールでコンソールにログイン済みであること

以下のリソースが作成済みであることを前提とします。プライベートサブネットの EC2 には、Session Manager で接続でき、バケットを読み書きできる IAM ロールが付いています。

まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。

リソース種別リソース名内容作り方の参考
VPCnatcost-vpcCIDR 10.0.0.0/16Amazon VPC で仮想ネットワークを構築しサブネットを設定する
パブリックサブネットnatcost-public-1a10.0.1.0/24(ap-northeast-1a)。インターネットゲートウェイ natcost-igw へのルートあり同上
プライベートサブネットnatcost-private-1a10.0.11.0/24(ap-northeast-1a)同上
NAT ゲートウェイnatcost-natnatcost-public-1a に配置。Elastic IP 付きNAT ゲートウェイでプライベートサブネットからの外部通信を実現する
ルートテーブルnatcost-private-rtnatcost-private-1a に関連付け。0.0.0.0/0 → natcost-nat のみVPC のルートテーブルでトラフィックの流れを制御する
S3 バケットnatcost-data-<アカウント ID>300 MB のオブジェクト sample-300mb.bin が入っているAmazon S3 でバケットを作成しオブジェクトを管理する
EC2 インスタンスnatcost-appnatcost-private-1a に配置。パブリック IP なし。Session Manager で接続でき、上のバケットを読み書きできる―

このハンズオンで作成するリソースは以下のとおりです。

リソース種別リソース名用途
VPC エンドポイント(ゲートウェイ)natcost-s3-gwS3 への通信を 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 ゲートウェイへ向かう状態です。

natcost-private-rt のルート(0.0.0.0/0 → NAT ゲートウェイのルートだけがある状態)
natcost-private-rt のルート(0.0.0.0/0 → 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.bin

300 MB のファイルがダウンロードできたことを確認します。ダウンロードを終えた時刻を控えておきます。

natcost-app の Session Manager で S3 から sample-300mb.bin をダウンロードした結果
natcost-app の Session Manager で S3 から sample-300mb.bin をダウンロードした結果

手順 2: NAT ゲートウェイのメトリクスでダウンロード量を確かめる

上部の検索バーに CloudWatch と入力し、「CloudWatch」を選択します。左側ナビゲーションの「メトリクス」→「クラシックメトリクス」を選択します。「参照」タブで「NATGateway」→「NatGatewayId」の順に選び、検索ボックスに BytesOutToSource と入力します。natcost-nat の ID の行にチェックを入れます。

「グラフ化したメトリクス」タブで、統計を 合計、期間を 1 分 にします。グラフの時間範囲を 1 時間 にして、メトリクスが反映されるまで数分待ちます(グラフの時刻は既定で UTC 表示です。日本時間から 9 時間引いて読みます)。

手順 1 でダウンロードした時刻のあたりに、約 300 MB(約 3 億バイト)の山が出ていることを確認します。S3 からのダウンロードが、NAT ゲートウェイを通ってインスタンスに届いたことを示しています。この量が、NAT ゲートウェイのデータ処理料金の対象です。

CloudWatch の BytesOutToSource のグラフ(ダウンロードした時刻に約 300 MB の山がある)
CloudWatch の BytesOutToSource のグラフ(ダウンロードした時刻に約 300 MB の山がある)

手順 3: S3 のゲートウェイエンドポイントを作る

VPC コンソールの左側ナビゲーションで「エンドポイント」を選択し、「エンドポイントを作成」をクリックします。以下を設定します。

  • 名前タグ: natcost-s3-gw
  • タイプ: AWS のサービス
  • サービス: 検索ボックスに s3 と入力して候補の「サービス名 = com.amazonaws.ap-northeast-1.s3」を選び、表に出た 2 行のうち「タイプ」が Gateway の行を選択
  • VPC: natcost-vpc
  • ルートテーブル: natcost-private-rt にチェック
  • ポリシー: フルアクセス

その他の項目はデフォルトのままにして、「エンドポイントを作成」をクリックします。

エンドポイントの作成画面(サービスが com.amazonaws.ap-northeast-1.s3 の Gateway、ルートテーブルに natcost-private-rt を選択した状態)
エンドポイントの作成画面(サービスが com.amazonaws.ap-northeast-1.s3 の Gateway、ルートテーブルに natcost-private-rt を選択した状態)

エンドポイントの状態が 使用可能 になったことを確認します。

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

natcost-private-rt のルート(pl- → vpce- のルートが追加され、0.0.0.0/0 → NAT ゲートウェイも残っている状態)
natcost-private-rt のルート(pl- → 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.bin

NAT ゲートウェイを通らなくなっても、同じように 300 MB のファイルがダウンロードできることを確認します。ダウンロードを終えた時刻を控えておきます。

natcost-app の Session Manager でエンドポイント作成後にもう一度ダウンロードした結果
natcost-app の Session Manager でエンドポイント作成後にもう一度ダウンロードした結果

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

CloudWatch の BytesOutToSource のグラフ(1 回目のダウンロードの山だけがあり、2 回目のダウンロードの時刻には山がない)
CloudWatch の BytesOutToSource のグラフ(1 回目のダウンロードの山だけがあり、2 回目のダウンロードの時刻には山がない)

同じ 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 など)で確かめられる

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次