DEVELOPER’s BLOG
技術ブログ
通信をすべて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>ロール>ロールを作成」を選択し、信頼されたエンティティタイプで『カスタム信頼ポリシー』を選択して下記コードを記載します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "vpc-flow-logs.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
許可ポリシーは1で作成したポリシーを選択し、任意のロール名を付けてロールを作成します。
3. CloudWatch Logs ロググループの作成
VPCフローログのログを入れるためのロググループを作成します。
「CloudWatch>ロググループ>ロググループを作成」を選択し、任意のロググループ名を付けてロググループを作成します。
4. VPCフローログの作成
VPCフローログを作成するための準備が整いましたので、いよいよフローログを作成します。
VPCフローログ自体には料金は発生しませんが、CloudWatch Logs側でデータ取り込み料金が発生するため、今回のように一時的な利用の場合は通信先特定後にVPCフローログを削除することをおすすめします。
調査対象のNAT GatewayのVPCにチェックを入れ、アクションで『フローログを作成』を選択します。
任意のフローログ名を入力し、それぞれ下記を選択します。
- 送信先:CloudWatch Logsに送信
- 送信先ロググループ:3で作成したロググループ
- IAMロール:2で作成したロール
5. ログの分析
取得したログを分析してNAT Gatewayの通信先を特定します。今回は1週間分のログを分析します。
「CloudWatch>ログのインサイト」で4で作成したロググループを選択し、それぞれ下記クエリを実行します。
実行クエリ
①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エンドポイント(Gatewayタイプ)を利用すると、EC2↔S3間のデータ通信コストは発生しません。
利用料金およびデータ通信料金が無料となるGatewayタイプのVPCエンドポイントが利用できるのはS3、DynamoDBのみですが、Interfaceタイプの場合も、利用料金が0.014USD/時間、データ通信料金が0.01USD/GB(※処理されるデータが1PB/月未満の場合)のため、NAT Gatewayを利用する場合と比べてかなりのコストが削減できます。
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では、お客様の環境、状況に合わせたコスト適正化を進めていきます。
参考
- https://aws.amazon.com/jp/privatelink/pricing/
- https://aws.amazon.com/jp/vpc/pricing/
- https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints-s3.html
- https://dev.classmethod.jp/articles/reduce-unnecessary-costs-for-nat-gateway/
- https://blog.jicoman.info/2021/05/how-to-analyze-cost-of-nat-gateway-using-vpc-flowlogs/