okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

CloudWatchとRDSを組み合わせてRDSのディスク使用率(パーセント)を調べる

こんにちは。
SDKやCommand Line Toolsを使ってCloudWatchからRDSの情報を取得して、リソース監視する事は良くあると思います。
監視サーバと組み合わせて使用する方も多いと思いますが、そんな時にRDSのディスクリソース監視は少し工夫をしても良さそうです。
というのも、CloudWatchで取得できるRDSのStorage情報はFreeStorageSpace(Byte)だからです。
以下の2つの状況はどちらもFreeStorageSpaceが10GBですが、緊急度は違ってくると思います。

RDSに割り当てたディスクサイズ FreeStorageSpace(残り空き容量)
500GB 10GB
20GB 10GB

個人的にディスク容量の監視は何パーセント使用中という形式が見やすいので、そんな形式で出力するスクリプトを作ってみました。
ザッと作ったのできちんと最適化しないとですが、忘れないように一旦こちらに残しておきます。

環境

スクリプト

こんな感じです、スクリプトの引数にアクセスキーID、シークレットキー、各種リージョン、DB Instance Identifierを指定します。

#!/bin/env ruby
# -*- coding: utf-8 -*-
require 'aws-sdk'
require 'time'

access_key = "#{ARGV[0]}"
secret_key = "#{ARGV[1]}"
cw_region = "#{ARGV[2]}"
rds_region = "#{ARGV[3]}"
db_instance_identifier = "#{ARGV[4]}"

start_time = Time.now - 300
end_time = Time.now

## CloudWatchへの認証を行います
cw = AWS::CloudWatch.new(
  :access_key_id => access_key,
  :secret_access_key => secret_key,
  :cloud_watch_endpoint => cw_region
).client

## RDSへの認証を行います
rds = AWS::RDS.new(
  :access_key_id => access_key,
  :secret_access_key => secret_key,
  :rds_endpoint => rds_region
).client

## メトリクスのオプションを指定してFreeStorageSpaceを取得します
free_storage_space = cw.get_metric_statistics(
  :namespace   => 'AWS/RDS',
  :metric_name => 'FreeStorageSpace',
  :statistics  => ['Minimum'],
  :dimensions  => [
  { :name => "DBInstanceIdentifier", :value => db_instance_identifier }
  ],
  :period      => 60,
  :start_time  => start_time.iso8601,
  :end_time    => end_time.iso8601,
)[:datapoints][0][:minimum]

## 対象のRDSインスタンスに割り当てられているディスクサイズ(バイト)を取得します
storage_space = rds.describe_db_instances(
  :db_instance_identifier => db_instance_identifier
)[:db_instances][0][:allocated_storage] * 1024 * 1024 * 1024

## 計算します
value = free_storage_space.to_f / storage_space.to_f * 100
puts 100 - value.truncate

まとめ

書き終わって気づきましたが、FreeableMemoryとかも同じようにしてあげると良い感じです。
このデータを監視サーバに入れてあげれば、閾値の設定とかもやりやすくなりそうです。
CloudWatchのデータはそのまま使うのも良いけど、ちょっと加工して使うと見やすくなったりさらに有益なデータになったりするのかも。