はじめに
RDSを開発用途でデプロイする場合、平日は開発用途で読み書きがかなり発生するとしても、土日祝日は利用が全くない(何なら休みに黙って使われないようにしておきたい)ということもあるでしょう。
いくつかのパターンで、何が最適なのか?を考えてみました。
パターン紹介
【パターン1】RDSで停止/起動を自動スケジューリング
考え方はシンプルです。使わないなら停止してしまえばよい、そういうことです。
というより、RDS、停止できるんですね。
特徴
- 停止中はDBのストレージ費用のみが計上され、DBインスタンスの費用が掛かりません。
- EC2を停止状態にしている...と同じイメージですね。
- 検証用途でシングルAZ(ap-northeast-1)、gp3を使用している場合、1GBあたり0.138USD掛かります。
- マルチAZ構成でも停止することができます。
- 停止状態は最大7日間までです。7日経過すると自動的に起動されます。
- 今回の目的に関して言うと、土日祝に停止したいだけであればシンプルにコスト最適化できそうです。
- ただし、GW/お盆/年末年始のような7日間よりも休みが連続する場合はこの方法をとることはできません。
- 停止はEventBridge Schedulerで実施するのが一般的と想像します。
デメリット
- RDSを停止することになるため、起動にどうしても時間がかかってしまいます。
- 自動起動を業務開始時間の数分/数時間前にトリガーしておくことで、デメリットを最小化することができそうです。
【パターン2】RDSで金曜にスナップショットを取得、月曜にDB再作成
いらないなら消してしまえの最終形態でしょう。
特徴
- 金曜のタイミングでスナップショットの取得とRDSの削除を行います。
- 正直それ以外のコメントができない...
デメリット
- スナップショットをとる性質上、ある時点で静止点を取る必要があります。
- 金曜中は時間いっぱい使って、その後静止点/バックアップを取るという方式になりそうです。
- 土日はストレージコストがかからない...と言っても、ストレージコストは月当たりの費用のため、実際のところ土日使わないことによるコストメリットはなかったりするようですね。
- DBインスタンスを再作成する=エンドポイント名が変わってしまうため、週明けに今週なんだっけ?と確認する必要があります。
- やりようによっては固定することができますが、手動で再設定は必要になります。
- DBの復元にもまあまあ時間がかかります。
【パターン3/4】RDS⇒Aurora Serverless v2にする
最小ACUを0に設定することで、利用がないタイミングはコストを0にすることができます。
考え方はRDSの自動停止/起動と同じですが、それをDBの機能として実現するか、外のサービスを組み合わせるかが違います。
特徴
- 常時起動のため、利用したいタイミングでいつでも利用が可能です。
- 平日の利用に関しても、今回は検証用途なのでスパイクに応じた自動スケールによるコスト最適化ができそうです。
- もちろん、ストレージに関しては土日も残り続けるため課金も継続されます。
デメリット
- RDSに比べ、Auroraは高可用性や自動スケーリングなどの機能が充実している分、平時のコストがまあまあかかります。
- トータルで運用費用を減らせる!という言い方もできますが、開発環境をターゲットに考えるとちょっと過剰な気もしますね。
- 現在RDSを使っている場合、一度Aurora Serverlessに移行する、というフローが発生します。
- また、本番環境はRDS、開発環境はAurora Serverlessという構成は、環境差異によるトラブルのリスクがあるため避けるべき構成です。
- そのため、本番環境もAuroraに移行する方がよいでしょう。
コスト計算
前提
- インスタンスクラス
- RDS:db.m5d.large
- Aurora Serverless:最小ACU0~、最大ACU4(db.m5d.large相当)
- ストレージ: 200GB
- 起動時間
- 平日: 22日 × 24時間 = 528時間(稼働)
- 土日: 8日 × 24時間 = 192時間(停止/最小稼働)
- リージョン: 東京(ap-northeast-1)
コスト比較
| パターン | 平日コスト (528h) |
休日コスト (192h) |
月額合計 (USD) |
月額合計 (円) |
パターン1 との差額 |
|---|---|---|---|---|---|
| パターン1 RDS 自動停止・起動スケジュール |
$153.65 | $0.00 | $181.25 | ¥27,188 | 基準 |
| パターン2 RDS スナップショット方式 |
$181.25 | $5.07 | $186.32 | ¥27,947 | +$5.07 (+2.8%) |
| パターン3 Aurora Serverless v2 (平日4ACU、週末0ACU) |
$340.80 | $0.00 | $340.80 | ¥51,120 | +$159.55 (+88.0%) |
| パターン4 Aurora Serverless v2 (平日2ACU、週末0ACU) |
$182.40 | $0.00 | $182.40 | ¥27,360 | +$1.15 (+0.6%) |
※ 1ドル = 150円で換算
詳細内訳
パターン1: RDS 自動停止・起動スケジュール
平日コスト:
- インスタンス料金: $0.291/時間 × 528時間 = $153.65
- 平日小計: $153.65
休日コスト:
- インスタンス料金: $0(停止中)
- 休日小計: $0.00
ストレージ料金(月額固定):
- $0.138/GB/月 × 200GB = $27.60
月額合計: $181.25
※ ストレージ料金は停止中も発生します
パターン2: RDS スナップショット方式
平日コスト:
- インスタンス料金: $0.291/時間 × 528時間 = $153.65
- ストレージ料金: $0.138/GB/月 × 200GB = $27.60
- 平日小計: $181.25
休日コスト:
- スナップショット保存料金: $0.095/GB/月 × 200GB × (8日/30日) = $5.07
- 休日小計: $5.07
月額合計: $186.31
※ 金曜夜にスナップショット作成→インスタンス削除、月曜朝にスナップショットから復元→スナップショット削除という運用を想定
パターン3: Aurora Serverless v2(平日4ACU、週末0ACU)
平日コスト:
- ACU料金: $0.15/ACU/時間 × 4ACU × 528時間 = $316.80
- ストレージ料金: $0.12/GB/月 × 200GB = $24.00
- 平日小計: $340.80
休日コスト:
- ACU料金: $0(0 ACU)
- ストレージ料金: $0(平日に含む)
- 休日小計: $0.00
月額合計: $340.80
パターン4: Aurora Serverless v2(平日2ACU、週末0ACU)
平日コスト:
- ACU料金: $0.15/ACU/時間 × 2ACU × 528時間 = $158.40
- ストレージ料金: $0.12/GB/月 × 200GB = $24.00
- 平日小計: $182.40
休日コスト:
- ACU料金: $0(0 ACU)
- ストレージ料金: $0(平日に含む)
- 休日小計: $0.00
月額合計: $182.40
料金単価(東京リージョン、2025年時点)
| 項目 | 単価 | 備考 |
|---|---|---|
| RDS db.m5d.large | $0.291/時間 | MySQL/PostgreSQL |
| RDS 汎用SSD (gp3) | $0.138/GB/月 | ストレージ |
| Aurora Serverless v2 ACU | $0.15/ACU/時間 | 2024年11月に25%値下げ |
| Aurora ストレージ | $0.12/GB/月 | ストレージ |
実現方法を検討
コスト等を鑑みると、ありえそうな選択肢としては、パターン1の自動停止/起動パターン、パターン4(パターン3も)のAurora Serverlessパターンが考えられそうです。
以下では、該当の2パターンをTerraformで実現させるためのコードを作成しています。
尚、本来はもう作成しているであろうRDSに対して、自動停止/起動を組み込む、あるいはAurora Serverlessに移行するという話ではありますが、基となるRDSが存在していない、、、という状態のため、VPCレイヤから各DBを作成するところまで含めています。
パターン1: RDS 自動停止・起動スケジュール
パターン4: Aurora Serverless v2(平日2ACU、週末0ACU)
おわりに
意外と方法はあるんだなぁ...という一方で、コストやデメリットを勘案すると実際にとりえる方法は、正直自動停止/起動しかなさそうですね。
一方で、Serverlessの特徴である負荷に応じたスケールを今回はほぼ加味していないため、開発でどれほどDBを使用するかによっては選択肢に入ってきそうです。