はじめに
不測の事態で、RDSのストレージサイズが知らない間に拡張されてしまい、毎月の請求が想定外の金額になってしまいました。※具体的な金額は伏せますが・・・
RDSの設定
RDS機能の「ストレージの自動スケーリング」が原因でした。
DBの容量が増えると、初期設定した ストレージ サイズを超えて自動的に拡張を行ってくれます。
なお、最大ストレージしきい値ががあり、指定したサイズを超えることはありません。
注意点として、RDSをAWSのコンソールから作成する際はデフォルト設定になっています。

今回、本設定により、サイズが一気に100GBから1000GBまで拡張されてしまいました。
原因
高額請求自体は、ストレージサイズの増加ですが、一気にサイズが100GBから1000GBに拡張された理由は自動スケーリングの仕様によるものでした。
調査したところ
残サイズが10%未満の状態が5分続くと、以下のパターンでサイズ増加することがわかりました。
①:5 GiB
②:現在割り当てられているストレージの 10%
③:直近 1 時間の FreeStorageSpace メトリクスの変動に基づいて予測される 7 時間のストレージの増分。
※①~③で一番大きい値で適用されます。詳細についてはこちらをご確認ください。
①や②は増えてもほぼ影響はないですが、③条件が適用されて一気に増加となりました。
③の具体的な条件は不明ですが、簡単に書くと
直近1時間で急激なストレージの容量を使用すると発生するようです。
事象発覚から2~3週間発生したこともあり、契機となったSQLは確認できませんでしたが、
当時の空き容量を確認したところ急激に増えて後で戻っていることから、
SELECT系の処理で一時表やUNDO領域を大幅に使ってしまったのではないかと推測しています。
※このSQLが確認できないのも問題ですので、後述で対策を入れています。
また、今回は該当しませんでしたが、
データバックアップやリストアをする際にも短期間で急激なストレージ容量の増加が予想されますので、実施時には注意が必要です。
DBのリカバリ
一番の問題は一度ストレージ容量を上げると元に戻せません。
今利用しているRDSインスタンスはやめて、別のRDSインスタンスを新しく立ち上げる必要性があります。
もちろんデータなども移行が必要になりますので結構な作業となります。
自動スケーリング自体は便利なのですが、
使用時には最大ストレージしきい値を大きくしすぎない設定にすることを強くお勧めします。
※弊社としては自動スケーリング自体使わないことになりました。
今後の対策
今回発生した事象で、まだ2点の問題が残っています。
① : 直接原因となったSQLが不明
② : 自動スケーリング(空き容量が減っていること)の気づきが遅れてしまった。
①に関しては「Performance Insights」を設定することで、原因となったSQLを判別します。
※ 「Performance Insights」 とは簡単にいうと問題のあるSQL等を可視化するための画面
元々設定は入れていたのですが、無料用だと7日間しか保持期間がなく、有料での2年保持に設定変更を行いました。

②に関しては空き容量のアラームを作成することで気づきを促します。
こちらも元々設定していたのですが、残10%で自動スケーリングするという仕様を知らず、残5%で設定しており、通知が出る前に自動スケーリングされてしまいました。
今回から残30%程度で設定しています。


