CloudWatchでカスタムメトリクスを10分で取得する確実な1つの手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276897/b7682f04-a829-68ea-d9b7-c3ed05528deb.png)

こんにちは。黒川です。

監視担当の先輩から

「いいか？とりあえず監視っていうのは CPU, メモリ, ディスク の使用率を見るんだ！まずはそれからだ！」

なんて言われた経験、ありますよね？　（無いか。）

しかし、AWSではデフォルトのメトリクスに「メモリ, ディスク」が無いではありませんか。

令和になったことですし10分でできる設定方法を投稿してみようと思います。

✔︎EC2インスタンスで「メモリ、ディスク」の監視メトリクスをCloudWatchに送信します。

✔︎やること　（全てAWSのサービスでやります）

　 - IAMロール、IAMポリシー
　 - EC2にperlのモジュールをyumでインストールする
　 - AWS公式スクリプトをcurlコマンドでダウンロードする
　 - AWS公式スクリプトをcronで1分毎に起動する

それではいってみましょう。

#IAMロール、IAMポリシーを作成し、EC2にアタッチする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276897/61973f37-e246-d781-bdb0-986738e83bc7.png)

✔︎中級者向け

以下のポリシーを付与したIAMロールを監視するEC2にアタッチして下さい。
cloudwatch:PutMetricData
cloudwatch:GetMetricStatistics
cloudwatch:ListMetrics
ec2:DescribeTags

✔︎初級者向け

EC2が「メモリ、ディスク」のメトリクス情報をCloudWatchを送信するには「ログを送信する権限」が必要です。

IAMロールをざっくり解説すると
<img width="1509" alt="スクリーンショット 2019-05-30 0.23.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276897/814ea66b-9d8d-1456-b280-9e5dd161b0bb.png">

・短期的な認証情報である
・例えばIAMロールに「S3に書き込める権限」をアタッチして使用する

　※この「S3に書き込める権限」を「IAMポリシー」と読んだりする

<img width="1506" alt="スクリーンショット 2019-05-30 0.25.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276897/bfa233a2-fab0-bc0a-8c6e-3cfb5350b240.png">

こんな風に、ロールをEC2にアタッチして使用します。

ポリシーの作成方法、ロールへのアタッチの仕方はAWS公式ドキュメント「[チュートリアル: はじめてのカスタマー管理ポリシーの作成とアタッチ](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_managed-policies.html)」を参照して下さい。



#EC2にperlのモジュールをyumでインストールする
```
sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64
```

インターネットにアクセスできない場合はVPCのネットワークの設定を見直す必要があります。

・インターネットゲートウェイ
・ルートテーブル
・セキュリティーグループ

の設定を見直して下さい。

AWSのネットワーク知識をおさらいしたい方は「[VPCとは何か？それはAWSに張り巡らされた1つの血管であった。　〜AWS Virtual Private Cloud 〜](https://www.awsskill.com/121/vpc/)」を参照してみて下さい。

#AWS公式スクリプトをcurlコマンドでダウンロードする

```
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
```


```
unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip && \
cd aws-scripts-mon
```

以下コマンドを実行すればCloudWatchのメトリクス画面に「LinuxSystem」というNamespaceで出力されています。

```
./mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --mem-used --mem-avail --disk-path=/ --disk-space-util --disk-space-used --disk-space-avail
```

1分ごとにCloudWatchに送信されるようにCronを設定しましょう。

```
crontab -e 
```

```
*/1 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --mem-used --mem-avail --disk-path=/ --disk-space-util --disk-space-used --disk-space-avail --from-cron
```

引数の詳細によって、ディスクのパーティションごとを指定したり細かい調整が可能です。

詳細は[Amazon EC2 Linux インスタンスのメモリとディスクのメトリクスのモニタリング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html)を参照して下さい。

#まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276897/2236e9ea-8d37-061c-a97b-e0dba65270ac.png)

今回の手順は公式サイトでもサポートされている手順ですし、手元の環境でも問題なくできたので、信頼性は高いかと思います。

ところで、デフォルトのメトリクスに「メモリ、ディスク」が無いのは明らかにAWSの落ち度があると言わざるを得ないのでは無いでしょうか。

「CloudWatchのリリース日まであと少し！ちょっとメモリとディスクは難しそうだからスクリプトで乗り切ろうぜ！」ってな感じでしょうか。（完全に想像です。）

CloudWatchとは何か？ Youtubeで解説しているのでこちらも参照してみて下さい。「[【AWS】CloudWatch メトリクスを中心に6つの観点から徹底解説！](https://youtu.be/0QoTZG_oYHY)」

ありがとうございました。