CloudWatch Agentでのログ監視


## はじめに
CloudWatch Agentを使用してログを収集し、エラーが発生した場合には通知を行いたいというユースケースが以前にもあって、やり方を忘れかけていたので備忘録として記事に残そうと思います。(最近AWSに触れていなかったせいもあり。。)
この記事では、EC2上のサンプルログをCloudWatch Logsに収集し、SNSを使用してエラーが発生した場合にメールを送信する方法を記載します。

## 手順
画像挿入

主に以下のような手順で実施していきます。

1. EC2インスタンスにCloudWatch Agentをインストールし、設定ファイルを作成。
2. CloudWatch Logsにロググループを作成し、設定ファイルで指定したログストリームにログを送信するように設定。
3. SNSトピックを作成し、通知先のメールアドレスを設定。
4. CloudWatch Alarmを設定し、SNSトピックを通知先に設定。

### EC2インスタンスの設定

#### IAM Roleの作成
まずはじめにEC2インスタンスからCloudWatchにログを収集するためのRoleを作成する必要があります。「CloudWatchAgentServerPolicy」をアタッチしたRoleを作成します。IAMコンソール上から作成可能なので細かい手順は飛ばします。
以下のようなRoleができればOKです。
![スクリーンショット 2023-04-26 15.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/7752489d-0c97-6dc9-4e40-fcf88a33396e.png)


https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html#create-iam-roles-for-cloudwatch-agent-roles

#### CloudWatch Agentのインストールと設定ファイルの作成
今回はamazon linuxのインスタンスを利用しますので手順は別OSを利用する場合はインストール方などは異なりますが、ドキュメントに記載してあるのでそれ通り行えば問題ないです。
##### CloudWatch Agentのインストール
  以下のコマンドでインストールを行います。
  ```bash
  　　$ sudo yum install amazon-cloudwatch-agent -y
  ```

##### 設定ファイルの作成
  今回はsample.log、sample_2.log(自分で作成した)の２つを同じSampleグループになるように設定しました。シスログを送ろうとしたのですが、amazon linux2023ではsystemd-journaldで管理しているぽいので`/var/log/messages`などがなかったです。。今回の目的とはずれてしまうので適当なlogを指定して試すことにしました。
```json
  {
      "logs": {
        "logs_collected": {
          "files": {
            "collect_list": [
              {
                "file_path": "/home/ec2-user/sample.log",
                "log_group_name": "Sample",
                "log_stream_name": "sample.log",
                "timezone": "UTC"
              },
              {
                "file_path": "/home/ec2-user/sample_2.log",
                "log_group_name": "Sample",
                "log_stream_name": "sample_2.log",
                "timezone": "UTC"
              }
            ]
          } 
        },
        "log_stream_name": "sample"
      }
}
```


https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html 

##### 起動
上記で作成したjsonファイルを指定してCloudWatch Agentを起動します。
```bash
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:configuration-file-path
$ sudo sysytemctl status amazon-cloudwatch-agent
```

#### CloudWatch上にロググループが作成されているかの確認
CloudWatchコンソール上でロググループが作成されログが収集できたかの確認を行います。
![スクリーンショット 2023-04-26 18.23.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/9313216b-5031-e7ee-9029-afd8e71f7505.png)

![スクリーンショット 2023-04-26 18.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/916cd432-22a8-9eb9-3dce-7d6910757c88.png)

どうやら無事にログを収集できたようです。


### SNSの設定
#### トピックの作成
下記画像のようにトピックを作成します。（動作確認したいだけなのでオプションは基本的にデフォルトにしました。）
![スクリーンショット 2023-04-26 18.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/7c048ac9-a891-cd7f-a989-26b034a12111.png)

#### サブスクリプションの作成
今回のケースはEmailで通知を行いたいのでプロトコルはEメールを選択します。エンドポイントに送信あてのメールアドレスを記載し、作成します。
![スクリーンショット 2023-04-26 18.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/1bfa09cb-4e0f-d7ad-c9f8-4fe43dc9ceb5.png)

※サブスクリプション作成後にメールが届くのでメール内の「Confirm subscription」リンクを押すことで正式に登録されます。


### CloudWatch Alarmの設定
#### メトリクスフィルターの作成
今回はsample.logにERROR文字列が書き込まれた際に通知が来る設定にします。
![スクリーンショット 2023-04-26 18.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/2dafd2c6-da24-d195-fa4e-f265f78e52ef.png)
![スクリーンショット 2023-04-26 18.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/207f2b42-268e-bf1e-b8ed-29639d1e495c.png)
![スクリーンショット 2023-04-26 18.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/05c235f5-e65e-48c2-1714-7ba3b6418023.png)
![スクリーンショット 2023-04-26 18.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/c11420c9-e2f1-bef5-38e9-f0e5f157646a.png)

#### アラームの作成
最後にアラームの作成を行います。ERROR文字列が1つでもあればアラームが発生するように設定します。通知先は先程作成したSNSトピックを設定し、完了です。
![スクリーンショット 2023-04-26 18.46.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/46289eb9-ad2f-1912-fe29-a6cd63df5b45.png)
![スクリーンショット 2023-04-26 18.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/473ad6b6-cd0a-d1ca-1d4f-5dbfa6160cc5.png)

#### メールの確認
今回はsample.logという自身で作成したlogファイルを元に行っているので、こちらのファイルに適当にERRORと記載して実際にアラーム状態となり、SNSからメールが届くかの確認を行います。
![スクリーンショット 2023-04-26 19.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/0fd94126-c716-1527-fe20-02f9099b6dcd.png)

　![スクリーンショット 2023-04-27 12.03.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289309/7ae0da36-b3b9-2cf8-559f-eceb3e83a9df.png)

無事にメールが届きました。

### まとめ
メールに細かいエラーの内容を表示させたいとかそういう要件がある場合はlambdaを使ったりしないとだめですが、エラーを通知するだけなら簡単にできそうです。