🐁

RDSのストレージ選択に気を付けよう

2021/08/02に公開

背景

会社のAWSの利用明細を確認すると先々月からRDSの利用費が徐々に上がっていることに気が付きました。
新規にRDSを作成しているとはいえ、いくら何でも高騰し過ぎだったので、調査してみるとAWSの思わぬデフォルト設定で費用が余計にかかっていましたので、どんなことがあったのかここに記すことにしました。

RDSの料金体系

本題に入る前にまずRDSの料金体系のおさらいです。
RDSの料金はRDSを動かすDBインスタンスとそれに付随するストレージの容量で料金が決まります。

  • RDSタイプ
    • RDS for MySQL
  • DBインスタンスストレージ
    • db.t3.medium
  • ストレージ
    • 汎用ストレージ100GiB
一か月利用した場合[1]

$0.104 * 730h + $0.138 * 100GiB = $89.72

ある程度単純化しましたが、オンデマンドで1か月利用した場合、db.t3.mediumでストレージ容量を20GiBにするとこれくらいの金額になります。
ここで注意したいのがストレージの料金体系です。

ストレージの料金について

RDSで選択できるストレージの種類ですが、以下3種類あります。

  • 汎用(SSD)ストレージ
  • プロビジョンドIOPS(SSD)ストレージ
  • マグネティックストレージ

マグネティックストレージは下位互換サポートのため用意されており、新規にストレージを用意する場合は実質汎用ストレージかプロビジョンドストレージの2択になります。
汎用ストレージは名前の通り、さまざまなユースケースで対応でき料金も先ほど記載したストレージの容量に応じて課金額が決まります。

プロビジョンドIOPSですが、高速のI/O性能を要求される大規模サービスに向いたストレージサービスです。チケット予約システムや金融機関の入出金処理など大量の読み書きかつ低レイテンシーを実現させたいときに利用されるストレージタイプです。
このストレージはストレージのサイズに加えてプロビジョニングしたIOPSに応じて課金されます。

プロビジョンドIOPSストレージの料金表[1:1]
ストレージ料金 $0.15/GB
プロビジョンドIOPS料金 $0.12/IOPS

同じインスタンスタイプ、同じストレージサイズで1か月の課金を比較してみると以下のようになります。
またプロビジョンドIOPSはデフォルト設定では1000が設定されていますので1000で計算します。

$0.104 * 730h + $0.15 * 100GiB + $0.12 * 1000IOPS = $210.92
汎用ストレージの時と比較すると倍以上の値段に差があり、ストレージの料金だけをみれば10倍近い差となります。

会社のAWSの利用費が高騰した理由ですが、新規でRDSを作成したときに汎用ストレージではなく、プロビジョンドIOPSを使用していることが原因でした。
開発チームに確認したところプロビジョンドIOPSを意図的に設定したわけではなく、CloudWatchでWriteIOPSReadIOPSの値を確認しても高い数値を出していないことからなぜプロビジョンドIOPSをストレージに選択したのか調べてみました。
そして開発環境と本番環境のデフォルトパラメータに落とし穴があることがわかりました。

開発環境と本番環境のデフォルト設定

RDSのコンソール画面から新規にRDSを作成する際、AWSでは開発用か本番用のテンプレートを選ぶことができます。
この時、開発/テストのテンプレートをチェックすると後のストレージにデフォルトで汎用ストレージが選択されます。

一方で、本番稼働用のテンプレートをチェックすると後のストレージにデフォルトでプロビジョンドIOPSが選択されます。

普段の開発環境と同じ感覚で本番環境用のRDSを作成すると、このストレージの変更に気が付かずそのままRDSを作成してしまうということがわかりました。
確かに本番環境では大量のI/Oを裁くために、プロビジョンドIOPSを選択したほうがいいケースがあります。
ですが、汎用ストレージでもIOPSの性能は高くストレージの容量を増やせばIOPSの数値も増やすことができます。

汎用ストレージのIOPS
  • 1GiBあたり3IOPS
  • 最低100IOPSを保証

仮にストレージの容量を100GiBにしておけば、300IOPSとなりそれなりのスペックを出せます。

暫定対応

RDSのストレージは作成したあとでも変更は可能ですが、変更中はDB接続に若干の接続不良が出るということから開発チームと相談して定期メンテナンスの時や定時後にストレージの変更を実施しました。

今後の課題

開発チームに本番環境のRDSを作成する際、ストレージタイプを汎用ストレージに変更して作成してもらうようお願いしています。
ただ、人手を介した運用ですのでオペミスが発生する可能性が高いのでいずれ仕組化してミスを発生させないようにしたいです。
CloudFormationでRDSの作成をコード化できればミスが減ると思いますので、テンプレートファイルが完成するまでは上記の運用でお願いして、時期がきたらコード化して運用するようにします。

参考文献

https://aws.amazon.com/jp/rds/mysql/pricing/
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Storage.html

脚注
  1. 東京リージョンかつシングルAZを想定 ↩︎ ↩︎

GitHubで編集を提案

Discussion