【AWS】CloudWatchでApacheのログを監視する

こんにちは。最近AWSを学習し始めた者です。

最近CloudWatchを触れたのですが、
私みたいなインフラ自体あまり詳しくない人間にとっては"ログの監視"という文化から知る必要があり、いろんなサイトを回りながら学んだことをまとめます。

# Apacheのログとは？
この説明がわかりやすかったです。
>ブラウザでWebサイトにアクセスすると、サーバー上で稼働しているApacheがHTMLコンテンツをブラウザに返しますが、それと同時にアクセス記録を残します。
その記録が残されるファイルがログファイルです。この記録を調べることで、「本当にサーバーにHTTPアクセスがあったかどうか」「リクエストに対して正常に応答できているか」などの情報が分かります。
[ログの見方](https://knowledge.sakura.ad.jp/3424/ "ログの見方")

要するに
・誰が（どのIPアドレス）がアクセスしているのか
・変な奴が何百回もアクセスしてないか
・エラーなくちゃんと動いているか
などを調べるためにログを監視するということですね。
（もちろん他にもたくさんあるでしょうけど）


Apacheのログはいくつか種類があるようですが、今回は以下の2つを監視する設定をしたいと思います。

- アクセスログ
いつ誰が何のページにアクセスしたのかを記録するログ

- エラーログ
リクエストの結果がエラーになったものだけが記録されるログ。
このログを見ると、サーバに問題が起きていないかを確認できる。
設定やリンクの間違いなどに気付けることもある。

ちなみにログ監視の設定が完了すると、
CloudWatchのコンソール画面からこんな感じでログの確認ができます。
![スクリーンショット 2021-02-03 21.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/642f49e8-377c-4c3b-223f-cab6a19a570d.png)

↑これはアクセスログですが、アクセスログの見方はこのサイトがわかりやすかったです。
>![スクリーンショット 2021-02-03 22.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/1fcbd324-1ad8-0d47-7a1a-5a57c2bed90d.png)
>
| 項目 | 説明 |
|:-:|:-:|
|  リクエスト元IPアドレス |  リクエストを送ったパソコンや携帯端末のIPアドレスが記録されます。 |
|  アクセスされた日時 | サーバーがリクエストを受け取り、HTMLコンテンツを返した日時になります。  |
|  アクセスされたファイル | サーバー上のどのファイルにアクセス要求があったかが分かります。  |
|  ステータスコード | 200の場合は「正常」です。これが404だったらNotFound、つまりファイルが見つからなかったというエラーになるし、500だったらInternalServerErrorになります。|
| UserAgent  |  アクセスしてきたデバイスの情報が分かります。OSやブラウザの種類、バージョンなどが書かれています。 |

>[ログの見方](https://knowledge.sakura.ad.jp/3424/ "ログの見方")



# CloudWatchの設定手順

### 環境
- パソコン：Mac
- AMI：Amazon Linux 2

### 前提
- Apacheのインストール、設定が完了していること。
- EC2にSSH接続済みであること。

### 構成図
めちゃくちゃシンプルな構成です。
Wordpressをインストールしており、そこにアクセスされたログを収集する設定をしていきます。

![スクリーンショット 2021-02-03 22.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/ee667502-2cf8-6656-4cff-9d16dbaadf28.png)


## ①awslogsをインストールする

CloudWatchにはCPUやメモリの使用率などを監視する`リソース監視`はデフォルトで設定されていますが、
ログ監視の場合は`awslogs`をインストールして自身で設定を追加する必要があります。

EC2にSSH接続している状態で、以下のコマンドでインストールします。

```
[ec2-user@ip-10-0-1-227 ~]$ sudo yum install awslogs
```

いろいろインストール画面が表示され最後に`Is this ok [y/d/N]:`と表示されます。

```
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                     | 3.7 kB  00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ awslogs.noarch 0:1.1.4-3.amzn2 を インストール
--> 依存性の処理をしています: aws-cli-plugin-cloudwatch-logs のパッケージ: awslogs-1.1.4-3.amzn2.noarch
--> トランザクションの確認を実行しています。
---> パッケージ aws-cli-plugin-cloudwatch-logs.noarch 0:1.4.6-1.amzn2.0.1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

======================================================================================================================================================
 Package                                           アーキテクチャー          バージョン                           リポジトリー                   容量
======================================================================================================================================================
インストール中:
 awslogs                                           noarch                    1.1.4-3.amzn2                        amzn2-core                    8.2 k
依存性関連でのインストールをします:
 aws-cli-plugin-cloudwatch-logs                    noarch                    1.4.6-1.amzn2.0.1                    amzn2-core                     62 k

トランザクションの要約
======================================================================================================================================================
インストール  1 パッケージ (+1 個の依存関係のパッケージ)

総ダウンロード容量: 70 k
インストール容量: 243 k
Is this ok [y/d/N]:
```

`yキー`を押してインストールを進めます。

```
Downloading packages:
(1/2): aws-cli-plugin-cloudwatch-logs-1.4.6-1.amzn2.0.1.noarch.rpm                                                             |  62 kB  00:00:00
(2/2): awslogs-1.1.4-3.amzn2.noarch.rpm                                                                                        | 8.2 kB  00:00:00
------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                  506 kB/s |  70 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : aws-cli-plugin-cloudwatch-logs-1.4.6-1.amzn2.0.1.noarch                                                               1/2
  インストール中          : awslogs-1.1.4-3.amzn2.noarch                                                                                          2/2
  検証中                  : awslogs-1.1.4-3.amzn2.noarch                                                                                          1/2
  検証中                  : aws-cli-plugin-cloudwatch-logs-1.4.6-1.amzn2.0.1.noarch                                                               2/2

インストール:
  awslogs.noarch 0:1.1.4-3.amzn2

依存性関連をインストールしました:
  aws-cli-plugin-cloudwatch-logs.noarch 0:1.4.6-1.amzn2.0.1

完了しました!
[ec2-user@ip-10-0-1-227 ~]$
```

`完了しました！`と表示されればインストール完了です。

## ②awslogsの設定をいじる

`awslogs`ディレクトリまで移動します。

```
cd /etc/awslogs
```

このディレクトリには4つの設定ファイルがあります。

```
[ec2-user@ip-10-0-1-227 awslogs]$ ls -l
合計 20
-rw------- 1 root root   55  2月  3 07:25 awscli.conf
-rw-r--r-- 1 root root 8355  7月 25  2018 awslogs.conf
drwxr-xr-x 2 root root    6  7月 25  2018 config
-rw-r--r-- 1 root root  147  7月 25  2018 proxy.conf
```

まず`awscli.conf`を編集します。

```
sudo vi awscli.conf
```

ログ転送先のリージョンが`us-east-1`になっているので、現在のリージョンに書き換えます。
ここでは`ap-northeast-1`に修正し、`:wq`で上書き保存します。

```
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1 ←ここを修正
```

続いて`awslogs.conf`を編集します。

```
sudo vi awslogs.conf
```

英語で長い説明が出てきます。

```
# ------------------------------------------
# CLOUDWATCH LOGS AGENT CONFIGURATION FILE
# ------------------------------------------
#
# --- DESCRIPTION ---
# This file is used by the CloudWatch Logs Agent to specify what log data to send to the service and how.
# You can modify this file at any time to add, remove or change configuration.
#
# NOTE: A running agent must be stopped and restarted for configuration changes to take effect.
#
# --- CLOUDWATCH LOGS DOCUMENTATION ---
# https://aws.amazon.com/documentation/cloudwatch/
#
# --- CLOUDWATCH LOGS CONSOLE ---
# https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logs:
#
# --- AGENT COMMANDS ---
# To check or change the running status of the CloudWatch Logs Agent, use the following:
#
# To check running status: service awslogs status
# To stop the agent: service awslogs stop
# To start the agent: service awslogs start
# To start the agent on server startup: chkconfig awslogs on
#
# --- AGENT LOG OUTPUT ---
# You can find logs for the agent in /var/log/awslogs.log
#
```

冒頭を翻訳するとこんな感じです。
>
--- DESCRIPTION --- ---.
 このファイルはCloudWatch Logsエージェントがサービスに送信するログデータの種類や方法を指定するために使用します.
 このファイルはいつでも変更可能で, 設定の追加,削除,変更を行うことができます.
[DeepL](https://www.deepl.com/translator "DeepL")

どうやらこのファイルで詳しいログの設定ができるようです。

では一番下までスクロールします。

```
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages
```
デフォルトで`/var/log/messages`の設定が記述されています。
この設定についてはこのサイトの説明がわかりやすかったです。

>UNIX系のOS（LinuxとかMacとか）で使われる、
あれやこれやのログが記録されているファイルです。
もう少しざっくり書くと 特定用途「以外」のログを記録するファイルになります。
>
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word14283.html "「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典")


この下に`アクセスログ`と`エラーログ`を取得するための設定を追加し`:wq`で上書き保存します。

```
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages

[HttpAccessLog]
file = /var/log/httpd/access_log
log_group_name = HttpAccessLog
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S

[HttpErrorLog]
file = /var/log/httpd/error_log
log_group_name = HttpErrorLog
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S
```

| key | value |
|:-:|:-:|
| file | どのファイル（ログ）を送るのかを指定するフィールド。今回はApacheのログを送りたいので`httpd`配下のログファイルを指定している。 |
| log_group_name | ログは特定の１箇所から送られるとは限らず、複数の場所から送られることもある。なので同じ種類のログは`log_group_name`で指定して一纏めにすることができる。 |
| log_streamname | ここはEC2インスタンスのIDを指定しているが、例えばEC2インスタンスが複数あり、それぞれから同じログを送信する場合、まず`log_group_name`は同一で一纏めにすることができ、かつ`log_streamname `でログの送信元を判別できるようになる。|
| datetime_format | 送信時間の書き方ですね |

[Amazon CloudWatch Logs の概念](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CloudWatchLogsConcepts.html "Amazon CloudWatch Logs の概念")



## ③IAMロールを作成する
EC2からCloudWatchにログを送信する権限を与えるためのIAMロールを作成します。

>IAMロールとは:
ユーザーやグループではなく、EC2などのAWSのサービスや他のアカウントに対してにAWS の操作権限を付与するための仕組みです。
>
[【AWS IAMとは？】初心者にもわかりやすく解説](https://www.wafcharm.com/blog/aws-iam-for-beginners/ "【AWS IAMとは？】初心者にもわかりやすく解説")

IAMのコンソールから`ロール` `ロールの作成`をクリックします。
![スクリーンショット 2021-02-03 18.54.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/c1dfce01-7822-3f35-2e46-587b776d163c.png)

`EC2`を選択し`次のステップ`をクリックします。
![スクリーンショット 2021-02-03 18.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/7519aedb-0204-f0ed-4cd0-2f2ba7548a60.png)

ポリシーは１から作る必要はなく、
AWSが用意している`CloudWatchAgentServerPolicy`を利用できます。

検索窓に`CloudWatchAgentServerPolicy`と入力し、検索結果にチェックをつけて`次のステップ`をクリックします。
![スクリーンショット 2021-02-03 18.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/21a1e72f-0d8a-818a-efee-dd7e55c1c80f.png)

ロールの名前と説明を求められます。
今回はポリシー名と同じにして`ロールの作成`をクリックします。
![スクリーンショット 2021-02-03 19.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/325d0d3a-acb9-b782-a9f6-32dae3a9935d.png)

## ④作成したIAMロールをEC2にアタッチする
EC2のコンソール画面から該当のEC2インスタンスを右クリックし、
`セキュリティ` `IAMロールを変更`をクリックします。
![スクリーンショット 2021-02-03 19.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/7fb05bab-0224-5464-df06-548b71c1dc17.png)

先ほど作成したロールを選択し`保存`をクリックします。
![スクリーンショット 2021-02-03 19.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/ec1ef50d-a2a8-519a-9719-7467f8678a80.png)


## ⑤awslogsを起動する

以下のコマンドでawslogsのデーモンを起動します。

```
sudo systemctl start awslogsd
```

EC2を再起動しても再度自動で起動できるように以下のコマンドも入力します。
これですべての準備は完了です。

```
sudo systemctl enable awslogsd
```

## ⑥ログを確認する
CloudWatchコンソールの`ロググループ`をクリックし、`awslogs.conf`に追加したロググループが表示されていることを確認します。
![スクリーンショット 2021-02-03 20.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/d0e96eb2-bdf8-a0e2-c5da-2fea629d0c74.png)

試しに`HttpAccessLog`をクリックするとログストリーム（今回はEC2インスタンスのIDを指定している）が表示されます。
このログストリームをクリックします。
![スクリーンショット 2021-02-03 21.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/a754bd9e-9161-5644-e240-cc16de5c6969.png)

ログの一覧が表示されます。
![スクリーンショット 2021-02-03 21.54.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/27a88771-9bc1-3e28-7863-16329763e2d6.png)

# 最後に
とりあえずログの送信方法の学習でしたが、実務ではこのログをどう見るのかが求められてくるのでしょう。
それはまた必要になったタイミングで学びたいと思います。

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

![スクリーンショット 2021-02-04 21.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/f06f0d70-3663-82fa-1bd1-ba19f01c695b.png)