CloudWatch には標準では EC2 インスタンスのディスク容量チェック用のmetricsが存在しませんが、EC2 からディスク容量情報を CloudWatch に通知する事により CloudWatch で監視する事が可能です。
EC2 から CloudWatch へのディスク容量情報の通知は、Amazon Linux では標準で搭載されている aws コマンドを利用します。
当初は Java により記述された /opt/aws/bin/mon-put-data コマンドを利用していましたが、 aws コマンドであれば IAM role にも対応しているので aws コマンドを利用しています。
IAM role の対象ではない EC2 インスタンスで aws コマンドを利用する場合はアクセスキーやシークレットキーを保存するために
$ aws configure
を実行してアクセスキーやシークレットキーを保存する必要がありますが、 IAM role の対象となっている EC2 インスタンスではそれらの設定は不要です。
$ aws configure
を実行してデフォルトのリージョンと出力フォーマットを指定する事もできますが、どちらもコマンドラインから指定可能ですので、今回はコマンドラインから指定します。
以下のコマンドを実行する事で CloudWatch の System/Linux というネームスペースにディスク容量を通知できます。
CloudWatch では System/Linux から FreeSpaceMBytes もしくは UsedSpacePercent という Metrics を指定する事で監視ができます。
#!/bin/sh
# ディスク容量を取得するパス
path=${1:-/}
# EC2 のインスタンス ID を取得
instanceid=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
# コマンド定義
region="--region ap-northeast-1"
namespace="--namespace System/Linux"
dimensions="--dimensions InstanceId=${instanceid},Path=${path}"
aws="/usr/bin/aws cloudwatch put-metric-data ${region} ${namespace} ${dimensions}"
# ディスク容量を MB 単位で取得
${aws} ${monput} --unit Megabytes --metric-name "FreeSpaceMBytes" --value `df --block-size=1M ${path} |
awk '$NF == "'${path}'" { print $(NF-2) }'`
# ディスク容量を % 単位で取得
${aws} ${monput} --unit Percent --metric-name "UsedSpacePercent" --value `df --block-size=1M ${path} |
awk '$NF == "'${path}'" { print substr($(NF-1), 1, length($(NF-1)-1)) }'`
cron に登録する等で定期的にディスク容量を取得して CloudWatch に通知すると良いでしょう。