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
- 済 CloudWatch logsからs3に日時で抜き出す処理をAWS CLIでやってみる https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/S3ExportTasks.html
ここをベースに考えてみた。チャレンジしやすいページ。 https://qiita.com/miyasakura_/items/174dc73f706e8951dbdd
-
それを lambdaで https://blog.manabusakai.com/2016/08/cloudwatch-logs-to-s3/ https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudWatchLogs.html
-
AthenaでDDLを書いてみる
-
Athenaで全てSelectするような形でサンプルを見てみる
-
Redashから接続する DDLの入力もredashからできそうだが、そこはAWS consoleから行った方が早そう https://qiita.com/youhei19880130/items/ea366afb5d68c797d19d https://dev.classmethod.jp/cloud/aws/query-and-visualize-data-from-amazon-athena-with-redash/ https://blog.manabusakai.com/2017/02/redash-and-athena/
-
Redashで何かグラフを一つ作ってみよう
参考にさせていただいた
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/