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

はじめに
===

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

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

![WS000037.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/7c578199-9042-5e7a-e612-5e15a977753b.jpeg)

![WS000038.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/cfac8bd7-bef0-df94-7fce-8642140c1caa.jpeg)



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

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

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

```bash:/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にロードアベレージを追加するスクリプトを実行します。

```bash:/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にロードアベレージを追加するコマンド自体も表示出来ます。

```bash:/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](https://qiita-image-store.s3.amazonaws.com/0/63647/b8efb78c-768a-f168-4ce5-526ebf881038.jpeg)

![WS000036.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/d9ad5f3e-cedf-50d9-df1e-3089c5343541.jpeg)

![WS000035.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/9f5abfd4-7657-f76f-937b-08d9c0c379af.jpeg)



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](https://qiita-image-store.s3.amazonaws.com/0/63647/1ec94c88-55ff-8fd1-cc47-1b595d928cd6.jpeg)

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

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

```html:アラートメール本文例

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
```

***

以上になります。