🔍

Quickwit を利用してサーバーレスなログ全文検索ツールを作る

2024/07/01に公開

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 にコントリビュートしました。
https://github.com/quickwit-oss/quickwit/pull/5069

API Gateway を作成する

公式の GitHub レポジトリに AWS CDK での API Gateway を利用した Quickwit on Lambda のコードがあるので、こちらを参考にすることで AWS 上に構築できます。

また、自分でも terraform 版のコードをこちらのレポジトリに作成したので terraform が良い人はこちらを参考にしてください。
これで Grafana を利用して Quickwit 上のデータを表示する準備は整いました。

Grafana で Quickwit のデータを表示する

公式の GitHub レポジトリの README にも書いてありますが(自分が書いた)、下記のような手順で Grafana と Quickwit を接続します。

  1. Grafana で Quickwit プラグインを有効化する
    https://github.com/quickwit-oss/quickwit-datasource#installation
  2. Grafana 上の Quickwit プラグイン設定ページで下記項目を設定する
    • HTTP URL: API Gateway の URL
    • Index settings Index ID: Lambda の QW_LAMBDA_INDEX_ID と同じ項目

これで Grafana の Explorer ページから Quickwit のデータを検索することができます。

Discussion