EC2

EC2のディスク使用率をCloudWatchで監視し容量が少なくなったらメール送信する

AWS EC2インスタンスのハードディスクの使用率はCloudWatchの標準メトリクスでは取得できません。
ハードディスクの使用率を監視するにはCloudWatchのカスタムメトリクスを定義する必要があります。

この記事で使用しているOSはAmazon Linuxとなります

 

IAMの設定

IAMロールの作成

EC2インスタンスでCloudWatch エージェントを実行するには適切なIAMロールが必要となります。

具体的には、「CloudWatchAgentServerPolicy」をIAMロールに設定する必要があります。

AWSマネージメントコンソールでIAMの設定画面を開きます。

IAMロール作成

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

ロール作成

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

「Allows EC2 Instances to call AWS services on your behalf.」の意味は、「EC2お客様に代わってEC2インスタンスがAWSサービスを呼び出すことができるようにする」です。
ポリシーアタッチ

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

タグの追加は「次のステップ:確認」をクリックします。

ロールの作成-確認

ロール名に「CloudWatchAgentServerRole」を入力します。
「ロールの作成」をクリックします。

ロール名は任意です。「CloudWatch-EC2Role」でも構いません。

 

EC2にIAMロールを設定する

先程作成した、IAMロール「CloudWatchAgentServerRole」をEC2に設定します。

AWSマネージメントコンソールでEC2の画面を開きます。

EC2一覧画面

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

IAMロールの割り当て

IAMロールの「ロールなし」をクリックすると、作成したIAMロールの一覧が表示されるので、先ほど作成した「CloudWatchAgentServerRole」を選択し、適用をクリックします。

 

CloudWatchエージェントをインストールして実行する

EC2インスタンスにsshでログインして作業を行います。

CloudWatchにディスクの使用率を送信するには

  • スクリプトを利用する方法
  • CloudWatchエージェントを利用する方法

2つの方法があります。

Systems ManagerやCloudFormationを利用してもCloudWatchエージェントをインストールすることができます。

 

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
json.confファイルを変更した際には、停止起動の作業が必要です。

自動起動について

Amazon Linux 2のsystemd用のファイルは存在していましたが、Amazon Linuxのinit.d用のファイルはありませんでした。

とりあえず、起動コマンドを/etc/rc.localに記述しました。

 

CloudWatchメトリクスの確認

AWSマネージメントコンソールでCloudWatchメトリクスの画面を開きます。

CloudWatchメトリクスCWagent

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

CloudWatch5メトリクス

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

CloudWatchディスク選択

該当のディスクを選択すると使用率が表示されます。

取得できていることが確認できます。

 

ディスク使用率を監視してSNS(メール)で通知する

トピックの作成

AWSマネージメントコンソールでSNSの設定画面を開きます。

SNS設定画面

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

SNSトピックの作成

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

SNSトピック作成完了

トピックが正常に作成されたことが画面上部に表示されました。

「サブスクリプションの作成」をクリックします。

SNSサブスクリプションの作成

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

SNSサブスクリプション作成完了

サブスクリプションが正常に作成されたことが画面上部に表示されました。

ステータスを確認すると、「保留中の確認」となっています。
これは指定したメールアドレスにメールが送信されていて、メール本文にある「Confirm subscription」をクリックするとステータスが「確認済み」に変わります。

これでトピックの作成は完了です。
引き続きCloudWatchアラームの設定を行います。

 

CloudWatchアラームの設定

最後の設定となりました。後はCloudWatchアラームの設定だけです。

AWSマネージメントコンソールでSNSの設定画面を開きます。

CloudWatch画面

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

CloudWatch メトリクスと条件の指定

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

CloudWatchカスタム名前空間

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

CloudWatchアラームメトリクス

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

CloudWatchアラームしきい値の設定

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

「次へ」をクリックします。

CloudWatchアラーム トピックの選択

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

「次へ」をクリックします。

CloudWatchアラーム アラーム名設定

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

「次へ」をクリックします。

CloudWatchアラーム 確認

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

CloudWatchアラーム 作成完了

アラームが正常に作成されたことが画面上部に表示されました。

作成された直後は「データ不足」となっていますが少し時間がたてば「OK」になります。

CloudWatchアラーム OK

 

まとめ

CloudWatchのカスタムメトリクスをCloudWatchエージェンで取得し、しきい値を超えるとメール送信することができます。

CloudWatchのカスタムメトリクス取得にはスクリプトを利用する方法もあります。

今回はしきい値を超えた場合にメール送信しただけですが、しきい値内におさまった場合もメール送信することも可能です。
CloudWatchアラームをもう一つ作ればいいです。

IaaSの場合はディスク監視は必須の機能だと言えるので、もう少し簡単に設定できるようになってほしいものです。