ちりつもは正義!3プロダクトのAWS環境を見直すことで、年間数百万円のコスト削減

こんにちは、広告事業本部でクライアントの受発注システムを担当しているリードアプリケーションエンジニアの花田です。
子供が2歳になりアンパンマンに夢中なのはいいのですが、アンパンマンを観せないと泣き始めるので大変。アンパンマン恐るべし。
あとばいきんまんは技術者として天才ですよね。努力の方向性は違うと思いますが。

今回は3プロダクトのAWS環境を中心にコスト見直しを行いました。
まだ対策をすべて実施しているわけではありませんが、計画通りに進めば年間で数百万円のコストを削減できる見込みです。

はじめに

複数のプロダクトを運用している私たちのチームでは、OSやフレームワークの更新は継続してきましたが、コストについては本格的な見直しをこれまで実施していませんでした。

対象となるのは、AWS上で管理されている3つのプロダクトです。これらのプロダクトは、サーバー構成が似ているため、効率的にコストを見直すことができると考えています。 AWSアカウントは、プロダクトごとにdevelopment、staging、productionの環境で分かれているものもあれば、1つのアカウントで運用しているものもあります。

現在ある程度の調査は終えていますが、まだ実施できていない部分もあるため一部は想定に基づいた話になります。

コスト可視化するには?

AWSサービスが便利

AWSにはコスト可視化を手助けしてくれるサービスとして「Cost Explorer」「Trusted Advisor」「Compute Optimizer」がありコスト分析できます。

サービス名 説明
Cost Explorer AWSのコストと使用状況を可視化し、トレンド分析や予算管理を行うためのサービス
Trusted Advisor AWSのリソースを最適化し、コスト削減、セキュリティ強化、パフォーマンス向上などのベストプラクティスを提案するサービス
Compute Optimizer EC2インスタンスやAuto Scalingグループのリソース使用状況を分析し、コスト削減やパフォーマンス向上のための最適なリソースの提案を行うサービス

まずは上記サービスを利用してコスト可視化を行うのがおすすめです。

3プロダクトのコストを詳細に可視化してみる

AWSのコストをより詳細に可視化したかったため、上記3サービスに加えて「Billing and Cost Managementの請求書」からコスト可視化を行いました。

コストの可視化方法として、3つのプロダクトに対して「請求書」の項目をすべてスプレッドシートに記載しました。
またAWS以外の外部サービス(Datadogなど)を含めて、チーム内のすべてのコストをスプレッドシートにまとめています。

スプレッドシートには、対象月に発生したコストを示す「月コスト」と、コスト削減後のコストを示す「想定コスト」があります。
「月コスト」を合算することで、現状のチーム全体のコストがわかり、「想定コスト」を合算することで、月のコスト削減額を簡単に把握でき便利です。
またコストの可視化だけではなくメンバーにタスク展開できるようにしているので簡易的な進捗管理として活用しています。

スプレッドシートで3プロダクトを一括管理することで以下のメリットを感じました。

  • 比較の容易さ : 同じ項目のコストが比較しやすくなり、例えばAプロダクトが5ドルなのに対し、Bプロダクトでは20ドルかかっていることが一目でわかります。

  • 疑問点の気づき : Aプロダクトで特定のサービス料金が発生している一方、Bプロダクトでは発生していない理由について疑問が生まれ、コストの見直しにつながります。

  • ソート機能の活用 : プロダクトを跨いだスプレッドシートのソート機能を使用することで、どのサービスにコストがかかっているかが明確になります。

  • 想定外のコスト : 想定外のコストが発生していないかを確認しやすくなります。

同じようなAWS構成のプロダクトだからこそ一括管理の旨味があるように感じます。

3プロダクトの月合計コストランキング

合計コストは過去1か月分を対象に、各プロダクトのdevelopment、staging、productionの合算値です。
※ RDS、EC2、ElastiCacheはリザーブドインスタンスを購入しているので正しい数値でない可能性があります。

ランキング 項目 コスト (ドル)
1 RDS(Aurora / MySQL) 約 $1400
2 EC2 約 $800
3 NatGateway / VPCエンドポイント 約 $750
4 Datadog(外部サービス) 約 $420
5 ElastiCache 約 $300

やはりRDS、EC2、 NatGateway / VPCエンドポイントが高いのがわかります。
意外とDatadogのコストが高いことが知れて、良い気付きとなりました。

ランキング別コスト削減方法を考えてみる

第1位. RDS(Aurora / MySQL)

コストが一番高いRDSですが、極端なコスト削減は難しいリソースだと思っています。
例えば、productionで利用しているインスタンスタイプをT系に変更すれば大幅にコスト削減ができるのですが、接続数の問題もありR系にしています。
参考URL:Aurora MySQL DB インスタンスへの最大接続数

また一部プロダクトでは、ストレージ利用量が少なく高パフォーマンスを求めていないため、AuroraからRDS for MySQLに変更することでコスト削減が可能です。
ただしリザーブドインスタンスの契約期間が残っているため、期限が切れるまで待ち、適切な時期に変更するつもりです。

RDSは自動停止しよう

またRDSは停止していても7日間で起動してしまうので、development / stagingを自動で停止する仕組みを取り入れています。

環境 サービス 時間 補足
development AWS Step Functions + EventBridge 毎日23時停止 開発中のRDS停止漏れ防止
staging AWS Step Functions + EventBridge 毎日8時起動、0時停止 ユーザーが利用しない時間のみ停止

RDSの停止はLambda等でも代替できるのですが、AWS Step Functionsの方が視覚的に分かりやすくコード管理がないため利用しています。
実際は土日も利用しないので、土日の間も停止できれば更にコスト削減が可能で、まだまだ改善の余地はありそうです。

どのぐらい削減できるの?

RDSの停止は導入済みなため、Aurora → RDS for MySQL変更で2割ほど削減できる見込みです。

第2位. EC2

EC2も台数が多いのでコストが発生しやすいリソースです。
EC2は「Trusted Advisor」「Compute Optimizer」を利用することで現状のインスタンス状況は把握できます。
しかし実際のメトリクスを元に総合的に判断したいと思っていたので、3プロダクト全てのインスタンスを対象にメトリクスをまとめることにしました。

インスタンス状態をスプレッドシートにまとめる

上記のようにスプレッドシートで各インスタンスをまとめました。
インスタンスタイプはT系を利用しているので「CPU使用率」「CPUクレジット残高」「ディスク容量」「メモリ利用率」「ネットワーク送受信量」のメトリクスをスプレッドシートに追加しています。

WEBやJOBはCPU利用率が低くCPUクレジット残高も安定していたため、インスタンスタイプを「medium」→「small」に変更できました。

BATCHに関してはCPUクレジットの消費が多いことが分かったのですが、バッチジョブ停止時にCPUクレジット消費量よりCPUクレジット回復量が上回っていため、現状のインスタンスが適切と判断しました。
しかしCPUクレジット回復量が下回るといずれバーストするため、バッチジョブ実行間隔を調整することで対応しました。
※ちなみにEC2を停止してしまうとCPUクレジットが回復しないので要注意です!

またインスタンスによってはディスク容量が徐々に増加していることに気づきました。
こうした副産物があるので詳細に調査する利点はあると思います。

一部スポットインスタンスへ変更してみる

EC2の中には社内向けに提供しているRedashがあります。
インスタンスタイプの変更を考えたのですが、「現状最低限のタイプであること」と「arm非対応でarm移行でのコスト削減も見込めない」ため、「EC2 スポットインスタンス」で対応することにしました。
スポットインスタンスの魅力は、通常のEC2と比べると6割ほどコスト削減が見込めるところにあります。
しかしデメリットとしてAWSの都合でインスタンスが「停止or休止」になるのでクライアントに提供しているプロダクトでは利用できません。
参考URL:スポットインスタンスの中断の動作

EC2は自動停止しよう

RDS同様EC2でもAWS Step Functionsを利用して自動停止しています。
※ RDSと同じ時間帯です。

例) インスタンス起動処理

詳細は、AWS Step Functionsを使ったステージング自動起動と自動停止!に記載していますので、気になる方は確認してみてください。

どのぐらい削減できるの?

インスタンスタイプの変更やスポットインスタンス移行に加えて、各インスタンスをarmに移行したことで、5割ほどほど削減できる見込みです。

第3位. NatGateway / VPCエンドポイント

IPv6対応でNatGatewayを削除?

NatGatewayは設定しているだけでコストが発生するので、まず最初にNatGatewayを削除できないか調査しました。
「IPv6 + Egress-Only Internet Gateway」を用いることでNatGatewayを削除できそうでしたが、利用中の外部サービスがIPv6対応できないため断念しました。
参考URL:Egress-Onlyインターネットゲートウェイを使用した場合にNATが行われないことを確認してみた

想定外のVPCエンドポイントコスト

次に着目したのがVPCエンドポイントです。
VPCエンドポイントはNatGatewayよりも利用料金が安く設定されています。
一部のプロダクトではVPCエンドポイントを利用しているのですが、コストを見直したところVPCエンドポイントを削除してNatGatewayだけにしたほうがコスト削減できることがわかりました。
コスト削減できるかは処理データの通信量によって変わってきます。

  • 通信量が多い場合 : NatGateway + VPCのエンドポイント構成がお得

  • 通信量が少ない場合 : VPCエンドポイントの個数分固定費が発生するため、NatGateway構成がお得

参考URL:VPCエンドポイントとNAT Gatewayの比較

どのぐらい削減できるの?

3プロダクトとも通信量は多くないため、今後はVPCエンドポイントをやめてNatGateway構成にする予定です。
そうすることで全体の4割ほどコスト削減ができる見込みです。

第4位. Datadog

想像より大幅にコストが発生していたのがDatadogでした。
Datadogは外形監視とSLO(Service Level Objective)の測定のために利用しています。
ただコストが高いので、以下のサービスに代替可能か検討しています。

目的 使用サービス 説明
外形監視 CloudWatch Synthetics Canary アプリケーションのエンドポイントを定期的にチェックし、正常に動作しているかを確認するためのツール。
SLO測定 CloudWatchダッシュボード AWSリソースやアプリケーションのメトリクスを可視化し、監視するためのカスタマイズ可能なインターフェースです。

SLO測定に関してはjobの成功率の測定や外部サービス連携の成功率の測定など複雑なことを行っていないため、CloudWatchダッシュボードで代用できると考えています。
より詳細なSLO測定する場合は、CloudWatch Application Signalsが良いみたいです。

どのぐらい削除できるの?

もし代替えできれば、7~9割ほどコスト削減ができる見込みです。

第5位. ElastiCache

最後はElastiCacheです。
ただElastiCacheに関しては、AWSが提供しているvalkeyに変更することでコスト削減を容易に行えます。

お手軽valkey

valkeyはRedisと遜色ないパフォーマンスを持っておりコストもRedisより安く設定されています。
参考URL:Amazon ElastiCache for Valkeyの開始方法

またvalkeyにアップグレードする方法は簡単でAWSコンソール上から行えます。
Redisに溜まっているsessionが消えずエンドポイントも変わらないため、アプリケーション側のコード修正が不要でとてもお手軽です。
※ダウンタイムはほとんど無いのですが、アップグレードの際に瞬断はありました。

どのぐらい削除できるの?

Redisからvalkeyに変更するだけで3割ほどコスト削減ができる見込みです。

番外編

思い切ってdevelopment環境を削除

AWSアカウントが各environmentで分かれており、開発頻度の少ないプロダクトだったためdevelopment環境を削除することにしました。
ただ開発はあるのでstaging環境のAWSアカウントにdevelopment用の環境を整えようと考えています。
production環境に影響はないですし、stagingのNatGateway / VPCエンドポイントが利用できるのでその分コスト削減ができます。
その他にもサポートプランやアカウント毎の細かなコストも発生しないため、月に約$300ほど 削減できる見込みです。

不要なリソースは削除しよう

不要なAWSサービス、不要なEBS、不要なCloudWatchロググループなどを削除した結果、月に約$60ほど 削減できました。

結局どのぐらい削減できそうなの?

全て実行すると月の合計コストが約$5400から約$3800ほどになる見込みです。
1ドル150円計算で、(5400 - 3800) * 150 * 12 = 年2,880,000円削減できる計算です。

今後のコスト見直し

今回の作業で詳細にコスト可視化を行ったため基本的には「Cost Explorer」「Trusted Advisor」「Compute Optimizer」で対応する予定です。
新しいプロダクトや外部サービスが増えた場合は、また詳細なコスト可視化を行おうと考えています。
その際はAWS Well-Architected コスト最適化 の観点を持ちつつ実行するつもりです。

頻度 詳細
隔週 Cost Explorerを利用して過去3か月分の各サービスを比較してコスト増減がないかチェック
年1回 Trusted Advisor、Compute Optimizerを利用してコスト調査。必要に応じてスプレッドシートで詳細分析

また将来的にはAmazon Bedrockaws-cost-explorer-mcp-serverを利用して、AIがコスト分析を提案してくれると、非常に便利だと思います。

最後に

今回は現状の構成を維持しながらコスト削減を実施しましたが、今後はBATCHやJOBインスタンスを別のAWSサービスに置き換えるなど、大きな変更を伴うコスト削減を検討しています。