FluentdでS3に送ったログをAmazon Athenaで集計する。2018-03-26

# 内容
`Fluentd` で `S3` に送ったログを `Amazon Athena` で集計する方法を記します。

[td-agent3（Fluentd v1.0）でS3に「LTSV形式のログ」を保存する](https://qiita.com/abetomo/items/184056035a1cfda24a33) の続きですが **一部設定を変えます**

# 一部変える設定の内容

* `<match>` に以下3点を追加
    * `output_tag false`
    * `output_time false`
    * S3のkeyにhostname追加
* `<filter>` でhostnameを付与する設定を追加

```/etc/td-agent/td-agent.conf一部抜粋
# hostname追加
<filter ltsv.log>
  @type record_transformer
  <record>
    hostname ${hostname}
  </record>
</filter>

<match ltsv.log>
  @type s3
...
  # S3のkeyにもhostnameを追加
  s3_object_key_format %{path}%{hostname}/%{time_slice}_%{index}.%{file_extension}

  # 以下の2つの設定を入れることで、S3に保存されるログがJSONのみになる
  output_tag false
  output_time false
...
</match>
```

**追記:**

* `%{hostname}` は deprecated
* `#{Socket.gethostname}` を使う
    * 旧: `s3_object_key_format %{path}%{time_slice}_%{hostname}%{index}.%{file_extension}`
    * これから: `s3_object_key_format "%{path}%{time_slice}_#{Socket.gethostname}%{index}.%{file_extension}"`

この設定を入れるとhostnameの情報が付与された、JSONのみのログがS3に保存されます

```json:YOUR_S3_BUCKET_NAME/logs/ltsv.log/2018-03-26/{HOSTNAME}/201803260820_0.gz
{"datetime":"2018-03-26 08:20:12","id":"16509","hostname":"ubuntu-xenial"}
{"datetime":"2018-03-26 08:20:32","id":"6217","hostname":"ubuntu-xenial"}
```

# `Amazon Athena` でselectするまでの流れ
## Get Started
AWS マネジメントコンソールで設定していきます。

https://console.aws.amazon.com/athena/home

![スクリーンショット 2018-03-26 16.46.53.png](https://qiita-image-store.s3.amazonaws.com/0/3800/edba3f6c-a75c-d491-0e23-3bc82fa9b4d0.png)

「Get Started」で開始します。

## AWS Glue Data Catalogへ遷移
今回selectするためのDBとテーブルを作っていきます。
上部のメニュー「AWS Glue Data Catalog」から設定していきます。

![スクリーンショット 2018-03-26 16.47.29.png](https://qiita-image-store.s3.amazonaws.com/0/3800/4b15356f-eb25-85bf-5e3b-5805e58cc2ec.png)

## Add tables
（この後の作業は `AWS Glue` での作業です）

### 「Add tables」から作成します。
![スクリーンショット 2018-03-26 16.48.08.png](https://qiita-image-store.s3.amazonaws.com/0/3800/ad6c5037-fca3-00ad-e29c-6bb13fab8770.png)

「Add information about your crawler」で設定していきます

![スクリーンショット 2018-03-26 17.33.45.png](https://qiita-image-store.s3.amazonaws.com/0/3800/3f158b62-12d2-e54a-fb3e-968fafa0d285.png)

### メニュに沿って設定していきます
crawler nameを入れる
![スクリーンショット 2018-03-26 17.34.53.png](https://qiita-image-store.s3.amazonaws.com/0/3800/4ddc637f-e2d6-9d92-fd78-08b439593d8f.png)

data storeの設定
![スクリーンショット 2018-03-26 17.35.31.png](https://qiita-image-store.s3.amazonaws.com/0/3800/0b15c6d6-df87-1af2-c7b5-96166258df2f.png)

`Include path` にはS3のkeyの途中まで（prefix）を入れておけば良いです

「Add another data store」は「No」
![スクリーンショット 2018-03-26 17.37.40.png](https://qiita-image-store.s3.amazonaws.com/0/3800/a8f5234c-fa33-d991-10dd-22b9f3d4f873.png)

**今回はIAM roleを新規作成してみました**
（role名を入力しました）
![スクリーンショット 2018-03-26 17.38.23.png](https://qiita-image-store.s3.amazonaws.com/0/3800/a5d217ab-e11c-59f6-5d3c-681159599f47.png)

「Create a schedule for this crawler」はとりあえず「Hourly」に
![スクリーンショット 2018-03-26 17.40.15.png](https://qiita-image-store.s3.amazonaws.com/0/3800/3eb6ae9c-7d78-226b-be5e-ca091dea26e8.png)

新しいDBを追加しました
![スクリーンショット 2018-03-26 17.41.20.png](https://qiita-image-store.s3.amazonaws.com/0/3800/5bd9e015-324a-67e0-fa02-e6d8123a6ebd.png)

次は確認画面でした。「Finish」して完了です。

## Crawlerをrunする
Glueの「Crawlers」メニューに今追加したCrawlerが表示されると思います。
選択して、「Run Crawler」を押すと手動でCrawlerが動きます。

Cralerが動くと、Glueの「Databases > Tables」にtableが追加されます。
JSONだけを送るように設定したので、Schemaもよしなに設定されています。
![スクリーンショット 2018-03-26 17.45.34.png](https://qiita-image-store.s3.amazonaws.com/0/3800/bda42137-8287-5774-89fb-5a5cecc058a3.png)

## `Amazon Athena` に戻ってselect
Glueでここまで作業が終わればAthenaでselectできます。

### すこぶるシンプルなselect
![スクリーンショット 2018-03-26 17.47.43.png](https://qiita-image-store.s3.amazonaws.com/0/3800/4b4f011d-5164-62bb-463d-19ab81e4d9b1.png)

![スクリーンショット 2018-03-26 17.47.58.png](https://qiita-image-store.s3.amazonaws.com/0/3800/87d28799-2c91-6470-e997-acd35807ffae.png)

### すこぶるシンプルなwhere
![スクリーンショット 2018-03-26 17.48.39.png](https://qiita-image-store.s3.amazonaws.com/0/3800/23ab404d-1f08-c5f1-eff8-68486fd6eedb.png)

![スクリーンショット 2018-03-26 17.48.49.png](https://qiita-image-store.s3.amazonaws.com/0/3800/e9c9b8a5-1295-654b-42e3-c6eb83e0838f.png)

# まとめ
簡単にではありますが、FluentdでS3に送ったログをAmazon Athenaで~~集計~~ select する方法について書きました。
ここまでくればあとは普通にSQLを書くだけなので集計もできるでしょう！