RDSのディスク、メモリ使用量を%で表示する

こんにちは。クラウドソリューション事業部の和田です。
EC2を始め、RDSやその他様々なAWSサービスを利用する時、多くの場合各種リソースについてAmazon CloudWatchを利用して監視を行うかと思います。
その時毎回思うこと、それは…
RDSのディスクとメモリ使用量のメトリクスを%表示にして欲しい!

%でないと困ること

どういうことかと言いますと、例えば「ディスクの使用率が80%を超えたらアラームを飛ばす」という設定を行うとします。このときメトリクスの単位が%ならばCloudWatchでのアラーム作成時、しきい値に80(%)を指定すればOKです。

しかし単位がバイトの場合、もちろんしきい値の単位もバイトで指定する必要があります。
この場合だと具体的に以下のような手間が発生してしまうのです。

  • 全体の80%の値を計算する必要がある
  • ディスクを増やしたりした際に、アラームのしきい値も修正する必要がある

ちょっとのことですが、何台も監視を行う場合は結構な手間になります。
ということで色々調べて試したところ、RDSのメモリとディスクに対して使用率(%)でのメトリクス作成ができたのでその手順をまとめていきます。
参考サイト:【CloudWatch】RDSのストレージ使用率を監視してみる

%でのメトリクスを作成する

手順はこんな感じです。
今回は先述した通り、RDSのメモリとディスクに対する手順になります。

  • RDSの拡張モニタリングの有効化
  • メトリクスフィルターの作成
  • Metric Mathを使って使用率のメトリクス作成(メモリのみ)

検証環境
・MySQL Community
・シングルAZ

RDSの拡張モニタリングの有効化

拡張モニタリングの詳しい説明については公式ドキュメント(拡張モニタリング)を見ていただくのがいいかと思いますが、一言で言うとRDSのより詳細なメトリクスが取れる機能です。この拡張モニタリングで取れるデータをもとに%でのメトリクスを作成していきます。

有効化の方法は対象のインスタンスの変更画面から下記の部分にチェックを入れるだけです。詳細度やロールの部分はそのまま。
また、拡張モニタリングの有効化ではインスタンスの再起動は発生しないのでご安心を。

メトリクスフィルターの作成

拡張モニタリングを有効化すると「RDSOSMetrics」というロググループが勝手に作成されます。このログから必要なデータだけ取ってきてカスタムメトリクスを作成します。
※ここからメモリとディスクで手順が分かれます。

ディスク

以下が拡張モニタリングで取得できるログの一部です。

"fileSys": [ 
{ 
"used": 420556, 
"name": "", 
"usedFiles": 221, 
"usedFilePercent": 0.02, 
"maxFiles": 1310720, 
"mountPoint": "/rdsdbdata", 
"total": 20496340, 
"usedPercent": 2.05 
}

この中の
"usedPercent": 2.05
これがディスクの使用率に当たるため、この値をメトリクスフィルターを使って取得します。

フィルターパターン
{ ($.instanceID="database-1") && ($.fileSys[0].mountPoint="/rdsdbdata") }

メトリクス値
$.fileSys[0].usedPercent

最終的にこのようにパーセントでのデータが取れます。
あとはいつも通りアラームの設定をするだけです。

メモリ

メモリも同じような手順で作成できることはできるのですが、少し手間がかかるため参考程度に見ていただければと思います。

なぜかと言うと、以下がメモリの項目なのですが見ての通りディスクのような使用率の項目がありません。そのため、そのままデータを抜き出して表示ということができないのです。

"memory": { 
"writeback": 0, 
"hugePagesFree": 0, 
"hugePagesRsvd": 0, 
"hugePagesSurp": 0, 
"cached": 194264, 
"hugePagesSize": 2048, 
"free": 107208, 
"hugePagesTotal": 0, 
"inactive": 366560, 
"pageTables": 4920, 
"dirty": 1040, 
"mapped": 80208, 
"active": 360056, 
"total": 979136, 
"slab": 68028, 
"buffers": 59020 
}

ここで、CloudwatchのMetric Mathという機能を使います。Metric Mathは既存のメトリクスに対して計算を行いその結果を表示する機能です。
メモリ使用率計算の時に使うこの式を使ってMetric Mathで計算を行い、使用率のメトリクスを作成していきます。
メモリ使用率 = ( ( Total - Free ) / Total * 100 )

そのために、Total=合計メモリ量とFree=空きメモリ量のメトリクスが必要になるのですが、それぞれ以下メトリクスをを利用します。
・空きメモリ量=デフォルトで取得される「FreeableMemory」を使用
・合計メモリ量=拡張モニタリングで取得されるデータを使用
ということで合計メモリ量に当たるこの値をディスクと同じ手順で取得します。
"total": 979136,

フィルターパターン
{ ($.instanceID="database-1") && ($.memory.total = *) }

メトリクス値
$.memory.total

Metric Mathを使ってメモリ使用率のメトリクス作成

ここからMetric Mathと先ほど用意したメトリクスを利用して、メモリ使用率のメトリクスを作成していきます。
と言っても手順は簡単です。

  1. totalとFreeableMemoryのメトリクスを選択
  2. 右側の「数式を追加」→「空の式で始まる」を選択
  3. 下記の式記入
    (m1-m2/1024)/m1*100

 ※m1=total m2=FreeableMemory
 ※total (kb)と FreeableMemory (byte)の単位をkbに合わせるようにしています

あとは作成したメトリクスのアクションからアラームを作成するだけです。

まとめ

毎回RDSのアラームを作成する時「CPUは%なので楽なのに…」と思いながら設定していたので、どちらも取得できることがわかってスッキリしました。
メモリに関しては若干手間ではありますが、ディスクの方は簡単にできる+容量アップの機会もそこそこあるかと思いますので、使用率でのメトリクス取得ができていると運用時かなり楽だと思います。
ぜひ試してみてください!