tech.guitarrapc.cóm

Technical updates

Amazon Athena で S3 Access Log を分析する

re:Invent 2016 は AWS の利用が一段回上に上がる素晴らしい発表が多かったです。さて今回取り上げるのは Athena です。

すでに素晴らしい資料があるのでそちらをご参照ください。ざっくり個人的な理解は、Google BigQuery の AWS版 という雑な印象です。

www.slideshare.net

data.gunosy.io

今回は S3 を Static website hosting している場合の S3 アクセスログを Athena で分析してみましょう。ELBとか CloudTrail はあるのに、S3 Access Log の記事見つからないものですね。

なお、この記事は以下のフォーマットを対象にしているため、フォーマットが将来変更された場合に動かないことがありえます。あらかじめご了承ください。

docs.aws.amazon.com

1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd hogemogeTestTest.contoso.com [07/Dec/2016:05:59:12 +0000] 191.1.1.2 1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd 667C2B96205F407E REST.GET.VERSIONING  - "GET /hogemogeTestTest.contoso.com?tagging HTTP/1.1" 404 NoSuchTagSet 285 - 45 - "-" "S3Console/0.4" -

目次

S3 バケットの状態

Athena は US East (Virginia)US West (Oregon) のみで選択できるサービスですが、対象となるS3 はその制約がありません。当然ですね。

さて、Athena の対象となる S3 バケットを Static website hosting として用意します。

Logging を有効にしておいて事前にログが吐かれた状態にしましょう。今回は、BucketName/logs に吐くようにしました。

このような構成だと思ってください

バケット名 ログパス
hogemogeTestTest.contoso.com logs/

この状態で logs フォルダをみると.... 絶望ですね。これを手やAPI で見ようというのは人間のやることではなくなりました。Athena を使うのです。

Athenaの処理

さて分析対象が定まったので Athena にDBとテーブルを用意して分析しましょう。作成する内容は次の通りですね。

対象バケット名 Athena データベース名 Athena テーブル名
s3://hogemogeTestTest.contoso.com/logs/ s3_AccessLogsDB hogemogeTestTest_contoso_com

対象バケット名ですが、作成ウィザードではリージョンが必要そうなブランク欄の薄い灰色表示ですが、リージョンは不要です。

では早速見てみましょう。今回は パーティションを省いてクエリ (HiveQL) のみで一気に行きます。

データベースの作成

まずは、Athena でS3AccessLogに関するデータベース s3_AccessLogsDB を作成します。すでにデータベースがあるならここはスキップしていただいてok です。

gist.github.com

実行を待ってねと出て上手く作成できました。

ちなみにCREATE DATABASE 文と 後述する CREATE EXTERNAL TABLE 文は同時に投げることはできません。1つずつ投入、実行してください。

テーブル定義の作成

お次はテーブル定義です。

S3 Access Log のログ形式は次の通りです。

docs.aws.amazon.com

さてフォーマットのシリアライザはどれが使えるでしょうか。

一見 org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe がよさそうですがクォートのサポートがないので、今回は org.apache.hadoop.hive.serde2.RegexSerDe を使ってごりごりやります。

gist.github.com

2点だけ説明をした方がよさそうなので触れておきます。

  1. s3_accesslogsdb.hogemogeTestTest_contoso_com は、<データベース名>.<テーブル名> としています。お好きに書き換えてください
  2. Location にある s3://hogemogeTestTest.contoso.com/logs/ が対象の S3バケット名です

これで実行すると、上手くテーブルが作られたはずです。

テーブルプロパティをみてみます。

適当なクエリで中身を見てもうまくいっていますね。

SELECT * FROM hogemogetesttest_contoso_com limit 10;

あとは任意のクエリで分析しましょう。

dev.classmethod.jp

まとめ

Athena がきたことでようやく S3 にエコシステムが出来てよかったですね!

ちょくちょく使ったりデータ量が多いなら パーティションを貼っておいた方が精神安定上いいと思います。