どちらもAWSサービス、データを検索できるやつです。
細かいチューニングや知見は後回しでいいから、ざっくり今すぐサクッと使ってもらいたい。
どうしても気になるのは費用ですが、どちらも「無茶苦茶(もの凄い量をもの凄い回数扱う)な使い方をしなければお安い」範囲だと思うので、その範疇ならあまり気にしなくていいかも。
使い分け
-
Amazon Athena をオススメするケース
- データを正しくフォーマットして溜め、アドホックな検索を行いたい場合=DBテーブルに対してアドホックなSQLを連発したい
- 検索するまでの準備に対して、ある程度労力を割いてもよい
-
Amazon CloudWatch Logs / CloudWatch Logs Insights をオススメするケース
- 直近のデータからささっとグレップしたい
- 検索するまでの準備に対しては、あまり労力を割きたくない
Athena
- てきとうに言うと
- とあるS3バケット階層以下の全S3オブジェクト内容をDBテーブルレコードに見立ててクエリーで検索できる
- 例:CSVファイルを多数保存しておくなど
- とあるS3バケット階層以下の全S3オブジェクト内容をDBテーブルレコードに見立ててクエリーで検索できる
- 使用例
- 指定日のアクセスログから「◯◯」を含むものを検索したい
- 検索方法
- SQL
- 主な費用
- クエリーで走査したデータ量に依存
- テーブルのパーティション(=S3オブジェクトPrefix)を正しく設計することで費用を削減できる
- 例:とある期間のデータはとあるPrefix以下にだけ保存されている
- テーブルのパーティション(=S3オブジェクトPrefix)を正しく設計することで費用を削減できる
- クエリーで走査したデータ量に依存
- 主な良いところ
- 保存データ容量上限を気にしなくてよい
- データ走査量によらず検索速度が良好
- 主な注意点
- S3へのデータ出力
- 一定のファイルフォーマットが必要
- 一定の保存先(S3オブジェクトPrefix)ルールが必要
- 自アプリケーションやAWSサービスからS3へどのように出力するか考慮が必要
- ファイルフォーマットや保存先に合わせたテーブル設定が必要
- S3へのデータ出力
Athena例
対象S3バケット階層のS3オブジェクトの中身イメージ
$ cat path/to/2022/10/19/hoge-1.log
1,alice,18
$ cat path/to/2022/10/19/hoge-2.log
2,bob,20
3,carol,22
$ cat path/to/2022/10/20/fuga.txt
4,dave,18
クエリーイメージ
SELECT
name
FROM
my_table
WHERE
date = '2022/10/19'
AND
age >= 18
LIMIT
10
;
CloudWatch Logs Insights
- てきとうに言うと
- 溜めてあるログ内容をクエリーでフィルタリングできる
- 使用例
- いまエラーアラートが発生したので、30分以内の実行ログから「◯◯」を含むものを検索したい
- 検索方法
- 独自クエリー(Linuxコマンドをパイプで繋いでいる時のような感覚)
- 主な費用
- クエリーで走査したデータ量に依存
- 期間指定することで走査対象を絞り費用を削減できる
- クエリーで走査したデータ量に依存
- 主な良いところ
- 保存データ型を気にしなくて(ただの文章で)良い
- とはいえJSONで出力しておくとクエリーでJSONプロパティを直接指定できるため便利ではある
- 検索速度まあまあ
- 「CloudWatch Logsにログを出力できる」ようなAWSサービスが多いので、出力方法構築に労力をあまり割かなくて済む
- 保存データ型を気にしなくて(ただの文章で)良い
- 主な注意点
- 走査範囲は「現在 〜 指定の過去日時」までとなる
- 「過去のとある日1日だけ」のような検索が費用的な意味で実施し辛い
- 「現在〜指定の過去日時まで全て舐めるけど抽出するのは過去のとある日1日だけ」という挙動になる
- クエリー実行期間を「相対」から「絶対」に変更して回避する必要有り
- 検索速度は走査範囲による
- 「過去のとある日1日だけ」のような検索が費用的な意味で実施し辛い
- 走査範囲は「現在 〜 指定の過去日時」までとなる
CloudWatch Logs Insights例
対象ロググループのログストリームの中身イメージ
$ cat 2022/10/19/[$LATEST]abc001cde
2022-10-19T12:34:01.789Z {"id":1,"name":"alice","age":18}
$ cat 2022/10/19/[$LATEST]abc002cde
2022-10-19T12:34:02.789Z {"id":2,"name":"bob","age":20}
2022-10-19T12:34:03.789Z {"id":3,"name":"carol","age":22}
$ cat 2022/10/19/[$LATEST]abc003cde
2022-10-19T12:34:04.789Z {"id":4,"name":"dave","age":18}
クエリーイメージ(※クエリーとは別でクエリー実行期間も指定することになる)
fields @timestamp, name
| filter age >= 18
| sort @timestamp desc
| limit 10
fields @timestamp, @message
| filter @message like 'carol'
| sort @timestamp desc
| limit 10