EC2をCloudWatchで監視する（後編） ~ メモリ使用率を確認＆アラームを設定する ~

## はじめに
EC2をCloudWatchで監視するというテーマで記事を書いてたのですが、記事の量が多くなってしまったので2つに記事を分割しました。

|記事|内容|
|:--|:--|
|[ログファイルを確認する](https://qiita.com/hiroaki-u/items/09c7492f68c1fc6c1437)|CloudWatch内でサーバー内のログファイルを確認する|
|[メモリ使用率を確認＆アラームを設定する（本記事）](https://qiita.com/hiroaki-u/items/91045844312f32b98e55)|メモリ使用率をCloudWatchにて確認して、異常値になったらアラームを出す|

今回はメモリ使用率をCloudWatchで確認&アラームを出す方法を見ていきます。また実際にメモリに負荷をかけてアラームが出るか確認もしていきます。（メモリ使用率以外にも、同様に方法でディスク使用率等も設定可能です）。

**目次**

- [メモリ使用率を監視するためのメトリクスの作成](#メモリ使用率を監視するためのメトリクスの作成)
- [CloudWatchにてメモリ使用率を確認する](#cloudwatchにてメモリ使用率を確認する)
- [アラームの設定をする](#アラームの設定をする)

## メモリ使用率を監視するためのメトリクスの作成
メトリクスの作成自体は`amazon-cloudwatch-agent`というソフトを用いて設定していくのですが、[こちらの前編の記事](https://qiita.com/hiroaki-u/items/09c7492f68c1fc6c1437)にて、やり方を記載しています。
そのため、本記事ではやり方を割愛します。

**【補足】**
>
メトリクスとは、CloudWatchが各リソース（EC2インスタンス等）について監視するパラメーターのことをいいます。
これには大きく2種類あります。
>
|種類|説明|パラメーターの例|
|:--|:--|:--|
|標準メトリクス|EC2を立ち上げた時に標準的に設定してくれるメトリクス|CPU使用率, インスタンスのステータスチェック等|
|カスタムメトリクス|ユーザーが自分で作成する必要のあるメトリクス|メモリ使用率, ディスク使用率等|
今回はメモリ使用率をCloudWatchにて確認したいので、カスタムメトリクスを作成する必要があります。


ということで、次からメモリ使用率の確認やアラームの設定を見ていきます。

## CloudWatchにてメモリ使用率を確認する
カスタムメトリクスを設定すると、CloudWatchの画面にてCWagentという名前空間のメトリクスがあることがわかります。
![メトリクス名前空間.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/dd2ba59c-af8e-1b23-1196-ee7d33d955e4.jpeg)


CWAgent => ImageId,InstanceId,InstanceTypeと進み、メトリクス名が`mem_used_percent`のチェックボックスに`✓`をつけます。
そうするとこのように値が出ることがメモリ使用率のグラフが確認できます。
![メトリクス画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/c3e0da4b-b881-b031-2b1d-be3871a146e7.jpeg)

メモリ使用率を確認することができたので、次にアラームを設定していきましょう。

## アラームの設定をする
- CloudWatchのアラーム画面に行きます。

アラームの作成 => メトリクスの選択から該当するメトリクス(`mem_used_percent`)にチェックをつけます。
その後、メトリクスの選択というボタンを押しましょう。

![アラームの作成_メトリクスの選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/7de3eab4-5b92-778b-b7f3-7f4da3e3ee96.jpeg)

- 次にアラームを出す条件を設定していきます。

設定したら次へボタンを押します。
今回は以下のような設定で進めてきます。

|設定|設定値|
|:--|:--|
|統計|平均値|
|期間|1分|
|しきい値の種類|静的|
|条件|80よりも大きい|


- 通知の設定は今回はしません。特に設定せずに次へボタンを押します。

- 名前と説明をつけて設定は完了です。
今回は名前も説明も両方`test-alarm`とつけました。


これで設定完了です。
完了するとCloudWatchの画面に設定したアラームが表示されます。
設定値やアラームの状態を確認することができます。今は特にメモリに負荷はかけていないので状態が`ok`になっていますね。
![アラームok状態.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/08bf4b40-d81d-d884-b95b-cafaf0e4ea5c.jpeg)


- 試しにメモリに負荷をかけてアラームが出るか確認してみましょう。

今回はStressという負荷テストツールを用います。
まずはStressをインストールしていきます。

```bash
$ sudo amazon-linux-extras install -y epel
$ sudo yum -y install stress
```

- どのくらいのメモリを確保すればエラーが出るかtopコマンドにより確認します。

```bash
$ top
# 中略
KiB Mem :   454044 total,   275236 free,   108184 used,    70624 buff/cache
```
使用していないメモリが270,000 KiBくらいありそうなので、このメモリの分を確保してしまいます。

```
$ stress -m 1 --vm-bytes 270000000 --vm-hang 0 -q &
```

しばらくするとCloudWatchにてエラーが出てきました。
![アラームエラー状態.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/d29ede72-45b4-e03c-9a3e-3c7300ffa556.jpeg)

グラフを見ると、80%以上行っていることがわかります。
![Coudwatch エラーグラフ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/f571b70c-e2a1-e425-e6c6-492ad24d640f.jpeg)

確認できたので、processをkillしておきます。

```
$ jobs
[1]+  実行中               stress -m 1 --vm-bytes 270000000 --vm-hang 0 -q &
$ kill %1
```

これで以上になります。
ここまで読んでくださりありがとうございました。
少しでもみなさんのお力になれたら幸いです！

p.s.
このアラームをSlackに通知したいという場合は[AWSのイベントをslackに通知する](https://qiita.com/hiroaki-u/items/d275d406f6405c0a5208)も参考にしてみてください！！

## 参考文献
- [デフォルトでCloudWatchで監視できるEC2のパラメーター](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html)
- [ストレスコマンドでメモリに負荷をかける](https://nets-tip.com/?p=90)