MacからNginxのログをS3に保存してAmazonAthenaで可視化する


## NginxのログをLTSV形式で出力

Nginxは既にインストール済みとします。
自分の場合は↓を参考にnginxのログをLTSV形式で出力するようにしました。

[nginxのログをLTSV形式で出力して、fluentd経由でMongoDBに保存する](http://qiita.com/key/items/038b7913b3bb0298c625)


**nginx.conf (抜粋)**

```
http {
    include /usr/local/etc/nginx/mime.types;

    log_format ltsv 'time:$time_iso8601\t'
                'remote_addr:$remote_addr\t'
                'request_method:$request_method\t'
                'request_length:$request_length\t'
                'request_uri:$request_uri\t'
                'https:$https\t'
                'uri:$uri\t'
                'query_string:$query_string\t'
                'status:$status\t'
                'bytes_sent:$bytes_sent\t'
                'body_bytes_sent:$body_bytes_sent\t'
                'referer:$http_referer\t'
                'useragent:$http_user_agent\t'
                'forwardedfor:$http_x_forwarded_for\t'
                'request_time:$request_time\t'
                'upstream_response_time:$upstream_response_time';

    server {
      listen 80;
      access_log /usr/local/var/log/nginx/access.log ltsv;
      error_log /usr/local/var/log/nginx/error.log;

```


## MacにFluentdをインストール

rubyのバージョンは2.4.1。
td-agentはインストーラ形式でも配布されていますが、Macのlaunchctlが慣れないのでgemでインストール。


```bash
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
```

```bash
gem install fluentd --no-ri --no-rdoc
```


```bash
fluentd --setup ./fluent
```

**Amazon S3 Output Plugin をインストール**

```bash
fluent-gem install fluent-plugin-s3
```


**fluent.conf**

```ruby
<source>
  @type tail
  format ltsv
  pos_file /usr/local/var/log/td-agent/access.log.pos
  path /usr/local/var/log/nginx/access.log
  tag nginx.access
</source>
<match nginx.access>
 @type copy
 <store>
   @type s3
   aws_key_id <S3へのアクセスキー>
   aws_sec_key <S3へのシークレットキー>
   s3_region ap-northeast-1
   s3_bucket yutoogi.logs

   s3_object_key_format %{path}/nginx/%{time_slice}_%{index}.%{file_extension}
   path logs
   time_slice_format %Y%m%d-%H%M%S
   buffer_path /usr/local/var/log/td-agent/buffer/nginx

   format json
   retry_wait 30s
   retry_limit 5
   flush_at_shutdown true
 </store>
 <store>
   @type stdout
 </store>
</match>

```

fluentd.confを設定後、td-agentを起動。
stdoutでも出力しているので


```bash
cd fluentd
fluentd -c ./fluent/fluent.conf -vv
```

flush_at_shutdownがtrueになっているので、flush_intervalの時間がくるか、fluentdのプロセスを停止するとS3へログが保存される。

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/57f02249-1b97-2093-6d7f-b0e508b07320.png "S3_Management_Console.png")



## Amazon Athenaの設定

![Athena.png](https://qiita-image-store.s3.amazonaws.com/0/8607/5d3c5c9b-cacd-084e-33f2-d18041ca1fac.png "Athena.png")


![Athena 2.png](https://qiita-image-store.s3.amazonaws.com/0/8607/186520f4-5058-8dd8-7949-d7abc55e9bf8.png "Athena 2.png")

![Athena 3.png](https://qiita-image-store.s3.amazonaws.com/0/8607/119c0fbe-a8b6-85e3-3450-f89b1aa5769d.png "Athena 3.png")

1カラムずつ手入力しても良いですが、数が多いので"Bulk add columns"から一括で登録します。
入力内容は以下の通りです。

```
remote_addr string, request_method string, request_length int, request_uri string, https string, uri string, query_string string, status int, bytes_sent int, body_bytes_sent int, referer string, useragent string, request_time string, upstream_response_time string
```

![Athena 4.png](https://qiita-image-store.s3.amazonaws.com/0/8607/704d7039-615e-c7fe-4e70-4113823e2913.png "Athena 4.png")


最終的には以下のようなSQLが実行されます。

```sql
CREATE EXTERNAL TABLE IF NOT EXISTS yutoogi.nginx_access (
  `remote_addr` string,
  `request_method` string,
  `request_length` int,
  `request_uri` string,
  `https` string,
  `uri` string,
  `query_string` string,
  `status` int,
  `bytes_sent` int,
  `body_bytes_sent` int,
  `referer` string,
  `useragent` string,
  `request_time` string,
  `upstream_response_time` string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
) LOCATION 's3://yutoogi.logs/logs/nginx/'
TBLPROPERTIES ('has_encrypted_data'='false')
```


テーブルの作成が完了しました。
あとは中央にあるエディタでSQLを記述していけばOKですね。

![Athena 6.png](https://qiita-image-store.s3.amazonaws.com/0/8607/8d671937-4151-4968-ac1c-44b97cc584e0.png "Athena 6.png")