EC2をCloudWatchで監視する（前編）  ~ ログファイルを確認する ~

## はじめに
ログファイルやサーバーのメモリ使用率等を、サーバーに入って確認するのって少し面倒ですよね（僕だけだったらすみません笑）。
そんな人のために、今回はCloudwatchにてサーバーのログやメモリ使用率を確認するための方法をご紹介します。

内容が多くなってしまったので、記事を2つに分けていきます。
これからEC2の設定をCloudWatchで監視しようとしている方は是非参考にしてみてください。

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


**目次**

- [EC2の準備](#ec2の準備)
- [amazon-cloudwatch-agentの設定](#amazon-cloudwatch-agentの設定)
- [amazon-cloudwatch-agentの起動](#amazon-cloudwatch-agentの起動)
- [CloudWatchにてログを確認](#cloudwatchにてログを確認)
- [（おまけ）監視するログファイルを追加する](#おまけ監視するログファイルを追加する)

**補足**
>後編の記事にてメモリ使用率を確認する実装をする際も『EC2の準備』 〜 『amazon-cloudwatch-agentの起動』まで同じ操作になります。

## EC2の準備
- まずはEC2を立ち上げていきます。
今回は特別な設定はしていないので、AWSの画面はここでは割愛します。

- 対象のインスタンスにロールをアタッチしていきます。
今回は`CloudWatchAgentServerPolicy`というポリシーをアタッチしたロールを使用しました。

- サーバーに入って必要なソフトを入れていきます。
今回インストールするのは`amazon-cloudwatch-agent`です。

```bash
$ sudo yum install -y amazon-cloudwatch-agent
```

以上でEC2の事前準備完了です。
次にamazon-cloudwatch-agentの設定をしていきます。

## amazon-cloudwatch-agentの設定
amazon-cloudwatch-agentを設定する方法は大きく2つあります。

|方法|説明|
|:--|:--|
|ウィザードを用いる方法|サーバー内で設定する。質問に答えると設定ファイルを作成してくれる|
|AWS Service Managerを用いる方法|AWSのコンソール画面にて設定する|

今回はウィザードを用いる方法を記載していきます。

以下のコマンドを打つと、自動的に質問が出てきます。

```bash
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
```
ここから質問に回答する部分になります。
各質問に対して数字を選択してEnterを押すと、次の質問を表示してくれます
※ 本記事では明示的にすべての数字を打ち込んでいますが、default値を用いるときは数字の入力は不要です。

```bash

# どのOSでエージェントを使うか？ => 1. linux
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1

# EC2かオンプレか？ => 1. EC2
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1

# どのユーザーでagentを実行するか => 1. root
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1

# StatsD（OSSの数値レポーティングツール）デーモンを起動するか => 2. no
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2

# CollectD（OSSの数値レポーティングツール）からのメトリクスは必要か => 2. no
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
2

# 諸々のメトリクス（CPUやmemoryに関するもの）は監視したいか => 1. yes
# これでメモリ使用率等のカスタムメトリクスを取得することができます。
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1

# コアあたりのCPUを監視したいか？ => 1. yes
# Cloudwatchで追加料金が発生する可能性あり。
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
1

# イメージID, インスタンスID等も監視項目に入れたいか？ => 1. yes
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
1

# メトリクスをどれくらいの間隔で収集するか？ => 4. 60秒
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4

# どのメトリクスの設定が良いか？ => 2. Standard
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
2
```
ここまで回答すると設定ファイルがJSON形式で表示されます。
設定値を確認して問題ないか聞かれるので、問題なかったらyesをしていきます。
※ 2. noを選択すると再度`Which default metrics config do you want?（どのメトリクスの設定が良いか）`が聞かれます。他の質問は再度聞かれることはありません。謎です。

```bash
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1
```

ここからも引き続き質問がいくつかされるので、回答していきます。
Cloudwathc Log Agentはすでにあるかという質問がされます。今回はまだないので`2. no`を選択しました。

```bash
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2
```

この後、監視したいファイルについて、聞かれます。
今回は`/var/log/messages`をCloudWatchで監視してみます（もし監視したいファイルがない場合は`2. no`を選択してください）。

```bash
# 監視したいファイルはあるか？ => 1. yes
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
1

# ログファイルのpathは？ => /var/log/messages
Log file path:
/var/log/messages

# ロググループ名は？ => [messages]
Log group name:
default choice: [messages]
messages

# ログストリーム名は => messages
Log stream name:
default choice: [{instance_id}]
messages

# 追加で監視したいファイルはある？ => 2.no
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
```
これで監視したいファイルの設定をすることができました。

**【補足】** `/var/log/messages`について
>`/var/log/messages`はシステムに関するログを残すファイルになっています。
内容は`/etc/rsyslog.conf`にて設定をしています。


**【補足】** ロググループ、ログストリームについて
>CloudWatchでは監視する大枠をロググループとして、実際の監視内容をログストリームとして設定することができます。
ロググループの中に、ストリームがあるという階層構造になっているイメージです。


ここまで設定すると、設定ファイルの内容が再度表示されます。
また設定値が`/opt/aws/amazon-cloudwatch-agent/bin/config.json`に記録されます。
最後にSSM（Systems Manager）に設定を保存するか聞かれます。
今回は`2. no`を選択しました。
※ 設定をSSMに保存をする場合は別途ssm-agent等の設定が必要になります。

```bash
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2
Program exits now.
```
これでamazon-cloudwatch-agentの設定が完了です。

少し長くなってしまったので、一旦今回のウィザードでの僕の回答をまとめておきます。
※ 必要に応じてご自身で設定は変更してください。

|質問内容|回答|
|:--|:--|
|どのOSでエージェントを使うか？|1. linux|
|EC2かオンプレか？|1. EC2|
|どのユーザーでagentを実行するか？|1. root|
|StatsD（OSSの数値レポーティングツール）デーモンを起動するか？|2. no|
|CollectD（OSSの数値レポーティングツール）からのメトリクスは必要か？|2. no|
|諸々のメトリクス（CPUやmemoryに関するもの）は監視したいか？|1. yes|
|コアあたりのCPUを監視したいか？|1. yes|
|イメージID, インスタンスID等も監視項目に入れたいか？|1. yes|
|メトリクスをどれくらいの感覚で収集するか？|4. 60秒|
|どのメトリクスの設定が良いか？|2. Standard|
|ここまでの設定で問題ないか？|1. yes|
|Cloudwatch Log Agentはすでにあるか？|2. no|
|監視したいファイルはあるか？|1. yes|
|ログファイルのpathは？|`/var/log/messages`|
|ロググループ名は？|messages|
|ログストリーム名は？|messages|
|追加で監視したいファイルはあるか？|2. no|
|SSM（Systems Manager）に設定を保存するか|2. no|

この状態でamazon-cloudwatch-agentの設定は完了したのですが、まだCloudWatchの画面に行っても特にログは記録されていません。
ログを確認するには、amazon-cloudwatch-agentを起動する必要があります。
次項でamazon-cloudwatch-agentを起動させていきます。


## amazon-cloudwatch-agentの起動

- 以下のコマンドによりamazon-cloudwatch-agentを起動していきます。
これで先程設定したログファイル（今回は`/var/log/messages`）をCloudWatchにて確認できるようになりました。

```bash
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

# 以下各オプションの説明
# -a fetch-config: エージェントは最新バージョンのCloudWatchエージェント設定ファイルをロードする
# -m ec2: サーバーの種類を選択、オンプレの場合はonPremiseとなる
# -c file:[ファイルパス] 設定ファイルを指定、ssmにて保存しているファイルを指定する場合は-c ssm:[ssmのファイル名]となる
# -s :エージェントを開始
```

**【補足】** amazon-cloudwatch-agentの起動について
>systemctlを使って以下のようなコマンドをうっても、初回はうまくいきません。

>```
$ sudo systemctl start amazon-cloudwatch-agent
```
これは先程ウィザードにて設定したconfigファイルに関して、amazon-cloudwatch-agentがうまく読み込めていないためです。
amazon-cloudwatch-agentはCloudWatchのconfigファイル（本記事の場合はウィザードで作成したファイル）から`/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml`を作成します。そしてこのtomlファイルを元にログをCloudWatchに作成していきます。
デフォルトではtomlと同ディレクトリにあるconfigのjsonファイルを読み込もうとします。
試しに以下のように`/etc/.json`を作成すると、起動することができます。

 >```
$ sudo ln -s /opt/aws/amazon-cloudwatch-agent/bin/config.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
$ sudo systemctl start amazon-cloudwatch-agent
```


## CloudWatchにてログを確認
- それではCloudWatchの画面に行ってログを確認していきましょう。

ロググループのページに行くと、messagesというロググループがあることが確認できます。
![ロググループ画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/489ea831-0f98-be53-5bf7-29d70cfa362f.jpeg)

messagesに入ってログストリーム（こちらもmessages）を見るとログが確認できます。
![ログ一部.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/e8ef733e-aa22-792b-9045-3a6ccd7fb835.jpeg)

ここまでで、ログを確認する方法を見てきました。
最後におまけで監視するログファイルを追加する方法を見ていこうと思います。

## （おまけ）監視するログファイルを追加する
監視するログファイルを追加するには、amazon-cloudwatch-agentの設定ファイルに情報を追記して再起動する必要があります。
それでは手順を見ていきましょう！


- まずはCloudWatchの設定ファイルに情報を追記していきます。

今回はamazon-cloudwatch-agent自体のログである`/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log`を監視してみましょう。
`/opt/aws/amazon-cloudwatch-agent/bin/config.json`のfilesのcollect_listの部分に設定を追記していきます。

```bash:/opt/aws/amazon-cloudwatch-agent/bin/config.json
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/messages",
                                                "log_group_name": "messages",
                                                "log_stream_name": "messages"
                                        },
# ここから追記　
# ロググループとログストリームは"amazon-cloudwatch-agent"という名前で設定してきます。
                                        {
                                                "file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
                                                "log_group_name": "amazon-cloudwatch-agent",
                                                "log_stream_name": "amazon-cloudwatch-agent"
                                        }
# ここまで追記
                                ]
                        }
                }
        },
        "metrics": {
# （以下省略）
```

- 設定が完了したら、amazon-cloudwatch-agentを再起動していきます。

```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
```

CloudWatchを確認すると、新しいロググループが生成されていることが確認できました。
![ロググループ　追加ver.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/018125be-8073-1859-1f68-e8a2a0e1ac3c.jpeg)


以上となります！
ここまで読んでくださりありがとうございました。

## 参考文献
- [Cloudwatch、ウィザードを用いる方法（公式）](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html)
- [amazon-cloudwatch-agentのコマンドオプション参照（公式）](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-premise.html)
- [AWSServiceManagerを用いた設定方法](https://www.sunnycloud.jp/column/20210912-01/)