Athenaを早速試してみた

この記事は Retty Advent Calendar 5日目です。

昨日は、近藤さん(@yskondo )の [フラットデザインは単なるデザインスタイルの話ではない](http://qiita.com/yskondo/items/618e5d43587c7baf32ad) でした。

さて、今年の[AWSのre:invent](https://reinvent.awsevents.com/)ではいろんな新しいサービスの発表が行われて、
使ってみたい！と思うサービスもたくさん増えてますが、その中で「今すぐ試したい」と思ったのがこの[AWS Athena](https://aws.amazon.com/jp/blogs/news/amazon-athena-interactive-sql-queries-for-data-in-amazon-s3/)ですね。

社内でELBを使って運用してる部分も多く、ELBのアクセスログを確認する場面は容易に想像できるでしょう。
今までならAdhocで該当期間のアクセスログを一個一個開けて確認するか、S3のバケットをマウントして開けるか、Lambdaでevent triggerとしてS3バケットを指定してElasticsearchに流し込んでみるとかをやって（た）ました。

でもやっぱ面倒くさい。面倒くさいんですよ。

それで、今回Athenaの登場にはすごく期待してまして、発表後早速試してみました。
ちなみに、S3のリージョンとは関係なく使えるので、今すぐ試せます。


## Athenaの初期画面（Query画面）
<img width="800" alt="Athena.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/94efde4f-9931-b3d4-1b2b-526df865ba48.png">
サンプルとしてすぐ見れるようになってますね！
左サイドバーのelb_logsの目的なアイコンを押すと、previewとして１０件読み込んでくれます。

見るとわかりますが、elbのアクセスログです！
そう、私が欲しかったそいつなんですよ。これにぶち込めばいいんじゃないか？！と思いましたがそういう仕組みではないですね。

データベースは複数のテーブルが持てる、
テーブルはS3のオブジェクトとつなげて、その内容をテーブルのように参照できる仕組みですね。
説明見るとPrestoなので分散処理ですね。レスポンスへの期待も高まります。


## 新しいテーブルを作ってみよう！
<img width="800" alt="Athena2.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/0b9845ee-1002-ef59-5d8a-41bfde81a3b4.png">
Add tableボタンをクリックするとこういう画面に遷移します。
なんか楽そう。早速やってみます。
Databaseがsampledbになるのは嫌だったのでtestにしたりして。
Table Nameも適当にそれらしきものを入れておきましょう。
重要なのは
`Location of input Data Set`です。こちらがS3のバケットを指定するものですね。説明読むと、prefixがついてるところも一旦bucket名だけまたは分岐になるprefixまで入れれば中のオブジェクトを勝手に読み込んでくれそうです。便利ー
Externalは一旦無視して次へ進みましょう。

## Data Format
<img width="800" alt="Athena3.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/94c2b289-e6e3-effa-a3f4-6e7ca67caf75.png">
こちらデータフォーマットを決める画面になります。
色々ありますが、今回はELBのアクセスログなので、`Apache Web Logs`を選んで、RegexにELBのアクセスログの正規表現を入れました。
面倒ですよね。貼っておきます。
```
 ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*):([0-9]*) ([.0-9]*) ([.0-9]*) ([.0-9]*) (-|[0-9]*) (-|[0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) ([^ ]*) (- |[^ ]*)\" ("[^"]*") ([A-Z0-9-]+) ([A-Za-z0-9.-]*)$
```
終わりましたら次へ！

## 次はテーブルのカラム設定
<img width="800" alt="Athena4.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/a81b394b-09ca-f1e8-eb7f-16523a604bef.png">
鬼門です。
カラム名とデータタイプを入れなければいけません。多分Athenaのテーブル作成の中で一番面倒くさいところです。
私は極度の面倒臭がり屋なので、方法を考えました。tutorialにその解決方法がありました。
**いきなりtutorial押すと最初からになってしまうので、ご注意を。。。**
<img width="800" alt="Athena5.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/061474a1-ac0b-518d-5662-10eb528ec232.png">

赤い枠の中にある、**here**が救ってくれます。押すと
<img width="800" alt="Athena6.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/6367aa2c-60a5-9c1c-912a-ca3697b9c2b2.png">
いやー嬉しいですね。ELBのアクセスログのカラム構成を入れてくれます。
チュートリアル使いたくないけどどうするのか？と言われたら、直接入力するか、後々出てくる方法でやっていただきたいです。もう少々お待ちを。

## Partition設定
<img width="800" alt="Athena7.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/c7f6dab6-160f-96c9-d80a-239e75d8d72a.png">
次はPartition設定です。一旦今回は飛ばします。

## これで完了！
<img width="800" alt="Athena8.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/2846f813-a2e2-58fc-ca99-95e9529b9183.png">
Partitionまで設定が終わったら、一旦完了です。
画面を見ると、指定したDatabaseにDDLが回ってるというメッセージと一緒に、DDLが表示されてるのが見えます。
このDDLをコピーしておいて、またELBのアクセスログを読み込むテーブルを作る時に簡単にクエリを流して作れると思いますので、取っておくのも良いでしょう。
なぜなら、**カラム設定は面倒くさい**からです。

## クエリを投げてみよう
<img width="800" alt="Athena10.png" src="https://qiita-image-store.s3.amazonaws.com/0/85739/26706c71-dc6b-49a4-076b-738c4a5b07af.png">
コストビビりなのでプレビューと同じクエリを投げてみました。レコード数とかボリュームまでは言えないのですが、
そこそこ溜まっていて解析にはそれなりの処置を行わなければいけないぐらいのボリュームではあるELBのアクセスログですが、
８秒ぐらいで返ってきましたね。
１０行ですが240kbぐらい。

Athenaは**$5/TB（累積）**なので、WHEREとLIMITを適切に使えば、Adhocに確認するにはかなり強力なクエリを投げれると思います！


## 終わりに
Athenaはテーブル間のJOINが可能で、AWS Quicksiteや外部のBIツールとの連動も機能的には可能です。
クエリを保存しておくことや、クエリの結果はS3の特定バケットにCSVで保存されるので、それを持って色々やるのもアリですね。（保存先は右上のSettingsというところで設定可能です）
クエリの履歴も残っていて、そこからダウンロードすることも可能です。

ELBのアクセスログの解析にはもってこいで、使い道は色々ありそうなAthenaです。
ぜひ、一度使ってみてくださいー！