CloudWatch Logsを使ってログを集める！

# CloudWatch Logsを試してみる

先月発表されたCloudWatch Logsを今更ながら試してみます。

* [Amazon Web Services ブログ: 【AWS発表】Amazon CloudWatchによるOSやログファイルの蓄積とモニタリング機能の提供](http://aws.typepad.com/aws_japan/2014/07/cloudwatch-log-service.html)
* [Quick Start: Install and Configure the CloudWatch Logs Agent on an Existing EC2 Instance - Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/QuickStartEC2Instance.html)

CloudWatch Logsはまだ米国東部(北バージニア)リージョンしか対応していませんが、ログを送る側はどのリージョンでも構いません。
今回は、東京リージョンのインスタンスのログをバージニアのCloudWatch Logsに流し込んでみます。



## インストール
インストールの方法は3つほど提供されています。

1. 既存のインスタンスにインストールする
    * [Quick Start: Install and Configure the CloudWatch Logs Agent on an Existing EC2 Instance - Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/QuickStartEC2Instance.html)
2. 新規EC2の起動時にインストールを行う（UserDataに設定）
    * [Quick Start: Install and Configure the CloudWatch Logs Agent on a New EC2 Instance - Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/EC2NewInstanceCWL.html)
3. OpsWorks＋Chefを使用してインストールを行う
    * [Quick Start: Install the CloudWatch Logs Agent Using AWS OpsWorks and Chef - Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/QuickStartChef.html)
4. CloudFormationを使用してインストールを行う
    * [Quick Start: Install the CloudWatch Logs Agent Using AWS OpsWorks and Chef - Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/QuickStartChef.html)


今回は、1の既存のインスタンスに設定してみます。


```wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py```

```
[ec2-user@ip-xxx-xx-xx-xxx ~]$ wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py
--2014-08-20 08:02:59--  https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py
Resolving s3.amazonaws.com (s3.amazonaws.com)... 207.171.187.117
Connecting to s3.amazonaws.com (s3.amazonaws.com)|207.171.187.117|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 44028 (43K) [application/x-python]
Saving to: ‘awslogs-agent-setup.py’

100%[==============================================================================>] 44,028       217KB/s   in 0.2s

2014-08-20 08:03:00 (217 KB/s) - ‘awslogs-agent-setup.py’ saved [44028/44028]
```

```sudo python ./awslogs-agent-setup.py --region us-east-1```

今回は、ディフォルトで設定されている /var/log/message と、Apacheのログも送ってみることにします。

```
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo python ./awslogs-agent-setup.py --region us-east-1
Launching interactive setup of CloudWatch Logs agent ...

Step 1 of 5: Installing pip ...DONE

Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE

Step 3 of 5: Configuring AWS CLI ...
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]:

Step 4 of 5: Configuring the CloudWatch Logs Agent ...
Path of log file to upload [/var/log/messages]:
Destination Log Group name [/var/log/messages]:

Choose Log Stream name:
  1. Use EC2 instance id.
  2. Use hostname.
  3. Custom.
Enter choice [1]: 1

Choose Log Event timestamp format:
  1. %b %d %H:%M:%S    (Dec 31 23:59:59)
  2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36)
  3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54)
  4. Custom
Enter choice [1]: 3

Choose initial position of upload:
  1. From start of file.
  2. From end of file.
Enter choice [1]:
More log files to configure? [Y]:
Path of log file to upload [/var/log/messages]: /var/log/httpd/access_log
Destination Log Group name [/var/log/httpd/access_log]:

Choose Log Stream name:
  1. Use EC2 instance id.
  2. Use hostname.
  3. Custom.
Enter choice [1]: 2

Choose Log Event timestamp format:
  1. %b %d %H:%M:%S    (Dec 31 23:59:59)
  2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36)
  3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54)
  4. Custom
Enter choice [1]: 3

Choose initial position of upload:
  1. From start of file.
  2. From end of file.
Enter choice [1]: 1
More log files to configure? [Y]: N

Step 5 of 5: Setting up agent as a daemon ...DONE


------------------------------------------------------
- Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
- You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=us
-east-1#logs:
- You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
- To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
- You can rerun interactive setup using 'sudo ./awslogs-agent-setup.py --region us-east-1 --only-generate-config'
------------------------------------------------------
```

インストールはとても簡単ですね。

## ログを確認してみる
![スクリーンショット 2014-08-20 17.18.57.png](https://qiita-image-store.s3.amazonaws.com/0/18582/65cd9ef1-0ec8-9b36-f2c9-14476bf87af3.png)

2つのログが取得できています。

![スクリーンショット 2014-08-20 17.19.06.png](https://qiita-image-store.s3.amazonaws.com/0/18582/c183e4c8-d174-6c36-54b4-c0bb2696ef48.png)

/var/log/message のログです。こちらはStream NameにUse EC2 instance id　を指定したものです。

![スクリーンショット 2014-08-20 17.19.12.png](https://qiita-image-store.s3.amazonaws.com/0/18582/bd9fb41f-4192-cc21-07ba-287afe0da366.png)

ログの中身を見ることができます。

![スクリーンショット 2014-08-20 17.19.21.png](https://qiita-image-store.s3.amazonaws.com/0/18582/0decfa8f-d85c-ea06-3462-57a4a89e2410.png)

こちらは、/var/log/httpd/access_log になります。Apacheのログファイルを送っています。　Stream NameにはUse hostname　を選択しました。

![スクリーンショット 2014-08-20 17.19.26.png](https://qiita-image-store.s3.amazonaws.com/0/18582/d6dc1fef-062e-1935-8049-deb50a8ff4b6.png)

すべてのログがアップされているようです。

## 注意点
Log Agentは自動で起動するようになっていないため、再起動した時に停止してしまうことに注意してください。

```
[ec2-user@ip-xxx-xx-xx-xxx init.d]$ chkconfig --list | grep awslogs
awslogs         0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

```
[ec2-user@ip-xxx-xx-xx-xxx init.d]$ sudo chkconfig awslogs on
[ec2-user@ip-xxx-xx-xx-xxx init.d]$ chkconfig --list | grep awslogs
awslogs         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

これで、自動起動の設定ができました。

## 感想
Fluentdなどを使用して、ログを収集している人も多かったかと思いますが、とても簡単にログを集めることができるようになりました。

CloudWatch Logsでは、フィルタを作成したり、アラートを設定したりできるようです。この辺りの機能はまた試して更新したいと思います。

残念な点は以下のとおり

* ログの検索ができない
* ログを横断的に扱えない

CloudWatch Logsからログを取得するAPIもあるようなので、ログをCloudWatch Logsを使用して上げてAPIを使用して可視化とか面白いかもしれません。

CloudWatch Logsにデータを投入するFluentd Pluginもあるようなので次回はそちらを試してみようと思います。