AWS Athena で自社アプリのログを解析する


自社アプリのログがあり今までテキストで検索していましたが、AWS に便利なものを発見しました。
AWS Athena を使うと、S3 に置いたログファイルを SQL で検索できます。
ログをS3に送り、Lambda で Json に変換して、Athena で解析します。

AWS Athena について

S3にログファイルを置くだけで、SQLで検索できるようになります。
他のAWSのログも解析ができます。あれは人間が直接見るものではなかったのです。世間ではアクセス解析などに使用されています。DBなどは使わず、ファイルを直接クラウドパワーで解析しているようです。

ログの準備

ログの例です。

ログの例
2021-01-12T12:00:01+09:00 000001 info Download success : https://xxx/01.jpg
2021-01-12T12:00:02+09:00 000001 info Download success : https://xxx/02.jpg
2021-01-12T12:00:03+09:00 000001 info Download success : https://xxx/03.jpg

自前で Json に変換します。

Jsonに変換後
{"time":"2021-01-12 12:00:01", "device":"000001", "level":"info", "event":"download", "uri":"https://xxx/01.jpg"}
{"time":"2021-01-12 12:00:02", "device":"000001", "level":"info", "event":"download", "uri":"https://xxx/02.jpg"}
{"time":"2021-01-12 12:00:03", "device":"000001", "level":"info", "event":"download", "uri":"https://xxx/03.jpg"}

Points

  • CSVでも可能です。Jsonだと拡張性があり便利です。
  • Athena の timestamp型は 2021-01-12 12:00:01 です。 2021-01-12T12:00:01 や 2021/01/12 12:00:01 はダメでした(ハマりました)

Athena のパーティション機能

Athena のパーティション機能とは
今回のケースでは、デバイスごとの検索になります。デバイスが100個あると、毎回100個すべてのログファイルを検索することになります。1つ1GBなら毎回100GBを検索します。
そこでAthenaには、S3のフォルダごとに分ける機能があります。S3のフォルダ名を part=xxx にします。Athena の SQL の検索時に part を指定すると、その part だけを検索するようになります。
※かなり説明を省略しています。

S3の準備

S3にJsonに変換したログを置きます。私はオリジナルログをS3に置き、Lambdaで変換しています。


Athena の構築

テーブルの作成は Athena の Data sources で手動で作成できます。
何回も作り直すと思うので、クエリーが便利です。
以下のクエリーを実行すると、テーブルが作成されます。

Athena_query
CREATE EXTERNAL TABLE test_db.event (
    time timestamp,
    device string,
    level string,
    event string,
    uri string)
PARTITIONED BY (part string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://test-log-1/event/';

以下を実行するとパーティションが再構築されます。
Data sources でテーブルを選んで、右上のパーティションの表示で確認できます。

Athena_query
MSCK REPAIR TABLE test_db.event

Points

  • DB名とテーブル名にハイフンはエラーです。アンダースコアです(ハマりました)
  • パーテション名に part と言う名前を付けていますが、何でもいいです。
  • パーティション再構築SQLを実行しないと検索できないので注意です。

Athena の実行

Athena_query
select * from test_db.event where part='000001'

Athena で SQL を実行したときにデータのサイズが出ます。
(Run time 1.12 seconds, Data scanned 1.67 KB)
partを指定するとデータサイズが減ることが分かります。

AWS QuickSight

AWS QuickSight はデータを見える化してくれます。
QuickSight は AWS アカウントを持っていない人を招待することが可能です。

方法
1. 初回、QuickSight の名前を付けます(アカウントで1つの名前です)
2. 既に作成した Athena の DB を選びます。

できること

  • 今回はリスト表示ですが、棒グラフや円グラフなどいろいろできます。
  • 各カラムの検索ができます。
  • 日付が timestamp 型だとカレンダーで検索できます。
  • 日付の場合、1日単位、1か月単位のカウントができます。
  • CSVやExcelの出力ができます。

Points

  • もしS3アクセスエラーとか出た場合、管理画面からS3のチェックを無効+有効にしてください。S3のバケット選択が出てきます。
  • QuickSightの月額 Standard 900円(全員作成者) Enterprise 管理者1800円、ユーザー500円

惜しい点
お客様ごとにユーザーを作り公開しようと考えてました。中身のデータソースだけ入れ替えたらいいと思ってましたが、毎回この画面を作らないといけないっぽいです。
しかしこれだけの機能を自前で作ると維持メンテが大変なので、QuickSightは是非使っていきたいです。もう少し研究が必要です。

まとめ

AWS Athena を使ってみました。
一言で言うとファイルをS3に置くだけなのですが、Athena は奥が深いというか、クセが強いです。色々応用が効きそうなので、AWS技術者には必須となるでしょう。これからは、分かりやすいログから、Athenaで利用しやすいログ、となりそうです。本番運用しているサーバーで実験的に試しています。とても便利です。

Athena は「ちょっとログ見てください」地獄から脱出できる救世主となるのか。それとも「そんなもん Athena で一発だろ」と無茶振りになるのか。信じるか信じないかはあなた次第です。