RDS の停止機能を使ってコストを半分まで削減してみた
Posted on
- #aws
先日、ついに発表された RDS の停止機能をさっそく試してみました。
- RDS インスタンスの起動 / 停止 - Developers.IO
- AWS Developer Forums: Amazon RDS Supports Stopping and Starting of Database Instances
RDS のコストが占める割合は大きいので、業務時間外にステージング環境や開発環境の RDS を停止することでコスト削減できそうです。
Single AZ の RDS インスタンスに限られるなどいくつか制限がありますが、これまでのスナップショットを取得して復元するのに比べれば大きな進化ですね!
The stop/start feature is available for database instances running in a Single-AZ deployment which are not part of a Read Replica (both source and replica) configuration.
特定のインスタンスだけ停止させる
今回はインスタンス識別子で環境の区別ができたので、AWS CLI の --query
オプションで抜き出してみます。
使うコマンドは aws rds describe-db-instances
と aws rds stop-db-instance
です。シェルスクリプトでサクッと書くならこんな感じです。
#!/bin/bash
aws rds describe-db-instances \
--query 'DBInstances[?contains(DBInstanceIdentifier,`staging`)].DBInstanceIdentifier' \
--output text | tr '\t' '\n' | while read db
do
echo "Stopping RDS: ${db}"
aws rds stop-db-instance --db-instance-identifier ${db}
done
起動するときは stop-db-instance
を start-db-instance
に置き換えるだけです。
コマンドの詳細は以下のドキュメントにまとまっています。
- describe-db-instances - AWS CLI 1.11.102 Command Reference
- stop-db-instance - AWS CLI 1.11.102 Command Reference
- start-db-instance - AWS CLI 1.11.102 Command Reference
どのくらいコスト削減できるのか?
ついでに、どのくらいコスト削減できるのか計算してみます。
1 週間のうち、土日と平日深夜から早朝(0 〜 8 時)に停止させると仮定すると、
- 削減時間は (24 時間 * 2 日) + (8 時間 * 5 日) = 88 時間
- 削減率は 88 時間 / (24 時間 * 7 日) = 0.5238 (52 %)
となり、RDS コストの半分を削減できます。停止している間もストレージやスナップショットには課金されますが、一番高くつくインスタンス料金が半分になるならやってみる価値はありますね。
まとめ
AWS を使い始めたころから不満に思っていたところが、ついに解消されました。ちょっとしたコードを書くだけで大幅にコスト削減できるので、ぜひ皆さんもお試しください。
各種 SDK にも API が追加されているので、Python で書いて Lambda と CloudWatch Events で定期的に実行させるのが良さそうです。