DEVELOPER’s BLOG

技術ブログ

通信をすべてNAT Gatewayを通していませんか?棚卸しによる70%のコスト削減に成功!

2023.09.25 伊藤 美得理
AWS SRE 利用事例
通信をすべてNAT Gatewayを通していませんか?棚卸しによる70%のコスト削減に成功!

目次

  • 背景
  • 原因究明
  • 解決策
  • 結果


背景

 AUCでは、SRE活動の一環として、AWSコストの適正化を行っています。
(技術ブログ『SRE:コスト抑制のための異常値検知機構の実装』)
コスト適正化における課題は、大きく分けて下記の4つです。

①コストは月末にチェックしており、月中でコストが急激に上昇した場合発見が遅れてしまう。
② 不要なリソースが放置されていたり、新たなリリースによって生じたコストを確認していない。
③ AWSが提供するベストプラクティスによるコスト適正化が行われていない。
④ コストに対する意識が薄い。

今回のブログでは、『③ AWSが提供するベストプラクティスによるコスト適正化が行われていない。』により発生していたコスト増加について行った、原因調査〜コスト削減までを記録します。

 対象となるサービスはNAT Gatewayです。直近1年間のコスト推移調査の結果、NAT Gatewayのコストが1年で約64%増加していることを検知しました。
NAT Gatewayの料金は時間単位料金とデータ処理料金の2つあります。

  • 時間単位料金:NAT Gatewayの利用時間に対して0.062USD/時 ※
  • データ処理料金:NAT Gatewayで処理されたデータ量に対して0.062USD/GB ※
    ※東京リージョンの場合(Amazon VPCの料金より)

NAT Gateway作成後、時間単位料金は一定のため、データ処理料金が増加しているであろうことが予測できます。
NAT Gatewayの通信先を特定し、NAT Gatewayを通す必要がないデータを通してしまっていないか調査します。


原因調査

 VPCフローログを使用し、取得したログをCloudWatch Logs Insightで分析することでNAT Gatewayの通信先を特定します。

1. IAMポリシーの作成

 VPCフローログを作成する前に、VPCフローログがCloudWatch LogsにアクセスできるようにIAMポリシーを作成します。 「IAM>ポリシー>ポリシーを作成」を選択し、JSONに下記コードを記載、任意のポリシー名を付けてポリシーを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": "*"
    }
  ]
}   


2. IAMロールの作成

 1で作成したIAMポリシーをVPCフローログにアタッチするためのロールを作成します。
「IAM>ロール>ロールを作成」を選択し、信頼されたエンティティタイプで『カスタム信頼ポリシー』を選択して下記コードを記載します。

スクリーンショット 2023-08-16 14.43.37.png

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
} 


許可ポリシーは1で作成したポリシーを選択し、任意のロール名を付けてロールを作成します。 スクリーンショット 2023-08-16 14.44.32.png

3. CloudWatch Logs ロググループの作成

 VPCフローログのログを入れるためのロググループを作成します。
「CloudWatch>ロググループ>ロググループを作成」を選択し、任意のロググループ名を付けてロググループを作成します。

4. VPCフローログの作成

 VPCフローログを作成するための準備が整いましたので、いよいよフローログを作成します。
VPCフローログ自体には料金は発生しませんが、CloudWatch Logs側でデータ取り込み料金が発生するため、今回のように一時的な利用の場合は通信先特定後にVPCフローログを削除することをおすすめします。

調査対象のNAT GatewayのVPCにチェックを入れ、アクションで『フローログを作成』を選択します。 スクリーンショット 2023-08-16 14.29.46.png

任意のフローログ名を入力し、それぞれ下記を選択します。

  • 送信先:CloudWatch Logsに送信
  • 送信先ロググループ:3で作成したロググループ
  • IAMロール:2で作成したロール

スクリーンショット 2023-08-16 14.32.55.png スクリーンショット 2023-08-16 15.00.51.png



5. ログの分析

 取得したログを分析してNAT Gatewayの通信先を特定します。今回は1週間分のログを分析します。
「CloudWatch>ログのインサイト」で4で作成したロググループを選択し、それぞれ下記クエリを実行します。 スクリーンショット 2023-08-17 16.46.57.png

実行クエリ

①NAT Gatewayからインターネットへの通信

  • 送信元IP/CIDR
    • 'X.X.X.X':対象NAT Gatewayのプライマリプライベート IPv4 アドレスを指定
  • 除外する宛先IP/CIDR
    • 'Y.Y.Y.Y/YY':対象VPCのCIDRを除外。複数CIDRがある場合はand not isIpv4InSubnet〜を繋げる

filter (srcAddr like 'X.X.X.X') and not isIpv4InSubnet(dstAddr, 'Y.Y.Y.Y/YY')
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc


②インターネットからNAT Gatewayへの通信

  • 宛先IP/CIDR
    • 'X.X.X.X':対象NAT Gatewayのプライマリプライベート IPv4 アドレスを指定
  • 除外する送信元IP/CIDR
    • 'Y.Y.Y.Y/YY':対象VPCのCIDRを除外。複数CIDRがある場合はand not isIpv4InSubnet〜を繋げる

filter (dstAddr like 'X.X.X.X') and not isIpv4InSubnet(srdAddr, 'Y.Y.Y.Y/YY')
| stats sum(bytes) as bytesTransferred by dstAddr, srcAddr
| sort bytesTransferred desc


 上記クエリ実行により、データ通信量(bytesTransferred)の多い順で通信先IPアドレスの一覧が得られます。 IPアドレスの一覧をプレフィックスリストと照らし合わせたところ、①、②ともにNAT Gatewayの通信先のほとんどがS3であることが分かりました。

解決策

 先述の通り、NAT Gatewayを利用してEC2↔S3間のデータ通信を行う場合、NAT Gatewayの利用料金とデータ通信料金の2つのコストが発生します。 ブログ_VPCエンドポイント.drawio.png

しかし、VPCエンドポイント(Gatewayタイプ)を利用すると、EC2↔S3間のデータ通信コストは発生しません。
利用料金およびデータ通信料金が無料となるGatewayタイプのVPCエンドポイントが利用できるのはS3、DynamoDBのみですが、Interfaceタイプの場合も、利用料金が0.014USD/時間、データ通信料金が0.01USD/GB(※処理されるデータが1PB/月未満の場合)のため、NAT Gatewayを利用する場合と比べてかなりのコストが削減できます。 ブログ_VPCエンドポイント.drawio (1).png

S3のVPCエンドポイント(Gatewayタイプ)利用時の注意点

 VPCエンドポイント(Gatewayタイプ)を利用して、S3との通信を行う場合、注意点が2つあります。

VPCエンドポイント設定時の通信遮断

 NAT Gateway経由で接続しているS3をVPCエンドポイント(Gatewayタイプ)経由に変更する際、S3の通信は経路変更のため遮断されます。そのため、設定変更はユーザー影響が少ない時間帯に行う必要があります。

S3のバケットポリシーとVPCのエンドポイントポリシー

 S3のバケットポリシーをEIPで制御している場合は、VPC内部のPrivate IPでの制御に変更する必要があります。VPCエンドポイントを経由してS3にアクセスする場合、通信先はVPC内部のPrivate IPになるため、EIPで制御しているとVPCエンドポイントを設定しても、S3にアクセスすることができません。同様に、VPCのエンドポイントポリシーで特定のバケットへのアクセスのみを許可している場合、S3にアクセスできなくなるため、許可リストに対象のバケットを追加するなどの対応が必要になります。

結果

 EC2↔S3の通信をNAT Gateway経由ではなく、VPCエンドポイント経由としたことで、対象NAT Gatewayのコストを約70%削減することができました。

 今回はNAT Gatewayについて、コスト適正化事例をご紹介しました。
AUCでは、お客様の環境、状況に合わせたコスト適正化を進めていきます。

参考

関連記事

生成AIで架空飲食チェーン店のVOC分析やってみた

ご挨拶 AWS全冠エンジニアの小澤です。 今年の目標はテニスで初中級の草トーナメントに優勝することです。よろしくお願いいたします。 本記事の目的 本記事では、生成AIでVOC分析を行うことで得られた知見を共有したいと思います。 昨今、生成AIの登場など機械学習の進歩は目覚ましいものがあります。一方、足元では自社データの利活用が進まず、世の中のトレンドと乖離していくことに課題感を持たれている方も多いかと思います。また、ガートナーの調査(2024年1月)による

記事詳細
生成AIで架空飲食チェーン店のVOC分析やってみた
AWS SRE 機械学習
CircleCIでdocker-composeを使ってテストからAWS ECSへのデプロイまでやってみた

目次 挨拶 CI/CD導入の背景 前提 プロジェクト構成 ディレクトリ構成 .circleci/config.yml 全体の流れ 試行錯誤したところ 今後の展開 挨拶 CircleCIでdocker-composeを使ってテストからAWS ECSへのデプロイまでを自動化してみたので紹介します。 CI/CD導入の背景 参加しているプロジェクトではアジャイルを取り入れ、毎月リリースするようになりました。 毎月リリースがあるということは、それだけ機能改修、追加、

記事詳細
CircleCIでdocker-composeを使ってテストからAWS ECSへのデプロイまでやってみた
AWS CI/CD SRE
Amazon Connectを使って占い案内IVRをつくってみた

目次 挨拶 Amazon Connectとは? 目的と経緯 仕様 作業手順 作業内容 最後に 挨拶 こんにちは、システム部の長森です。 皆様は 自動音声応答システム(IVR) を利用したことはありますか? IVRとは Interactive Voice Response の略で、架電時に音声が流れ、番号をプッシュすると適切なオペレーターまたは次の音声に繋がるシステムのことを指します。 企業への電話問い合わせ、商品の電話注文などによく使われているシステムなの

記事詳細
Amazon Connectを使って占い案内IVRをつくってみた
AWS 体験記
SRE:コスト抑制のための異常値検知機構の実装

目次 実装前の課題 採用した技術と理由 実装した内容の紹介 改善したこと(抑制できたコスト) 実装前の課題  SRE(Site Reliability Engineering:サイト信頼性エンジニアリング)とは、Googleが提唱したシステム管理とサービス運用に対するアプローチです。システムの信頼性に焦点を置き、企業が保有する全てのシステムの管理、問題解決、運用タスクの自動化を行います。 弊社では2021年2月からSRE活動を行っており、セキュリ

記事詳細
SRE:コスト抑制のための異常値検知機構の実装
AWS SRE 利用事例

お問い合わせはこちらから