はじめに
ある月、AWS(Amazon Web Services)のコストが想定より大きく増えていることに気づきました。
調査したところ、原因は Aurora のコスト増加でした。
さらに内訳を見ていくと、
あるインスタンスでAurora Storage I/Oが1か月約40億リクエスト発生し、それだけで約1000USDかかっている という状態でした。
この記事では、
- 何が起きていたのか
- なぜStorage I/Oが爆発したのか
- どう解決したか(しなかった選択肢も含めて)
を、実際の業務事例としてまとめます。
何が起きていたか
AWSのコストをサービス別に確認したところ、
- Auroraのコストが異常に高い
- 特に Storage I/O の割合が大きい
という状況でした。
Auroraの課金内訳を確認すると、
Storage I/O が約40億リクエスト / 月 発生しており、
それだけで 約1000USD を消費していました。
環境構成
問題が起きていた構成は次の通りです。
-
本番環境
- Aurora
- インスタンスタイプ:
r5.2xlarge - メモリが十分にある構成
-
開発環境
- 本番DBからスナップショットを取得
- 個人情報などをマスキング
- マスキング後のDBを開発環境で利用
- インスタンスタイプ:
t4g.medium(最小構成)
「開発環境だから一番安いインスタンスでいいだろう」
という判断をしていました。
なぜStorage I/Oが爆発したのか
原因は Auroraのバッファキャッシュとメモリ量の関係でした。
Auroraでは、
- DBインスタンスのメモリの 最大75%程度 が
- バッファキャッシュとして利用されます
本番では r系のメモリ最適化タイプ を使っていたため、
十分なメモリ量があり、
多くのデータがメモリ上にキャッシュされていました。
一方 開発環境では、t系のバーストタイプを使っていたため、
メモリが非常に少なく、キャッシュに載りきらないデータが大量に存在しました
結果として、
- キャッシュミスが頻発
- ストレージへの読み取りが大量発生
- Storage I/O リクエストが爆発
という状態になっていました。
取り得た解決策
今回、考えられる選択肢は大きく2つありました。
選択肢① データ量を減らす
- 開発環境で本番相当の全データは不要
- 必要な期間・件数までデータを削減
- キャッシュに収まるサイズにする
メリット
- 追加コストなし
- Auroraの課金モデルを変えなくてよい
デメリット
- データ調整の手間が増える
選択肢② Aurora I/O-Optimized(Storage I/O Optimized)を使う
Auroraには
Aurora I/O-Optimized(Aurora Storage I/O Optimized)
という課金モデルがあります。
これは、
- Storage I/O の課金をなくす代わりに
- インスタンス料金が高くなる
というモデルです。
メリット
- Storage I/O を気にしなくてよい
- 大量I/Oでもコストが安定する
- ステージングなど本番相当のデータ量が必要で、小さめのインスタンスを選びたい場合に効果が出やすい
デメリット
- 開発環境用途としては割高
- 根本的なデータサイズ問題は残る
実際に取った対応
今回は、
👉 開発環境のデータ量を減らす
という対応を選択しました。
理由は、
- 不要データの削除により根本解決ができる
- Aurora I/O-Optimizedにした場合追加コストがかかる
ためです。
データ量を削減した結果、
- キャッシュヒット率が改善
- Storage I/O が激減
- Auroraの月額コストも大きく下がりました
学び
今回の件で得た学びは以下です。
- Auroraのコストは Storage I/O を必ず見る
- インスタンスタイプのメモリ量は性能だけでなくコストにも直結する
- DBの仕組みを正しく理解するべき...(DB知識が浅かった)
- 課金モデル(Standard / I/O-Optimized)は理解して選ぶべき
まとめ
Auroraは便利で強力なサービスですが、
内部の挙動と課金ポイントを理解していないと静かにコストが爆発します。
- Storage I/O が何を意味しているか
- キャッシュとメモリの関係
- 環境ごとのデータ量の適切さ
これらを意識するだけで、
同じ事故はかなり防げると思います。
同じように
「Auroraのコストが高いけど理由がわからない」
という人の参考になれば幸いです。
参照したインターネットソース
-
Amazon Aurora 料金(Amazon Aurora Pricing)
https://aws.amazon.com/jp/rds/aurora/pricing/ -
Aurora I/O-Optimized 概要(Amazon Aurora I/O-Optimized)
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-iopt-overview.html -
Aurora ストレージとキャッシュ(Aurora Storage and Buffer Cache)
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Performance.html