CloudWatch ログの監視

##目的
ログの監視をCloudWatchで設定

EC2にインストールされたApacheのアクセスログをCloudWatchログに送信し、確認まで行います。
**Apache(アパッチ)**
→HTTPリクエストを受け取ったら何かしらのレスポンスを返すソフトウェアのこと

https://qiita.com/tr76aquarius/items/86d98cd9839af63f89a7

##注意
EC2を立ち上げた時点でCPU使用率やネットワーク入出力など、基本的なメトリクス項目など値の変化のグラフはデフォルトでCloudWatchに送られているが、ログ監視の方はユーザーが設定する必要があります。

##CloudWatchエージェント
CloudWatchエージェントをEC2にインストールする
EC2にIAMロールをアタッチする
適切なネットワークルートを設定する(パブリックサブネット)
※プライベートサブネットはVPCエンドポイントを設定する必要あり

##実装
###準備
EC2インスタンス(Test-EC2)を起動、Apacheをインストールした状態まで進め、Test-EC2にec2-userでssh接続(ログイン)します
###CloudWatch Logs
インストールコマンド

```console
sudo yum install awslogs
```
インストールが完了したら設定ファイル(awscli.conf、awslogs.conf)を開く

```console
cd /etc/awslogs/
sudo vi awscli.conf
# regionをap-northeast-1に変更し更新(esc → :wq)
sudo vi awslogs.conf
```

以下を[/var/log/messages]のlog_group_nameの下に貼り付けし更新

```conf
[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
```
####※awslogs.confの簡単な説明
この設定ファイルはCloudWatch Logs Agentによって設定されています。
どのようなログをどのようにCloudWatchに送るか設定されています。
このファイルを修正する事でさまざまな変更ができる。
変更した際はCloudWatch Logs Agentを再起動する必要がある。

ドキュメントのリンク、Agentコマンドの説明

[ラベル(名前)]
file = どのファイルをCloudWatch Logsに送りつけるか指定
log_group_name = ロググループの名前
log_stream_name = {instance_idという変数を使用してどのEC2のログかラベルをつける}
datetime_format = 日時をどのように出力するか

buffer_duration = 送りつける間隔(5000=500秒)
initial_position = start_of_file (ログファイルの上から読み込んでいく設定、下からも設定できる)

```console
# EC2インスタンスが再起動しても自動的にawslogsdが立ち上がる設定
sudo systemctl enable awslogsd

# 起動
sudo systemctl start awslogsd
```

###補足
<details><summary>以下をEC2のユーザーデータに設定することでEC2作成時に自動でCloudWatch Logsにログ送信が可能となります。</summary><div>

```
#!/bin/bash
yum -y update
yum -y install httpd php
systemctl enable httpd.service
systemctl start httpd.service

mkdir /var/awslogs
mkdir /var/awslogs/state

yum -y install awslogs

cat > /etc/awslogs/awslogs.conf <<EOF
[general]
state_file = /var/awslogs/state/agent-state

[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
EOF

REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -n 's/.$//p')
sed -i "s/us-east-1/$REGION/g" /etc/awslogs/awscli.conf

systemctl enable awslogsd
systemctl start awslogsd
```
</div></details>

##IAMポリシーをアタッチ

先にIAM<IAM ロール作成
1、一般的なユースケースの選択(EC2)
2、ポリシーを検索(CloudWatchAgentServerPolicy)してチェックを入れる
3、タグは必要に応じて付与(今回はなし)
4、ロール名(CloudWatchAgentServerPolicy)、説明も同じ
→ 作成

EC2<インスタンス<インスタンスを選択し、右クリック<セキュリティ<IAMロールを変更を選択
先ほど作成したCloudWatchAgentServerPolicyに変更して保存する

※awslogsdがスタートするタイミングでIAMロールがついていないとログが送られない可能性があるので、awslogsdがスタートした後にIAMロールを設定した順番なら一旦再起動すると正常に送られる。

##ログを実際に確認
CloudWatch<ログ<ロググループ
/var/log/messages、HttpAccessLog、HttpErrorLogそれぞれ出力されている事を確認できます。
中身を確認すると、ログストリームがinstance_id(変数)で保存されてます。
更に開くとシステムログが確認できます。

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