AWS CloudWatchでディスク容量とメモリ使用量を監視&アラート時に通知設定手順


CloudWatchでディスク容量やメモリ使用量まで含めて監視設定しようと思うたびにあっちこっちのサイトを見て時間を浪費してしまっていたので手順を記載します。
Linuxサーバで構築している前提の話です。


## おおまかな手順
1. EC2インスタンスにsshで入る
2. perlモジュールのインストール
3. curlコマンドを実行してモニタリングスクリプトをダウンロード
4. ダウンロードしたモニタリングスクリプトをインストール
5. IAMユーザーを作成
6. 認証を設定
7. Cronを設定
8. 通知用SNSを作成
9. アラートの作成


## 1. EC2インスタンスにsshで入る

使っているec2サーバ内にsshコマンドで入ります。
![スクリーンショット 2021-10-26 1.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/983eaba5-a440-37a0-3caf-a9c9ecb05903.png)


## 2. perlモジュールのインストール

サーバの情報をCloudWatchへ送る際にそれぞれ必要なモジュールが存在するためにインストールします。

```
sudo yum install perl-Switch perl-Sys-Syslog perl-LWP-Protocol-https perl-DateTime
sudo yum install gcc make perl-CPAN perl-Time-HiRes perl-XML-Parser mod_perl cpanminus
```

## 3. curlコマンドを実行してモニタリングスクリプトをダウンロード

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

## 4. ダウンロードしたモニタリングスクリプトをインストール

解凍とzipファイルの削除とディレクトリ移動を同時に行なっています。

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

失敗するとわかっていますがここで動作テストしてみます。
CloudWatch にデータを送信しない簡単なテストです。

```
./mon-put-instance-data.pl --mem-util --verify --verbose
```


↓

失敗します。
EC2インスタンスとIAMロールが関連づけられていないことが原因です。


```
MemoryUtilization: 9.57435398335551 (Percent)
No credential methods are specified. Trying default IAM role.
ERROR: No IAM role is associated with this EC2 instance.
For more information, run 'mon-put-instance-data.pl --help'
```

## 5. IAMユーザーを作成

AWSのIAMのサービスページにて「ユーザを追加」を選択

![スクリーンショット 2021-10-26 1.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/21f87d6b-4ad8-398e-e89a-e02f327355ed.png)


ユーザ名は今回は「CloudWatch」にします。
AWS 認証情報タイプの選択はアクセスキーさえチェックが入っていればOKですがここでは2つとも入れてます。
次のステップへ。

![スクリーンショット 2021-10-26 1.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/eca703d7-1db3-d454-2cdc-1b295a1f8ffd.png)


既存のポリシーを直接アタッチを選択し、「CloudWatchAgentAdminPolicy」を選択し次のステップへ。

![スクリーンショット 2021-10-26 1.36.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/0a72fb7d-60ca-77a0-33c6-22e78d5a2e98.png)


タグはいらないのでスキップしてユーザの作成をする

![スクリーンショット 2021-10-26 1.38.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/1c4d8b04-711f-eb29-e592-43d71bf29332.png)

「.csvのダウンロード」を押して作成したIAMの情報を保存
この画面で出てくるアクセスキーIDとシークレットアクセスキーは後ほど使用します。

![スクリーンショット 2021-10-26 1.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/cee47ce5-b2e3-66ab-621c-168430e226b1.png)


## 6. 認証を設定

IAMユーザーを作成したら、アクセスキーIDとシークレットアクセスキーを設定します。解凍されたファイルの中に、awscreds.templateというファイルがあるのでawscreds.confという名前でコピーして編集します。 先程追加したIAMユーザーのアクセスキーIDとシークレットキーを設定します。

```
cp awscreds.template awscreds.conf
vi awscreds.conf

# 先ほど保存したアクセスキーIDとシークレットアクセスキーを挿入します
AWSAccessKeyId=[アクセスキーID]
AWSSecretKey=[シークレットキー]
```

ここで動作確認をします。
さきほどと同じようにCloudWatch にデータを送信せずに簡単なテストを実行します。


```
./mon-put-instance-data.pl --mem-util --verify --verbose
```

↓

動作テストに成功します

```
MemoryUtilization: 11.2770928669156 (Percent)
Using AWS credentials file <./awscreds.conf>
Endpoint: https://monitoring.ap-northeast-1.amazonaws.com
Payload: {"MetricData":[{"Timestamp":1635180338,"Dimensions":[{"Value":"i-025913bb8d07e4678","Name":"InstanceId"}],"Value":11.2770928669156,"Unit":"Percent","MetricName":"MemoryUtilization"}],"Namespace":"System/Linux","__type":"com.amazonaws.cloudwatch.v2010_08_01#PutMetricDataInput"}

Verification completed successfully. No actual metrics sent to CloudWatch.
```


## 7. Cronを設定

cron スケジュールを設定します。crontab -e コマンドを使用して crontab の編集を開始します。5 分ごとにメモリとディスクスペースの使用状況を CloudWatch にレポートします。

```
crontab -e

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

```

## 8. 通知用SNSを作成

AmazonSNSのサービスページにて「トピック作成」を選択

![スクリーンショット 2021-10-26 1.48.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/3a44a928-7153-57c1-369e-d591cd328b5b.png)


タイプをスタンダードにして名前と表示名はわかりやすい名前にします。
「プロジェクト名_alert」とかで自分は結構付けます。
トピックの作成をします。

![スクリーンショット 2021-10-26 1.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/05e71ba7-9e62-d10c-ada6-005b91ad84a3.png)

次に通知の送信先を設定するためにサブスクリプションの作成をします。
「サブスクリプションの作成」を選択します。

![スクリーンショット 2021-10-26 1.49.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/95e5be86-6588-d04a-fc7d-7af91372d595.png)

トピックARNはデフォルトのままでプロトコルをEメールにします。
エンドポイントには設定したいメールアドレスを設定します。
サブスクリプションの作成。

![スクリーンショット 2021-10-26 1.50.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/bdf2839d-8d7f-4c11-5e0a-8c4235965925.png)

サブスクリプションが作成されましたが、ステータスがまだ保留中です。
設定したメールアドレスに確認メールが届いていますのでそちらを許可します。

![スクリーンショット 2021-10-26 1.50.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/e1ca56ec-64c0-e7f5-c3c2-a41293a54bed.png)


このようなメールが届いていますので「Confirm subscription」を押して許可します。

![スクリーンショット 2021-10-26 2.00.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/248ad2bc-d4e1-1ff8-d426-02a20c48f039.png)

この画面が出てればOKです。

![スクリーンショット 2021-10-26 2.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/a520b3c4-6494-1121-2e99-5e0b140f3b74.png)


## 9. アラートの作成

やっとアラートの設定です。
CloudWatchのサービスページにてアラームの作成を選択します。

![スクリーンショット 2021-10-26 2.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/971e2040-9542-83c1-f4d9-fcd0203c3e6a.png)


メトリクスの選択画面でSystem/Linuxの項目ができていることがわかります。


![スクリーンショット 2021-10-26 2.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/dad00dca-51ad-8aa7-293e-db40cdcf3008.png)

DiskSpaceUtilization（ディスク使用率）やMemoryUtilization（メモリ使用率） をメトリクスとして選択できるようになっています。

![スクリーンショット 2021-10-26 2.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/d46672a2-2fe0-1026-a985-9b0e4a9a1252.png)


統計を最大にして期間はデフォルト最短の5分にします。
1分にしても拡張アラート（有料）にしていないと1分ごとには測定してくれないのと無闇に欠落データをつくってしまって正確な測定結果が得られない可能性があるため5分推奨です。

![スクリーンショット 2021-10-26 2.11.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/9bb4b4a4-195b-f0cd-d309-aa3f1d27f52d.png)

今回はディスク使用率90%以上になるように設定します。
欠落データは無視するようにします。

![スクリーンショット 2021-10-26 2.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/5824a151-2bd1-76a4-f088-ae32b9a514f2.png)


さきほどAmazon SNSで設定したトピックを選択してアラート時の通知先設定をします。
他の設定は特に不要であれば次へ。

![スクリーンショット 2021-10-26 2.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/c5abe1b1-83d5-74c9-f3b5-37139445069a.png)

名前と説明を入力し次へを選択し内容を確認してアラームの作成

![スクリーンショット 2021-10-26 2.16.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/03f392c0-5b0a-e918-8bfd-a8780700457d.png)

## アラート作成まで完了

これで以上になります。
作成直後は状態がデータ不足ですが5分ごとにメトリクスをサーバから送信しているため5分後に状態がOKかアラートになるかと思います。

![スクリーンショット 2021-10-26 2.18.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/bc5ff0f4-7bbb-09bc-2ee6-dcad62cbb24f.png)

## 参考
・[AWS CloudWatchでディスク容量チェック](https://labs.septeni.co.jp/entry/20141212/1418321528)
・[CloudWatchでリソースを監視する手順。メモリやディスクの使用率を可視化しよう！](https://www.site24x7.jp/blog/cloudwatch-resource-monitoring/)