【AWS】CloudWatchでログ監視し、アラーム状態となったらメール送信を行う

#■はじめに
CloudWatch、SNSトピックを利用してログに特定文字列が出力されたらアラーム発報し、メールを送信するところまで試しに構築してみたので手順をまとめました。

#■対象者
本記事はAWS初学者向けの情報共有として構築手順をまとめています。
また、自分用の手順メモでもあります。

#■構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/cd2a0ddd-9e01-8e6e-0531-cdc3d8e24e28.png)


 - EC2からCloudWatch logsへ/var/log/messagesを送信し監視対象とする。
 - CloudWatchは"ERROR"文字列を検知した場合、アラーム発報する。
 - アラーム発報すると関連付けられたSNSトピックは指定の宛先にメール通知を行う。

#■作業内容
大まかに以下。

1. EC2にCloudWatchエージェントのインストール
2. EC2にCloudWatch logsへログを送信するための権限を付与
3. CloudWatchメトリクス作成
4. CloudWatchアラーム作成
5. 検知、メール送信テスト


#■作業手順詳細

##1. EC2にCloudWatchエージェントのインストール

<details><summary>【インストール】</summary><div>

**1-1. EC2にteratermなどでログインし、以下コマンドを実行**

```
$ sudo yum install awslogs
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/f0f5d6b3-5ae4-ff1c-5c09-15cf3bd422b6.png)

Is this ok[y/d/N]
良いか聞かれるので y で Enter

インストール完了。

**1-2. 以下コマンドでファイル群確認**

```
$ cd /etc/awslogs
```
awscli.conf, awslogs.conf, config, proxy.confがあること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/b10b1685-2d85-e485-355c-35c048f9f9fe.png)

</div></details>

<details><summary>【awscli.conf編集】</summary><div>

**1-3. 以下コマンドでawscli.conf編集**

```
# vi awscli.conf
```
[default]タグにregionという項目があるので、us-east-1 から　ap-northeast-1 に変更する
※cloudwatchエージェントがどのリージョン(のEC2)で動作するのかを設定。今回は東京リージョン。

</div></details>

<details><summary>【awslogs.conf編集】</summary><div>

awslogs.confはどのようなログをCloudWatchに送るかとその方法を指定する
変更を加えた場合はCloudWatchエージェントの再起動が必要
デフォルトで/var/log/messagesの記述があるので今回は編集しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/f4db4ed1-ca99-1195-d512-3b9492828eea.png)

| 項目| 説明 |
|:-:|:-:|
| datetime_fomat  | 日時のフォーマット指定  |
| file  | どのファイルをCloudWatch logsに送るか指定  |
| buffer_duration  | 送信間隔をミリ秒で指定 もしくは32kbite出力で送信  |
| log_stream_name  | どのインスタンスのログかラベルをつけて表示する。 {instance_id}でインスタンスIDの変数が表示される |
| initial_position  | start_of_fileでログの上から読み、end_of_fileでログの下から読む  |
| log_group_name  | マネジメントコンソールに表示される名称を指定  |

**1-4. 以下コマンドでサービス自動起動設定する**

```
# systemctl enable awslogsd
```

**1-5. 以下コマンドを実行し、awslogsdを起動**

```
# systemctl start awslogsd
```

</div></details>

##2. EC2にCloudWatch logsへログを送信するための権限を付与

<details><summary>【IAMロール作成】</summary><div>

ロールをアタッチしないとログを送信できないので、ロールの作成、アタッチをする

**2-1. マネジメントコンソールでIAMを開く**

**2-2. IAM 左ペイン ロールを選択し、「ロールの作成」押下**

**2-3. ユースケースの選択 - EC2 を選択し、次のステップへ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/1bceabd7-ca53-faae-a75f-aee984a20b6c.png)

**2-4. ポリシーの作成の検索窓で「CloudWatchAgentServerPolicy」と入力し、表示されたものを選択して次のステップ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/fa5295f6-8540-12be-a161-56f8b8b73022.png)

**2-5. タグの作成は任意。次のステップへ**

**2-6. 確認画面のロール名とロールの説明は「CloudWatchAgentServerPolicy」と入力し、ロールの作成を押下**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/11298e09-aaa9-3d3a-2668-d6c687d843b4.png)

</div></details>

<details><summary>【IAMロールアタッチ】</summary><div>

**2-7. EC2画面で EC2を選択 - アクション - セキュリティ - IAMロールを変更を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/aee0c0fa-4714-7b3b-911c-0a6d1ae5160c.png)

**2-8. IAMロールに「CloudWatchAgentServerPolicy」と入力し、保存を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/cd90252d-9e03-5339-81ce-18e90f7b7231.png)

CloudWatch画面 - ロググループに ロググループ名「/var/log/messages」が表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/8ba66e80-4800-0434-09ab-12772f245643.png)

また、そのロググループ名「/var/log/messages」を選択 - ログストリームタブをみると
ログストリーム名はEC2のインスタンスIDとなっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/e80f895a-99f0-84e0-6283-220ca8ea980f.png)

awslogs.confのlog_stream_nameとlog_group_nameはここの表示名を指定している。

___

【補足 ログの保持期間】
ロググループのカラムに「保持」というものがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/220ab29c-55f5-d656-bfd4-ccb5dd10fadd.png)

これはロググループのログの保持期間。デフォルトでは期限なしで明示的に削除しないと保持される。
アクション - 保持設定を編集で変更可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/a321158c-c6f4-d6fb-71d5-1afb1b6f06f1.png)

___

</div></details>

##3. CloudWatchメトリクス作成

<details><summary>【ログ メトリクスフィルター作成】</summary><div>

**3-1. CloudWatch画面でロググループにチェックを入れ、アクション - メトリクスフィルターを作成を押下**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/bd204f0f-ee9d-6dc8-5213-698e8de6e262.png)

**3-2. 「パターンを定義」画面**
フィルターパターンに ERROR と入力し、Next押下
※フィルターパターンには検知文字列を入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/3a9c1df6-0b13-4072-4257-8d375b0b64fe.png)

**3-3. 「メトリクスの割り当て」画面**

・フィルター名を作成

| 項目名 | 入力値 |
|:-:|:-:|
| フィルター名  | test_messages_error  |

・メトリクスの詳細

| 項目名 | 値 | 説明 |
|:-:|:-:|:-:|
| メトリクスの名前空間  | test_messages_name_space  | 後述の「メトリクス」画面での表示名  |
| メトリクス名  | test_messages_name  | 後述の「メトリクス」画面での表示名   |
| メトリクス値  | 1  | 検知した場合にカウントアップする数値 |
| デフォルト値  | 未入力  | 検知していない期間中の値  |
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/5d4134c3-e598-c62d-2c16-53c307006187.png)

「保存」押下

**3-4. CloudWatch - メトリクス - すべてのメトリクスを選択**

先ほど作成したメトリクス名前空間、メトリクス名が存在する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/960ba708-d2e5-6ac6-cf1b-5f181705a093.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/b048884e-363c-5582-2af4-f654a17ce2b2.png)

</div></details>

##4. CloudWatchアラーム作成

<details><summary>【メトリクスの指定と監視条件設定】</summary><div>

**4-1. CloudWatch - アラーム - すべてのアラームを選択 - 「アラームの作成」押下**

**4-2. 「メトリクスと条件の指定」画面**
「メトリクスの選択」押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/ea9001e6-c22f-ae8d-a124-b642c8eb9db4.png)

**4-3. 「メトリクスの選択」画面**
カスタム名前空間 test_messages_name_space - ディメンションなしのメトリクス - メトリクス名 test_messages_name にチェックを入れ、「メトリクスの選択」押下

**4-4. 「メトリクス」画面**

・グラフ

| 項目 | 入力値 |
|:-:|:-:|
| 統計  | 合計  |
| 期間  | 1分  |
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/97dfe51a-999d-870e-07a6-bef9ad1de6e4.png)

・条件

| 項目 | 入力値 |
|:-:|:-:|
| しきい値の種類  | 静的  |
| xxxが次の時  | より大きい  |
| xxxよりも  | 5  |

1分で 6回 ERROR検出したら発報という設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/64232951-c04f-8771-b262-621736a13edf.png)


**4-5. 「アクションの設定」画面**

・通知

| 項目 | 入力値 |
|:-:|:-:|
| アラーム状態トリガー  | アラーム状態 |
| SNSトピックの選択  | 既存のSNSトピックを選択 ※なければ新しいトピックの作成を選択|
| 通知の送信先  | 任意のアドレス |

**4-6. 「名前と説明を追加」画面**

・名前と説明

| 項目 | 入力値 |
|:-:|:-:|
| アラーム名  | test_message_alarm |
| アラームの説明  | test_message_alarm |

**4-7. 「プレビューと作成」画面**

「アラームの作成」押下

___

【補足 SNSトピック新規作成】
新規作成した場合、以下のようなメッセージが出る。
トピック作成時に登録したアドレスに確認メールが送られるので Confirm subscriptionを選択すればよい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/dbd68d66-bd4b-2d9c-0fc4-288556c08c27.png)

___

</div></details>

##5. 検知、メール送信テスト

<details><summary>【コマンド実行、メール受信確認】</summary><div>

**5-1. EC2にログインし、以下コマンド実行**

```
# logger "ERROR"
```

※閾値が 「5より大きい」なので、6回以上実行

**5-2. アラーム状態が変化し、メールが送信されることを確認**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/cd6f3d8f-bb44-8be2-9f9b-eff1ada97bd1.png)

___

【補足 意図的にログに出力する方法】
以下の方法でも可能
1. CloudWatch - ロググループ - /var/log/messages を押下

2. ログストリームタブのIDを押下

3. アクション - ログイベントの作成 押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/ff59fe6e-6f05-8c85-44f5-1222b4d090f6.png)

4. 文字列を入力し「作成」押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/1eed5eca-0f06-7eec-228d-12c56341f594.png)

___

___

【補足 時刻表示の変更】
CloudWatchの各画面の時刻表示がUTCとなっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/ebd97b60-89b0-d723-ee3a-bd34f523e3f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/f66e0826-f78f-d1f1-a05a-ce817b153441.png)
※実行したのは夜だが昼間の時間になっている
　
◎ログの時刻表示変更
1.EC2にログインし以下を実行する。

```
# ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# vi /etc/sysconfig/clock

ZONE="UTC" を ZONE="Asia/Tokyo" に変更
```

※/usr/share/zoneinfo にある国に変更可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/e5509a94-9dd3-a96c-2a25-a1234395552f.png)

　
◎グラフの時刻表示の変更
1.以下を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/bb95eea7-9931-27e2-80f9-247013bf9240.png)
　
2.右上 Local time zone を選択し、時間に表示したい時刻に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1864204/7b2cac28-b639-c4dd-97ed-113a836c46c5.png)

___

</div></details>

以上

#■おわりに
___
この記事はAWS初学者を導く体系的な動画学習サービス
「CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
___