Quickwit を利用してサーバーレスなログ全文検索ツールを作る
Quickwit は Rust 製の検索エンジンです。
Quickwit の利用用途として挙げられているのは、アプリケーションなどのログを検索したいケースなど、下記のようなデータ・ユースケースの検索に適したツールとなります。
- データ自体が immutable
- レイテンシを気にしない
Quickwit のアーキテクチャではインデックスされたデータは S3 などのオブジェクトストレージに保管されるます。
また、まだ beta 段階ではありますが、Quickwit を Lambda で動かすこともできるため、サーバーレスな全文検索システムを低コストで構築することができます。
Quickwit を Lambda で動かす
公式の GitHub レポジトリにて AWS CDK コードが用意されています(自分が作成した terraform 版のコードを後ほど紹介します)。
この CDK を利用すると下記のリソースが作成されます。
- データをインデックスする Lambda
- インデックスされたデータを保管する S3
- データを検索する Lambda
「データをインデックスする Lambda」では S3 イベント通知を受け取ることができます。
なので、インデックスしたいデータを特定の S3 に保管して、更にその S3 からイベント通知を「データをインデックスする Lambda」に渡すことで、Quickwit 上にデータが投入されるパイプラインを構築することができます。
注意点として、ログデータは JSON 構造である必要があるため、事前に JSON に変換する必要があります。
また、「データを検索する Lambda」では下記のようなイベント構造にて Lambda を呼び出すことで Quickwit 上に投入されたデータを検索することができます。
{
"headers": {"Content-Type": "application/json"},
"requestContext": {
"http": {"method": "POST"},
},
"body": {
"query":"severity_text:ERROR"
},
"isBase64Encoded": False,
}
このイベント構造は API Gateway で AWS Lambda プロキシ統合を利用したときのイベント構造に合致しているため、「データを検索する Lambda」を AWS Lambda プロキシ統合で呼び出す API Gateway を作成することで、Lambda を直接呼び出すのではなく HTTP を利用してログデータの検索を実施できます。
更に、Quickwit では Grafana プラグインが用意されているため、Grafana を利用して Quickwit 上のデータを表示することができます。
※ 手前味噌ですが、Quickwit Grafana プラグインを Quickwit on Lambda で利用できるようにするために Quickwit にコントリビュートしました。
API Gateway を作成する
公式の GitHub レポジトリに AWS CDK での API Gateway を利用した Quickwit on Lambda のコードがあるので、こちらを参考にすることで AWS 上に構築できます。
また、自分でも terraform 版のコードをこちらのレポジトリに作成したので terraform が良い人はこちらを参考にしてください。
これで Grafana を利用して Quickwit 上のデータを表示する準備は整いました。
Grafana で Quickwit のデータを表示する
公式の GitHub レポジトリの README にも書いてありますが(自分が書いた)、下記のような手順で Grafana と Quickwit を接続します。
- Grafana で Quickwit プラグインを有効化する
https://github.com/quickwit-oss/quickwit-datasource#installation - Grafana 上の Quickwit プラグイン設定ページで下記項目を設定する
- HTTP URL: API Gateway の URL
- Index settings Index ID: Lambda の
QW_LAMBDA_INDEX_ID
と同じ項目
これで Grafana の Explorer
ページから Quickwit のデータを検索することができます。
Discussion