ちょっと話題の記事

そのトラフィック、NATゲートウェイを通す必要ありますか?適切な経路で不要なデータ処理料金は削減しましょう

うっかり誤った経路を使ってると6倍高いデータ通信量が発生してるかも?
2020.06.08

コスト最適化のご相談をいただくなかで、NAT Gateway に不要なコストが掛かっているパターンが多くみられます。また、そのような環境に限って NAT Gateway にかなりのコストが掛かっていることを把握されていないケースも少なくありません。

今回は見落としがちな NAT Gateway で無駄なコストが発生してしまうケース、何処へのアクセスで NAT Gateway を浪費してるかを確認する方法、そしてどのような改善パターンがあるかをご紹介します。

(本記事中で記載の価格はいずれも、執筆時点の東京リージョン価格を参考にしています)

目次

よくある構成

たとえば以下のような構成です。

  • パブリックアクセスのフロントに ALB を配置しているので、EC2 はプライベートサブネットに配置
  • プライベートサブネットからインターネットへのアクセスに NAT Gateway を配置
    • ダウンロードやアップロード
    • AWS リソースのエンドポイントや、非 AWS リソースへアクセス

NAT Gateway に関わる料金のおさらい

NAT Gateway 料金

  • NAT Gateway 起動料金 $0.062/h
  • NAT データ転送料金 $0.062/GB
    • AWS といえばデータインに関しては料金がかからない印象がありますが、NAT Gateway のデータ転送料金はイン/アウトに関わらず発生します

AWS データ転送料金

  • EC2 からインターネット $0.114/GB
    • 主に非 AWS リソースへのデータ転送料金に掛かります
    • 多くのAWSサービスで同一AZ間、同一リージョン間の通信は無料です
  • AZ 間のデータ転送料金 $0.01/GB
    • AZ ごとの NAT Gateway にアクセスすることで AZ 間のデータ転送料金は発生しませんが起動料金がそれなりに高いので、コストよりも可用性で判断したほうが良いと思います

実際の料金例

上述のよくある構成に似た環境での料金例ですが、意図せずに NAT Gateway を通してしまっている場合、このように EC2 料金の大半が実は NAT Gateway のデータ転送料金でした。(NAT Gateway の料金が EC2 料金としてまとめられているのも気づきにくいポイントかもしれませんね)

上記の例では ECR からのイメージ取得を NAT Gateway 経由で行っていました。EIP を持たせて直接 ECR エンドポイントにアクセスならば無料、VPC エンドポイント経由でのアクセスでも $0.01/GB に抑えられるところを意図せず NAT Gateway 経由でダウンロードしていたことで $0.062/GB で利用してたことになります。

つまり 6 倍以上の料金をずっと支払っていたということになります。(本当にコスト最適化のご相談をいただけて良かったです)

何が NAT Gateway を使ってるのか見当がつかない

ある程度、あたりがついてる場合は読み飛ばしていただいて結構です。

NAT Gateway の料金が思いのほか、高いことに気づいたけど、さっぱり見当がつかないという場合は、以下のような方法で環境のチェックからはじめると良いでしょう。

データ通信の方向を確認

先述のとおり NAT Gateway はデータイン/データアウトに関わらず料金が発生します。まずはデータイン/データアウトのどちらの通信で浪費しているかを知ることで、あたりをつけやすくなります。

データ通信量は Cloudwatch のデフォルトダッシュボードを開くと確認できます。

メトリクス 説明
BytesOutToSource インターネットからVPC内のターゲットへの通信。EC2 がパブリックからダウンロードなどが該当
BytesOutToDestination VPC内からインターネットへの通信。EC2 からパブリックへのアップロードなどが該当

上記の例だと、Bytes Out To Source Sum の値が大きいことから NAT Gateway を経由してパブリック側のデータをダウンロードしてそうだな、、という見当がつきますね。(後半、ガクっと下がっているのはご相談以降に適切な経路に変更いただいたことで、大幅に NAT Gateway のデータ転送量を削減いただいたためです)

VPC フローログから NAT Gateway 利用の上位を確認

それでもまだ見当がつかない場合は、アドレス単位で NAT Gateway の利用量を調査することで、どのインスタンスに対する処理であるかを絞り込むと良いでしょう。(VPC フローログを CloudWatch logs に出力しておく必要があります)

CloudWatch コンソールから、[インサイト] を開きます。対象のロググループを選択し、以下のようにクエリを実行します。xx.xx.xx.xx は NAT Gateway のプライベート IP アドレスに置き換えます。yy.yy.yy.yy/yy は NAT Gateway の所属する VPC の CIDR に置き換えます。

filter (dstAddr like 'xx.xx.xx.xx') and isIpv4InSubnet(srcAddr, 'yy.yy.yy.yy/yy') 
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc
| limit 10

さらにアップロード、ダウンロードの接続先を確認するのであれば、以下のようなクエリを実行します。

アップロードの場合

filter (srcAddr like 'xx.xx.xx.xx') and not isIpv4InSubnet(dstAddr, 'yy.yy.yy.yy/yy') 
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc
| limit 10

ダウンロードの場合

filter (dstAddr like 'xx.xx.xx.xx') and not isIpv4InSubnet(srcAddr, 'yy.yy.yy.yy/yy') 
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc
| limit 10

改善パターンの検討

NAT Gateway を浪費している犯人が特定できたなら、次に改善パターンを検討しましょう。なお、ここで紹介するパターンがすべてではありませんので、あくまでいくつかの案として参考にしていただければと思います。

パブリックサブネットに配置できないか?

トラフィックのほとんどが非 AWS リソースの場合、対象となる AWS リソースをパブリックサブネットに配置し、NAT Gateway を介さずに直接インターネットへのアクセスが可能であるか検討しましょう。インターネットからのダウンロードで浪費していた場合、IGW への直接アクセスに変更することでデータインのデータ転送料金はゼロになります。

アウトバウンドの場合は、NAT Gateway データ転送料金はゼロになりますが、非 AWS リソースへのデータアウト料金 $0.114/GB は残ります。

パブリックサブネットに配置することに不安を感じる方は少なくないかもしれませんが、セキュリティグループやネットワークアクセスコントロールリスト(NACL)でセキュリティポリシーに応じ、インスタンスへの不正アクセスを防ぐよう適切に設定されているならば安全です。

NAT インスタンスに置き換えるか?

非 AWS リソースへのトラフィックは必要だが、パブリックからの直接アクセスはセキュリティポリシー上できない。

そういったケースの場合、まるっとフルマネージドサービスにお任せというメリットは失われてしまいますが、代わりに NAT インスタンスを利用することで NAT Gateway データ転送料金はゼロにすることは可能です。

ただし、この場合はインスタンスサイズによって、NAT Gateway よりも起動料金が高くなりますのでコストとパフォーマンスのバランスはユーザーで判断する必要があります。NAT Gateway 起動料金が $0.062/h ですので、large 以上のインスタンスサイズはいずれも起動料金が高くなります。

S3 で共有できるデータか?

NAT Gateway 以下の複数インスタンスで同じファイルをダウンロードして浪費しているような場合は、S3 にダウンロード対象を配置し、2 台目以降のダウンロードは S3 から取得するような構成にすると、NAT Gateway のデータ転送料金を抑えることができます。

VPC エンドポイントの利用

ここまで主に非 AWS リソースへのトラフィックを想定した話でしたが、ここからは AWS リソース向けです。VPC エンドポイントが提供されている場合、NAT Gateway の代わりに VPC エンドポイント経由でアクセスすることで通信料金を抑えることができます。対象の AWS サービスで VPC エンドポイントが利用できるかどうかは、こちらの一覧をご確認ください。

VPC エンドポイントには 2 つのタイプがあります。

  • ゲートウェイタイプ
    • VPC エンドポイント料金およびデータ処理料金は無料です
  • インタフェースタイプ
    • VPC エンドポイントあたり $0.014/h
    • データ処理料金 $0.01/GB
      • NAT Gateway 同様にデータイン/データアウトに関わらず発生しますが、NAT Gateway の 6分の1 のデータ処理料金に削減できます
      • 多くの AWS サービスで同一リージョン、同一 AZ 間の通信は無料で利用できますが、VPC エンドポイント経由の場合は $0.01/GB の料金がかかります

さいごに

意図しないデータ通信の経路によってコストを浪費することは本当に勿体ないことです。NAT Gateway をご利用になられている場合は、一度、データ処理料金を確認してみてください。

もし、不要なコストが発生しているようであれば、適切なアーキテクチャに改善し、コストを削減しましょう。そして削減できたコストは、価値を生む部分の投資にまわしてみてはいかがでしょうか。

以上!大阪オフィスの丸毛(@marumo1981)でした!