Athenaを簡単に使ってみる

Athenaは「s3にあるファイルをSQLで検索できる」というサービスになる。

既にs3にファイルの形で置かれている場合はAthenaで集計が可能だが、 コストが読み込んだファイルに応じてかかるので、なんらかの形で課金を抑える施策が必要。

日付でログを分けるような運用を考えてみる。

調査の流れ

下記がまとまっていて分かりやすい。 Amazon Athenaではじめるログ分析入門 - Qiita 上記で紹介されていた、下記のページ Amazon Kinesis Firehose, Amazon Athena, Amazon QuickSightを用いたVPCフローログの分析 | Amazon Web Services ブログ も、Athenaを理解するのに役立つ、ただ… ただnginxログ解析のために、

イベントを受けるlambda -> kinesis firehouse -> s3 -> Athena は冗長ではないか… もうちょっとラクはできないのか AWS Glue ? GlueはRedshift, RDS, S3をソースにできる。ただpython, scalaで記述するらしい。

私がソースにしたいのは、CloudWatchなのだ。

が、考えてみると、CloudWatch -> s3へエキスポートできれば良い。方法はあった。 Amazon S3 へのログデータのエクスポート - Amazon CloudWatch ログ

割とシンプルにありそう。たぶんAPIもあるだろう。 で、なぜkinesis firehoseか?を考えると、こちらはリアルタイム解析なのだと思う。 今回の要件については…. redashで解析できれば良いので日時で良かろう。

ただディレクトリ構造については悩ましい。 s3に吐き出すディレクトリ構造については、他のエントリを参考にしよう。

Amazon Kinesis Firehose, Amazon Athena, Amazon QuickSightを用いたVPCフローログの分析 | Amazon Web Services ブログ

クエリのパフォーマンス向上とコスト削減を目的とした、Athenaにおけるデータのパーティション化。
このセクションではLambda関数を用いてS3に格納されたAthena用のデータを自動的にパーティション化する方法を示します。
この関数はFirehoseストリームに限らず、他の手段でS3上に年/月/日/時間のプリフィックスで格納されている場合でも使用できます。
パーティショニングはAthenaにおいてクエリのパフォーマンス向上とコスト削減を実現するための3つの戦略のうちの1つです。
他の2つの戦略としては、1つはデータの圧縮、そしてもう1つはApache Parquetなどの列指向フォーマットへの変換があります。

Apache Parquetについては http://nagix.hatenablog.com/entry/2015/12/08/235512 が分かりやすかった。 解析には特定の列を用いて解析を行うが、あらかじめ列ごとのデータに分かれていた方が、特定の列のみを読み込むことができ、メモリ、検索の観点から早い。

便利そう、問題はCloudWatch Logsからエクスポートする段階で「Parguest」フォーマットが選択できるかだが…

が、速度比較するとCSV早いらしい。データ読み込み料金は下がりそうではある。 https://dev.classmethod.jp/cloud/aws/amazon-athena-using-parquet/

s3のパス構成について

Amazon Kinesis Firehose, Amazon Athena, Amazon QuickSightを用いたVPCフローログの分析 | Amazon Web Services ブログ

この関数はFirehoseストリームに限らず、他の手段でS3上に年/月/日/時間のプリフィックスで格納されている場合でも使用できます。

とあるので、そのまま習う。 ただ、年/月/日 で良さそう。

aws-cliでログを24時間前からs3に出力する

あらかじめs3側の権限の許可などの作業は済んでいるものとする

時刻はミリ秒で指定するので1000倍するの重要

❯ aws logs create-export-task --task-name "my-log-group-20180308-1" --log-group-name "NginxApiAccessLog" --from 1520415327000  --to 1520501735000 --destination "test" --destination-prefix "export-task-test"

出力結果

{
    "taskId": "35b9d8c2-434c-47a7-a75c-54b96947646b"
    }

ログからデータベースにする DDL がやっかいな感じする

制約条件、料金

https://qiita.com/Hachi_0601/items/930e4b6d1b84ce5d62e5

ToDo

ここをベースに考えてみた。チャレンジしやすいページ。 https://qiita.com/miyasakura_/items/174dc73f706e8951dbdd

参考にさせていただいた

mazon Athenaではじめるログ分析入門

https://qiita.com/miyasakura_/items/174dc73f706e8951dbdd

クエリ作成

ここを呼んで一通り作成する https://dev.classmethod.jp/cloud/run-amazon-athenas-query-with-aws-lambda-ja/

クエリの検証はAWS-CLIでもできる

https://dev.classmethod.jp/cloud/aws/amazon-athena-run-query-using-awscli/

User
CloudFront
ALB
EC2
RDS