はじめに
EC2インスタンス(Amazon Linux)のロードアベレージをCloudWatchカスタムメトリックスとして追加するサンプルスクリプトを記します。
また、CloudWatchに追加したロードアベレージが指定した閾値を超えた場合、アラートメールを送信する設定を記します。
EC2インスタンス(Amazon Linux)のロードアベレージをCloudWatchカスタムメトリックスとして追加する事で、CloudWatchでEC2インスタンスのロードアベレージを確認・監視する事が出来ます。
環境
EC2インスタンス(Amazon Linux)は以下のAMIを使用して作成しました。
・amzn-ami-hvm-2016.03.3.x86_64-gp2 (ami-374db956)
Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type - ami-374db956
参考資料
以下のページ参考にさせて頂きました。
シナリオ: メトリックスを CloudWatch にパブリッシュする
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/PublishMetrics.html
簡単にload averageを上げるワンライナー
http://d.hatena.ne.jp/japanrock_pg/20110412/1302600276
EC2インスタンスにCloudWatchメトリックスへの書き込み許可権限を追加する
まず、AWSマネジメントコンソール->「IAM」->「Identity and Access Management 」->「ロール」->「EC2インスタンスにアタッチしているIAMロール」を選択し、EC2インスタンスのIAMロールに対して、CloudWatchメトリックスへの書き込み許可権限を追加します。
今回の例では、EC2インスタンスのIAMロールに対して、AWSが提供する「CloudWatchFullAccess」ポリシーをアタッチして、EC2インスタンスにCloudWatchメトリックスへの書き込み許可権限を追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"autoscaling:Describe*",
"cloudwatch:*",
"logs:*",
"sns:*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
EC2インスタンスのロードアベレージをCloudWatchに追加するスクリプト
以下のスクリプトを作成して実行すると、EC2インスタンスのロードアベレージをCloudWatchに追加出来ます。
[ec2-user@cloudwatch-example-server ~]$ vi /home/ec2-user/cloudwatch_put_loadaverage.sh
#!/bin/bash
## スクリプトの実行方法の表示する
function print_usage() {
echo "Usage: $0"
echo " $0 [--help]"
echo " $0 [--debug]"
return 0
}
## 入力されたパラメータをチェックする
function check_parameter() {
## パラメータチェック
if [ $# -eq 0 ] || [ $# -eq 1 ] ; then
## パラメータとして --help を指定した場合、スクリプトの実行方法を表示する
if [ $# -eq 1 ] && [ $1 = "--help" ] ; then
print_usage
exit
fi
## パラメータとして --debug を指定した場合、実行するawsコマンド自体も表示する
if [ $# -eq 1 ] && [ $1 = "--debug" ] ; then
debug_flg="on"
fi
else
print_usage
exit
fi
return 0
}
## AWS CLI設定
readonly AWS_CLI="/usr/bin/aws"
readonly AWS_CLI_REGION="ap-northeast-1"
## デバッグフラグ
debug_flg="off"
## パラメータチェック
check_parameter $@
## CloudWatchに追加するメトリックス名や単位の設定
metric_name="LoadAverage"
name_space="AmazonLinux/${metric_name}"
unit="Count"
## ロードアベレージを取得する
load_average=`uptime | awk 'BEGIN{FS="load average: "}{print $2}' | awk 'BEGIN{FS="."}{print $1}'`
## AWS CloudWatchのカスタムメトリックスにロードアベレージを追加する
if [ ${debug_flg} == "on" ] ; then
set -x
fi
${AWS_CLI} cloudwatch --region ${AWS_CLI_REGION} put-metric-data --metric-name `hostname -s`/${metric_name} --namespace ${name_space} --value ${load_average} --unit ${unit}
[ec2-user@cloudwatch-example-server ~]$ chmod 755 /home/ec2-user/cloudwatch_put_loadaverage.sh
EC2インスタンスのロードアベレージをCloudWatchに追加する
例えば、EC2インスタンスのロードアベレージが7だとします。
[ec2-user@cloudwatch-example-server ~]$ uptime
01:43:09 up 2:41, 2 users, load average: 7.36, 3.35, 3.46
[ec2-user@cloudwatch-example-server ~]$
EC2インスタンスでCloudWatchにロードアベレージを追加するスクリプトを実行します。
[ec2-user@cloudwatch-example-server ~]$ /home/ec2-user/cloudwatch_put_loadaverage.sh
[ec2-user@cloudwatch-example-server ~]$
EC2インスタンスのロードアベレージ「7」がCloudWatchのカスタムメトリックス「AmazonLinux/LoadAverage」に追加されます。
なお「--debug」オプションをつけてスクリプトを実行した場合、CloudWatchにロードアベレージを追加するコマンド自体も表示出来ます。
[ec2-user@cloudwatch-example-server ~]$ /home/ec2-user/cloudwatch_put_loadaverage.sh --debug
++ hostname -s
+ /usr/bin/aws cloudwatch --region ap-northeast-1 put-metric-data --metric-name cloudwatch-example-server/LoadAverage --namespace AmazonLinux/LoadAverage --value 7 --unit Count
[ec2-user@cloudwatch-example-server ~]$
CloudWatchでEC2インスタンスのロードアベレージを確認する
CloudWatchに追加したロードアベレージについては、AWSマネジメントコンソールの「CloudWatch」->「メトリックス」->「AmazonLinux/LoadAverage」をクリックすると確認出来ます。
cronによりEC2インスタンスのロードアベレージをCloudWatchへ定期的に追加する
crontabにロードアベレージをCloudWatchへ追加するスクリプトを登録する事で、CloudWatchにEC2インスタンスのロードアベレージを定期的に追加する事が可能です。
crontabコマンドで以下のようなcronを登録すると、5分おきにCloudWatchへEC2インスタンスのロードアベレージを追加する事が可能です。
[ec2-user@cloudwatch-example-server ~]$ crontab -e
MAILTO=********@example.com
##### EC2インスタンスのロードアベレージをCloudWatchに記録する
*/5 * * * * /home/ec2-user/cloudwatch_put_loadaverage.sh
CloudWatchに追加しているロードアベレージが閾値を超えたらアラートメールを送信する設定
CloudWatchでEC2インスタンスのロードアベレージを監視する事が可能です。
以下のように設定すると、CloudWatchメトリックスに追加しているロードアベレージが指定した閾値を超えた場合、アラートメールを送信する事が出来ます。
AWSマネジメントコンソールの「CloudWatch」->「メトリックス」->「AmazonLinux/LoadAverage」->「cloudwatch-example-server/LoadAverage」の「アラームの作成」をクリックします。
「アラームの作成」画面が表示されます。各項目に以下のように入力します。
以下の例では、EC2インスタンスのロードアベレージが10を超えた場合、アラートメールを送信します。
入力が終わったら「アラームの作成」をクリックします。
名前: Monitoring-LoadAverage-cloudwatch-example-server
説明: Monitoring-LoadAverage-cloudwatch-example-server
次の時: Monitoring-LoadAverage-cloudwatch-example-server が : >= が10 を 1 回連続した場合
「アラームの作成」画面で「+ 通知」をクリックして、各項目に以下のように入力します。
アラームが次の時: 状態: 警告
通知の送信先: CloudWatch-Monitoring-Alert
メールリスト: CloudWatchによるロードアベレージ監視でアラートメールを送信したいメールアドレス
アラームが次の時: 状態: OK
通知の送信先: CloudWatch-Monitoring-Alert
メールリスト: CloudWatchによるロードアベレージ監視でアラートメールを送信したいメールアドレス
アラームが次の時: 状態: 不足
通知の送信先: CloudWatch-Monitoring-Alert
メールリスト: CloudWatchによるロードアベレージ監視でアラートメールを送信したいメールアドレス
「新しいメールアドレスの確認」ウィンドウが表示され、Amazon SENから前述の「メールリスト」で指定したメールアドレスに「AWS Notification - Subscription Confirmation」というメールが送信されます。
「AWS Notification - Subscription Confirmation」メール本文中の「Confirm subscription」をクリックして、CloudWatchからのメール受信を許可します。
これで、EC2インスタンスのロードアベレージが監視閾値10を超えた場合、前述の「メールリスト」で指定したアドレスに以下のようなアラートメールが届くようになります。
アラートメール件名: ALARM: "Monitoring-LoadAverage-cloudwatch-example-server" in Asia Pacific - Tokyo
You are receiving this email because your Amazon CloudWatch Alarm "Monitoring-LoadAverage-cloudwatch-example-server" in the Asia Pacific - Tokyo region has entered the ALARM state, because "Threshold Crossed: 1 datapoint (10.0) was greater than or equal to the threshold (10.0)." at "Sunday 18 September, 2016 04:06:47 UTC".
View this alarm in the AWS Management Console:
https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#s=Alarms&alarm=Monitoring-LoadAverage-cloudwatch-example-server
Alarm Details:
- Name: Monitoring-LoadAverage-cloudwatch-example-server
- Description: Monitoring-LoadAverage-cloudwatch-example-server
- State Change: OK -> ALARM
- Reason for State Change: Threshold Crossed: 1 datapoint (10.0) was greater than or equal to the threshold (10.0).
- Timestamp: Sunday 18 September, 2016 04:06:47 UTC
- AWS Account: *************
Threshold:
- The alarm is in the ALARM state when the metric is GreaterThanOrEqualToThreshold 10.0 for 300 seconds.
Monitored Metric:
- MetricNamespace: AmazonLinux/LoadAverage
- MetricName: cloudwatch-example-server/LoadAverage
- Dimensions:
- Period: 300 seconds
- Statistic: Maximum
- Unit: not specified
State Change Actions:
- OK:
- ALARM: [arn:aws:sns:ap-northeast-1:***********:CloudWatch-Monitoring-Alert]
- INSUFFICIENT_DATA:
--
If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe:
https://sns.ap-northeast-1.amazonaws.com/unsubscribe.html?SubscriptionArn=arn:aws:sns:ap-northeast-1:*************:CloudWatch-Monitoring-Alert:*******-****-****-****-************&Endpoint=**********@gmail.com
Please do not reply directly to this email. If you have any questions or comments regarding this email, please contact us at https://aws.amazon.com/support
以上になります。