Cloud Watch Logsで出力されたログを確認する方法

## Cloud Watch Logsで出力されたログを確認する方法
インスタンスのApacheのアクセスログ、エラーログを収集したいなあ、いい方法ないかなと思ったときに
Cloud Watch Logsで簡単に取得できることを知ったの記事として残しておきます。

### そもそもCloudWatch Logsとは？
CloudWatch LogsはAWSが提供しているログ監視サービスであり、主な機能は以下の通りです。

・インスタンスやサービスログの蓄積ログのモニタリング
・ログのフィルタリング
・ログデータのアーカイブ
・ログデータの分析（CloudWatch Logs Insights）
・ログのアラート化

これにより、基本的なログ監視サービスとしての機能を備えています。また、AWSサービスとの連携が容易であり、例えばCloudTrailなどのマネージドサービスログも数ステップで取得可能です。
同様に、蓄積したログをKinesisに投入してストリーミング処理するなどの応用的な活用も可能です。


### 前提条件
CloudWatch Logs を利用するには、以下の条件を満たす必要があります。

・AWS アカウントを作成している
・IAM ユーザーに CloudWatch Logs のアクセス権限を付与している


### 1.インスタンス(EC2)のログ収集

基本的なインスタンスからのログ取得方法を紹介します。
ここではAWS内にインスタンスが設置されているとして話を進めます。
以下はインスタンスの基本情報です。

・インスタンスタイプ：任意
・OS：Amazon Linux 2
・導入ミドルウェア：Apache

今回の例ではWebサーバとしてPublicIPアドレスを持ち、インターネット接続可能な状態と仮定します。
ただし、AWSの抽象化サービスはVPC(仮想ネットワーク)の外に存在しているため、閉域接続のサーバログ取得にはAWS PrivateLinkが必要です。
PrivateLinkはVPCにインターフェイスVPCエンドポイントを作成することで利用でき、セキュアでスケーラブルな方法でCloudWatchを接続できます。

### 2.IAM ロールの作成
CloudWatch Logs は、EC2 インスタンスからログを収集するために、IAM ロールを使用します。IAM ロールとは、AWS リソースにアクセスするための権限を付与するオブジェクトです。

- IAM ロールを作成するには、以下の手順で行います。
1.IAM コンソールを開きます。
2.「ロール」タブをクリックします。
3.「ロールの作成」をクリックします。
4.「ロールのタイプ」で「AWS サービス」を選択します。
5.「サービス」で「CloudWatch Logs」を選択します。
6.「ロールの名称」にロールの名前を入力します。
7.「ポリシー」で「CloudWatch Logs エージェントアクセス権限ポリシー」を選択します。
8.「ロールの作成」をクリックします。
9.IAM ロールの作成が完了したら、ロールの ARN をメモしておきます。

### 3.ロググループの作成
ロググループは、ログを論理的に分類するための単位です。
- ロググループを作成するには、以下の手順で行います。
1.CloudWatch Logs コンソールを開きます。
2.「ロググループ」タブをクリックします。
3.「ロググループの作成」をクリックします。
4.「ロググループ名」にロググループの名前(TestSV_Apache)を入力します。
5.「ロググループの説明」にロググループの説明を入力します。
6.「ロググループの作成」をクリックします。
7.ロググループの作成が完了したら、ロググループの ARN をメモしておきます。

### 4.ログストリームの作成
ログストリームは、ロググループ内のログを論理的に分類するための単位です。
- ログストリームを作成するには、以下の手順で行います。
1.CloudWatch Logs コンソールを開きます。
2.「ロググループ」タブをクリックします。
3.作成したロググループをクリックします。
4.「ログストリームの作成」をクリックします。
5.「ログストリーム名」にログストリームの名前(TestSV_Apache)を入力します。
6.「ログストリームの説明」にログストリームの説明を入力します。
7.「ログストリームの作成」をクリックします。
8.ログストリームの作成が完了したら、ログストリームの ARN をメモしておきます。

### 5.ログ収集エージェントのインストール
ログ収集エージェントは、EC2 インスタンスからログを収集するためのソフトウェアです。
- ログ収集エージェントをインストールするには、EC2 インスタンスに SSH 接続して行います。
1.EC2 インスタンスに SSH 接続します。
2.以下のコマンドを実行して、CloudWatch Logs Agent のインストールパッケージをダウンロードします。
```
wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/latest/amazon-cloudwatch-agent.rpm
```
3.以下のコマンドを実行して、インストールパッケージをインストールします。
```
sudo yum install amazon-cloudwatch-agent.rpm
```
### 6.設定ファイルの作成
- 以下のコマンドを実行して、ログ収集エージェントの設定ファイルを作成します。
```
sudo vi /etc/amazon/cloudwatch-agent/config.json
```

### 7.CloudWatch Logs エージェントの設定

CloudWatch Logs エージェントの設定は、/etc/awslogs/awslogs.conf ファイルで行います。
このファイルの設定例を以下に示します。
```
[Apache_AccessLog]
log_group_name = TestSV_Apache
log_stream_name = {instance_id}_accesslog
file = /var/log/apache2/access.log
datetime_format = %a %b %d %H:%M:%S %Y
initial_position = start_of_file
buffer_duration = 5000

[Apache_ErrorLog]
log_group_name = TestSV_Apache
log_stream_name = {instance_id}_errorlog
file = /var/log/apache2/error.log
datetime_format = %a %b %d %H:%M:%S %Y
initial_position = start_of_file
buffer_duration = 5000
```
- ロググループ名
ロググループ名は、CloudWatch Logs 上にロググループとして表示される名前になります。わかりやすい名称をつけるとよいでしょう。先に CloudWatch Logs にて作成し指定することもできます。

- ログストリーム名
ログストリーム名は、CloudWatch Logs に送信されるログの固有の名前になります。デフォルトでは、ロググループ名とインスタンス ID が連結されます。

- ファイル
ログを収集するファイルのパスを指定します。末尾にワイルドカードを使うこともできます。

- 日付フォーマット
ログからタイムスタンプを取得する日付フォーマットを指定できます。特に指定がなければデフォルトで結構です。

- 初期位置
ログファイルの読み込み開始位置を指定することができます。start_of_file(最初から全て)、またはend_of_file(新規のみ)を指定します。

- バッファ期間
ログイベントのバッチ期間を指定します。最小値は 5000ms で、デフォルト値は 5000ms です。特に指定がなければこのままで結構です。

前述の設定例では、Apache のアクセスログとエラーログを、TestSV_Apache というロググループに集約しています。

この設定では、ロググループ名とログストリーム名を同じにすることで、アクセスログとエラーログを同じロググループに集約しています。
また、日付フォーマットは、Apache のログファイルのフォーマットに合わせています。

- ログ収集エージェントの設定の注意点
ロググループ名は、CloudWatch Logs 上で一意となるようにする必要があります。
ログストリーム名は、ロググループ内で一意となるようにする必要があります。
ファイルパスは、ログファイルが存在するパスを指定する必要があります。
日付フォーマットは、ログファイルのフォーマットと一致するようにする必要があります。
ログ収集エージェントの設定が完了したら、ログ収集の確認を行います。CloudWatch Logs コンソールで、作成したロググループをクリックして、ログストリームにログが表示されていることを確認してください。

### ログ収集の確認
ログ収集が正常に行われていることを確認するには、以下の手順を実行します。

1. CloudWatch Logs コンソールで、作成したロググループをクリックします。
2. 「ログストリーム」タブをクリックします。
3. ログストリームにログが表示されていることを確認します。
ログ収集が正常に行われていれば、Apache のアクセスログとエラーログが表示されます。

### まとめ
CloudWatch Logs エージェントの設定方法について、Apache ログを例に解説しました。

CloudWatch Logs エージェントは、EC2 インスタンスからログを CloudWatch Logs に送信するための便利なツールです。
この記事を参考に、ぜひ CloudWatch Logs エージェントを活用して、EC2 インスタンスのログ収集を行ってみてください。

### 応用編

CloudWatch Logs エージェントは、ログの送信先として、CloudWatch Logs 以外にも、Amazon S3、Amazon Kinesis Data Firehose、Amazon Elasticsearch Service などを指定できます。
また、ログの収集条件や、ログの送信方法などをカスタマイズすることもできます。

以下の例は、CloudWatch Logs エージェントを応用した活用方法です。

- ログの集約
複数の EC2 インスタンスから生成されるログを、1 つのロググループに集約して管理することができます。

- ログの分析
CloudWatch Logs Insights を使用して、ログを分析することができます。

- ログの可視化
Amazon CloudWatch Dashboard を使用して、ログを可視化することができます。

ご自身の環境や目的に合わせて、CloudWatch Logs エージェントを活用してみてください。