LoginSignup
4
6

More than 5 years have passed since last update.

AWS CloudWatchメトリックスにEC2のロードアベレージを追加する

Last updated at Posted at 2016-09-17

はじめに

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メトリックスへの書き込み許可権限を追加します。

CloudWatchFullAccessポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "autoscaling:Describe*",
        "cloudwatch:*",
        "logs:*",
        "sns:*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

WS000037.JPG

WS000038.JPG

EC2インスタンスのロードアベレージをCloudWatchに追加するスクリプト

以下のスクリプトを作成して実行すると、EC2インスタンスのロードアベレージをCloudWatchに追加出来ます。

[ec2-user@cloudwatch-example-server ~]$ vi /home/ec2-user/cloudwatch_put_loadaverage.sh
/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にロードアベレージを追加するスクリプトを実行します。

/home/ec2-user/cloudwatch_put_loadaverage.sh
[ec2-user@cloudwatch-example-server ~]$ /home/ec2-user/cloudwatch_put_loadaverage.sh
[ec2-user@cloudwatch-example-server ~]$

EC2インスタンスのロードアベレージ「7」がCloudWatchのカスタムメトリックス「AmazonLinux/LoadAverage」に追加されます。

なお「--debug」オプションをつけてスクリプトを実行した場合、CloudWatchにロードアベレージを追加するコマンド自体も表示出来ます。

/home/ec2-user/cloudwatch_put_loadaverage.sh
[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」をクリックすると確認出来ます。

WS000034.JPG

WS000036.JPG

WS000035.JPG

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」の「アラームの作成」をクリックします。

WS000039.JPG

「アラームの作成」画面が表示されます。各項目に以下のように入力します。

以下の例では、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

以上になります。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6