AWS EC2インスタンスのハードディスクの使用率はCloudWatchの標準メトリクスでは取得できません。
ハードディスクの使用率を監視するにはCloudWatchのカスタムメトリクスを定義する必要があります。
IAMの設定
IAMロールの作成
EC2インスタンスでCloudWatch エージェントを実行するには適切なIAMロールが必要となります。
具体的には、「CloudWatchAgentServerPolicy」をIAMロールに設定する必要があります。
AWSマネージメントコンソールでIAMの設定画面を開きます。

「ロール」- 「ロールの作成」をクリックします。

「EC2」- 「次のステップ:アクセス権限」をクリックします。

ポリシーのフィルタに「cloudwatch」を入力して検索します。
「CloudWatchAgentServerPolicy」にチェックします。
「次のステップ:タグ」をクリックします。
タグの追加は「次のステップ:確認」をクリックします。

ロール名に「CloudWatchAgentServerRole」を入力します。
「ロールの作成」をクリックします。
EC2にIAMロールを設定する
先程作成した、IAMロール「CloudWatchAgentServerRole」をEC2に設定します。
AWSマネージメントコンソールでEC2の画面を開きます。

該当のインスタンスを選択し、「インスタンスの設定」-「IAMロールの割り当て/置換」をクリックします。

IAMロールの「ロールなし」をクリックすると、作成したIAMロールの一覧が表示されるので、先ほど作成した「CloudWatchAgentServerRole」を選択し、適用をクリックします。
CloudWatchエージェントをインストールして実行する
EC2インスタンスにsshでログインして作業を行います。
CloudWatchにディスクの使用率を送信するには
- スクリプトを利用する方法
- CloudWatchエージェントを利用する方法
2つの方法があります。
CloudWatchエージェントのインストール
CloudWatchエージェントパッケージをダウンロード、インストールします。
cd /tmp
wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
sudo rpm -U ./amazon-cloudwatch-agent.rpm
CloudWatchエージェントの設定ファイルを作成
ウィザードで作成します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
質問に数字で回答していきます。
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"metrics": {
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"statsd": {
"metrics_aggregation_interval": 60,
"metrics_collection_interval": 60,
"service_address": ":8125"
}
}
}
}
作成されたエージェント設定ファイルがこちら(/opt/aws/amazon-cloudwatch-agent/bin/config.json)
CloudWatchエージェントの開始
CloudWatchエージェントを開始します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
1回目の実行で失敗しました
[ec2-user@ip-10-0-1-68 bin]$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source file:/opt/aws/amazon-cloudwatch-agent/bin/config.json --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
2020/03/02 15:37:29 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
Valid Json input schema.
I! Detecting runasuser...
No csm configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase failed
======== Error Log ========
2020/03/02 15:37:29 I! AmazonCloudWatchAgent Version 1.237768.0.
2020/03/02 15:37:29 E! Error parsing /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml, open /usr/share/collectd/types.db: no such file or directory
[ec2-user@ip-10-0-1-68 bin]$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
"status": "stopped",
"starttime": "",
"version": "1.237768.0"
}
調べてみると、collectdというパッケージが必要とのことなのでインストールします。
$ sudo yum install collectd
再度実行
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source file:/opt/aws/amazon-cloudwatch-agent/bin/config.json --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
2020/03/02 15:48:47 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
Valid Json input schema.
I! Detecting runasuser...
No csm configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
amazon-cloudwatch-agent start/running, process 10036
無事に起動しました。
collectd自動実行の設定をします。
$ sudo chkconfig collectd on
参考に、CloudWatchエージェントの停止方法です。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop
自動起動について
sudo systemctl enable amazon-cloudwatch-agent
CloudWatchメトリクスの確認
AWSマネージメントコンソールでCloudWatchメトリクスの画面を開きます。

メトリクスにカスタム名前空間「CWAgent」が増えています。

5メトリクスをクリックします。

該当のディスクを選択すると使用率が表示されます。
取得できていることが確認できます。
ディスク使用率を監視してSNS(メール)で通知する
トピックの作成
AWSマネージメントコンソールでSNSの設定画面を開きます。

「トピック」-「トピックの作成」をクリックします。

名前を入力して、「トピックの作成」をクリックします。
今回の名前は、「サーバ名_diskalert」としました。

トピックが正常に作成されたことが画面上部に表示されました。
「サブスクリプションの作成」をクリックします。

プロトコルに「Eメール」を選択します。
エンドポイントに「メールアドレス」を記入します。
「サブスクリプションの作成」をクリックします。

サブスクリプションが正常に作成されたことが画面上部に表示されました。
ステータスを確認すると、「保留中の確認」となっています。
これは指定したメールアドレスにメールが送信されていて、メール本文にある「Confirm subscription」をクリックするとステータスが「確認済み」に変わります。
これでトピックの作成は完了です。
引き続きCloudWatchアラームの設定を行います。
CloudWatchアラームの設定
最後の設定となりました。後はCloudWatchアラームの設定だけです。
AWSマネージメントコンソールでSNSの設定画面を開きます。

「アラーム」-「アラームの作成」をクリックします。

「メトリクスの選択」をクリックします。

カスタム名前空間の「CWAgent」をクリックします。

該当のディスクをクリックします。「メトリクスの選択」をクリックします。

しきい値の入力に「70」を入力しました。
これは70%を超えた時ということになります。実際には90などの数字となりますが、今回はテストもかねて70にしました。
「次へ」をクリックします。

先程作成した、「サーバ名_diskalert」トピックを選択します。
Eメールアドレスが表示されるので確認します。
「次へ」をクリックします。

アラーム名を入力します。
今回はトピック名と同じ「サーバ名_diskalert」にしました。
「次へ」をクリックします。

内容を確認しながら下にスクロールします。
「アラームの作成」をクリックします。

アラームが正常に作成されたことが画面上部に表示されました。
作成された直後は「データ不足」となっていますが少し時間がたてば「OK」になります。

まとめ
CloudWatchのカスタムメトリクスをCloudWatchエージェンで取得し、しきい値を超えるとメール送信することができます。
今回はしきい値を超えた場合にメール送信しただけですが、しきい値内におさまった場合もメール送信することも可能です。
CloudWatchアラームをもう一つ作ればいいです。
IaaSの場合はディスク監視は必須の機能だと言えるので、もう少し簡単に設定できるようになってほしいものです。