最近はダイエットにも熱が入り、順調に体重が減っているCI部の柿﨑です。
AWS監視について、CloudWatchを使って監視設定を行う機会がございましたので備忘録的に書きます。
今回とくに困ったのがRDSのストレージ使用率の監視となります。
CloudWatchの仕様
RDSのストレージ監視を行う場合は、以下のメトリクスを使用するのが一般的かと思われます。
- FreeStorageSpace
Amazon RDS のメトリクス
このメトリクスは単位がバイトとなっている点に注意が必要です。
ストレージ容量に対して80%以上の使用率を検知させる場合は、以下のような設定になってしまいます。
- RDSストレージ容量: 100 GB
- アラームの閾値: FreeStorageSpace <= 20 GB
ストレージ容量に変動がなければ上記の設定で問題ありませんが、ストレージの自動拡張機能が有効だと話が変わります。
先ほどの監視設定を例にしますと、ストレージ容量が200GBに拡張された場合、設定すべきアラームの閾値も40GBへと変動するためです。
ここがメトリクスの単位がバイトであることの注意点となります。
代替策
主な代替策は以下です。
- DataDogを使用する(当社ではほぼこれ)
- RDSの拡張モニタリングおよびメトリフィクスフィルターを使用する
- その他
今回は2番目の方法でやってみます。
やってみる
※今回はPostgreSQL且つシングルAZ構成のRDSを使いますので、ほかのDBMSやマルチAZ構成、Auroraは考慮いたしません。
RDSの拡張モニタリングを有効にする
RDSは適当に作ります。
ロググループを確認する
「RDSOSMetrics」というロググループが自動作成され、そちらにログが出力されます。
ログを確認する
それっぽいログを適当に開きます。
当該ロググループには各RDSのログが出力されますので、「instanceID」等を使用して目的のRDSをフィルターする必要があります。
少し下へスクロールしますと「fileSys[0]」の中に「mountPoint」や「usedPercent」を確認できます。
「mountPoint」の「/rdsdbdata」はRDSのデータ領域になり、「usedPercent」はデータ領域の使用率を表しています。
要するにこれを使えばいいということですね。
メトリクスフィルターを設定する
フィルターパターンは以下のように設定し、識別子でRDSを特定し且つデータ領域のログをフィルターするようにしてみました。
フィルターとパターンpsyntax構文
フィルターパターン: { ($.instanceID="database-1") && ($.fileSys[0].mountPoint="/rdsdbdata") }
メトリクス値ではデータ領域の使用率を指定してメトリクスへ渡します。
メトリクス値: $.fileSys[0].usedPercent
メトリフィクスフィルターの設定はざっくり以下のような感じにしました。
CloudWatch Alarmを設定する
以下のような設定にしてみました。
自動拡張する前にアラームが発生しますが、今回はあくまでも使用率の監視がメインなので一旦、忘れます。
動作チェック
RDSのストレージ容量を増やします。
どんどん増やして「usedPercent」が「92.14」になりました。
メトリクスを確認すると以下のような遷移をしていました。
赤線が使用率80%のラインで、それを超えてアラームも発生していました。
おまけ
以下のようにメモリも使用率による監視ができません。
- FreeableMemory
Amazon RDS のメトリクス
RDSから出力されるログを見てもパーセンテージによるメトリクスの取得はできなさそうです。
ただし、メモリについてはインスタンスタイプの変更により変動する値のため、そこまで困らないのではないかと考えております。
以上となります。