はじめに
今回、こちらの記事を参考に、RDS の一時停止機能について調査した内容をまとめました。
https://blog.serverworks.co.jp/tech/2019/06/26/stopdbinstance/
RDS の一時停止機能
RDS を夜間、休日に停止することで、コストの削減が可能です。
例えば、週5日 8:00-17:00 稼働し、業務時間外は停止する場合
・営業日における稼働時間は1日9時間
・休日は停止
・1ヶ月(31日)中、営業日は22日
とすると、
1ヶ月の稼働時間は、9 × 22 =198時間となり、744時間(1ヶ月)のうち、70%以上ランニングコストを削減できます。
RDS の一時停止について、AWS の公式ドキュメントには以下のように記載があります。
一時的なテストや毎日の開発作業のために、断続的に DB インスタンスを使用するとします。その場合は、コストを節約するために一時的に Amazon RDS DB インスタンスを停止できます。
テスト環境や開発環境における一時停止は推奨されていますが、本番環境について言及されていません。
RDSの一時停止機能はあくまでテスト環境、開発環境向けの機能なのでしょうか。
今回、AWSサポートに問合せてみました。
本番環境において停止機能の利用は可能
本番環境においても、RDSの一時停止機能は利用可能です。
しかし、以下のリスクがあります。
- DB インスタンスの停止と開始に想定以上の時間を要する
- DB インスタンスの容量の不足が発生し、DBインスタンスを起動できない
- InsufficientDBInstanceCapacity エラーによって、インスタンスを起動できない可能性がある
InsufficientDBInstanceCapacity エラー
InsufficientDBInstanceCapacity エラーについて、AWS 公式ドキュメントには以下のように記載しています。
InsufficientDBInstanceCapacity エラーは、DB インスタンスを作成、起動、変更を試行した際に返されます。また、DB スナップショットから DB インスタンスを復元する際に返されます。このエラーが返される場合、一般的な原因は、要求された可用性ゾーンで特定の DB インスタンスクラスが利用できないことです。次のいずれかの方法で、問題を解決できます。
InsufficientDBInstanceCapacity エラーは、利用中のAZにおいて、インスタンスを起動するためのキャパシティが枯渇していることが原因で起こります。
※ キャパシティ:クラウドベンダーで起動可能なサーバの総数
キャパシティは、t2.large、m5.xlargeなどインスタンスタイプごとにクラウドベンダーが確保していて、EC2やRDSを起動、再起動するたびに、仮想サーバが稼働する物理サーバが変わる仕様になっています。
この物理サーバを変えようとした際に、空きサーバがないことが原因で発生するのが、InsufficientDBInstanceCapacity エラーで、クラウドを利用するユーザには回避しようがない現象です。
t2 などAWSが確保しているサーバの台数が少ないものでよく発生します。
RDS には、EC2インスタンスにおけるキャパシティ予約のように、キャパシティを確保しておくオプションはRDSがないため、エラー自体を防ぐことはできません。
InsufficientDBInstanceCapacity エラーの解決策
InsufficientDBInstanceCapacity エラーには、以下のいずれかの対応が必要となる。
- キャパシティの状況が変化するまで、再度起動を試す。
- 別のインスタンスタイプで起動を試す。
- 別のAZにてスナップショットからインスタンスを作成する。
3 について、別のAZにてインスタンスをリストアするということは、DBを作り直すことと同じで、アプリケーションの変更が発生します。
本番環境において一時停止するorしない
以下の①、②におけるRDS の稼働コストと人による運用コストを比較、検討することをおすすめします。
① RDS に対して夜間、休日停止を導入したうえで、InsufficientDBInstanceCapacity エラーがまれに発生することを想定した運用保守体制を整えた場合
② RDS を24時間365日常時起動させる場合
※①における運用保守体制の例
・RDSをEC2の起動時間の2時間前に起動させる
・RDSが起動したら運用保守メンバーにメールが届くよう、CloudWatchとSNSを利用する
・RDSの起動要求後30分ほどで運用保守メンバーが保守を開始→ その時点でメールを受信していない場合は、InsufficientDBInstanceCapacity エラーが発生している可能性を考慮し、ポータルにて確認し、必要に応じて上記の保守業務を実施する。
あとがき
今回は、RDS は本番環境で一時停止できるのか?という質問に対して、サポートへ問い合わせたり、上司に聞いたりしたことをまとめてみました。