RDS の停止機能を使ってコストを半分まで削減してみた

Posted on

先日、ついに発表された RDS の停止機能をさっそく試してみました。

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-instancesaws 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-instancestart-db-instance に置き換えるだけです。

コマンドの詳細は以下のドキュメントにまとまっています。

どのくらいコスト削減できるのか?

ついでに、どのくらいコスト削減できるのか計算してみます。

1 週間のうち、土日と平日深夜から早朝(0 〜 8 時)に停止させると仮定すると、

  • 削減時間は (24 時間 * 2 日) + (8 時間 * 5 日) = 88 時間
  • 削減率は 88 時間 / (24 時間 * 7 日) = 0.5238 (52 %)

となり、RDS コストの半分を削減できます。停止している間もストレージやスナップショットには課金されますが、一番高くつくインスタンス料金が半分になるならやってみる価値はありますね。

まとめ

AWS を使い始めたころから不満に思っていたところが、ついに解消されました。ちょっとしたコードを書くだけで大幅にコスト削減できるので、ぜひ皆さんもお試しください。

各種 SDK にも API が追加されているので、Python で書いて Lambda と CloudWatch Events で定期的に実行させるのが良さそうです。

Popular Entries

Recent Entries