CloudWatch カスタムメトリクスで色々監視する

[初EC2を立てるまで](https://qiita.com/hf7777hi/items/08b25fba65f0d214aee3)
[EC2初期設定](https://qiita.com/hf7777hi/items/ea7ddbecb930dc1f053b)
でEC2の初期設定までできたので、実際に運用していくにあたり必要そうなカスタムメトリクスを自作します。

[カスタムメトリクス導入](https://qiita.com/hf7777hi/items/ea7ddbecb930dc1f053b#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E5%B0%8E%E5%85%A5)にて、メモリ使用率、ディスク使用率は設定しました。

今回は+αシェルを作成して色々監視できる状態にしたいと思います。

#基本情報
基本的に「/var/tmp/aws-mon/」にインスタンスの情報が入っています。
※AMIから作成したインスタンスはこのディレクトリがクリアされていないこともあるので、EC2起動したら削除しておくほうがいいです。
/aws-scripts-mon/mon-put-instance-data.plを実行すると作られるっぽいです。
```
/instance-id　：インスタンスID 
/placement/availability-zone ：アベイラビリティゾーン
/as-group-name ：オートスケーリンググループ名
```

###テンプレスクリプト
/opt/aws/bin/mon-put-dataを実行することでCloudWatchに登録できます。

```
#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/jre
export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon
export EC2_REGION=ap-northeast-1
export AWS_CREDENTIAL_FILE=/home/ec2-user/cloudwatch/credential
InstanceId=`cat /var/tmp/aws-mon/instance-id`

/opt/aws/bin/mon-put-data --metric-name "[メトリクス名]" --namespace "CustomMetrix" --dimensions "InstanceId=${InstanceId}" --value [登録するデータ]
```
各オプションは以下の図の通りCloudWatchに反映されます。
「dimensions」に関しては、「,」区切りで複数設定することも可能です。 
例) --dimensions "InstanceID=\${InstanceID}, HostName=\${hostname}"

- --metric-name
- --namespace
- --dimensions
- --value

![スクリーンショット 2018-03-21 11.26.58.png](https://qiita-image-store.s3.amazonaws.com/0/86605/1f187a2a-785c-6919-2444-340f7dd655ab.png)
![スクリーンショット 2018-03-21 11.40.34.png](https://qiita-image-store.s3.amazonaws.com/0/86605/37a4df12-2d6e-075b-f03c-6828eb05f9dc.png)



#カスタムメトリクス作成
以下のスクリプトを記載してcronに設定することで、CloudWatchで監視可能になります。

###必要モジュールインストール

```
yum install aws-apitools-mon
```



##例
実際に作成してみました。
例は、LoadAverageとhttpd, crondプロセスをチェックをするスクリプトになっています。

このディレクトリに作成します

```
$ pwd
/home/ec2-user/cloudwatch
$ ll
total 4
drwxrwxr-x 2 ec2-user ec2-user 185 Mar 21 00:08 aws-scripts-mon
-rw------- 1 ec2-user ec2-user  91 Mar 21 00:32 credential
```

###スクリプト作成
・CustomMetrix.sh

```
#!/bin/sh
CUR_DIR=/home/ec2-user/cloudwatch

export JAVA_HOME=/usr/lib/jvm/jre
export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon
export EC2_REGION=ap-northeast-1
export AWS_CREDENTIAL_FILE=${CUR_DIR}/credential
InstanceId=`cat /var/tmp/aws-mon/instance-id`
# 設定ファイル
PROCESSCONFIG=${CUR_DIR}/process-conf.txt

# Process Check(設定したファイルから読み込む)
cat ${PROCESSCONFIG} | sed '/^$/d' | grep -v '^#.*' | while read PROCESS
do
  COUNT=`ps -aux | grep ${PROCESS} | grep -v grep | wc -l`
echo ${PROCESS}:${COUNT}
  /opt/aws/bin/mon-put-data --metric-name ${PROCESS} --namespace "CustomMetrix" --dimensions "InstanceId=${InstanceId}" --value ${COUNT}
done

# LoadAverage(1分間の測定値を取得)
/opt/aws/bin/mon-put-data --metric-name "LoadAverage" --namespace "CustomMetrix" --dimensions "InstanceId=${InstanceId}" --value `cat /proc/loadavg | awk '{print $1;}'`
```
実行できるようにパーミッション調整

```
$ chmod u+x CustomMetrix.sh 
```

###設定ファイルを準備
・process-conf.txtにチェックしたいプロセスを記載します。

```
$ cat process-conf.txt 
httpd
crond
```

##実行
実行してCloudWatchに登録されていればOKです。

```
$ ./CustomMetrix.sh 
httpd:6
crond:1
```

CustomMetrixが追加されていればOKです。
![スクリーンショット 2018-03-21 11.12.31.png](https://qiita-image-store.s3.amazonaws.com/0/86605/e535b889-f164-6705-ebf1-1e59678360be.png)

こんな感じで登録されます。
![スクリーンショット 2018-03-21 11.12.58.png](https://qiita-image-store.s3.amazonaws.com/0/86605/e75ca5d9-d20d-2926-f3b9-011f63780010.png)

##cron設定
これで毎分の状況がCloudWatchにて監視することができます。
適宜、アラートを設定して監視を行ってください。

```
$ crontab -e
crontab: installing new crontab
$ crontab -l
*/1 * * * * /home/ec2-user/cloudwatch/CustomMetrix.sh > /dev/null 2>&1
```

以上でカスタムメトリクスが自作できました。
その他監視したいものがあれば、適宜スクリプトを作成すると監視可能です。