本記事ではINFINI Gatewayを使用してElasticsearchクラスタに対して不正なクエリをブロックする手法について解説します。この手法はOpensearchやEasysearchにも適用可能です。
問題の背景
ElasticsearchのOOM(メモリ不足)問題の多くは、以下の2種類のクエリパターンに起因しています:
- クラスタの処理能力を超えるクエリスループット
- メモリを過剰に消費する不正なクエリの実行
不正クエリの定義
不正クエリとは、システムリソース(CPU、メモリ)を過剰に消費し、クラスタの安定性やレスポンス速度に悪影響を与えるクエリを指します。具体的には:
- ネストされた集計クエリ
- 複雑な正規表現を使用した検索
- 深いページネーションクエリ(例:from: 10000, size: 10)
- スクリプトクエリ
- 大規模なネスト集計クエリ
INFINI Gatewayのコンテキストフィルタ
INFINI Gatewayはリクエストコンテキストを利用してトラフィックをフィルタリングする機能を提供します。コンテキストフィルタでは以下のマッチングパターンが利用可能です:
- プレフィックスマッチ
- サフィックスマッチ
- 部分一致
- 正規表現マッチ
実装手順
- ブロック対象クエリの特徴を特定
- context_filterにマッチングルールを定義
- マッチしたリクエストをブロック
実装例:ワイルドカードクエリのブロック
以下はワイルドカードクエリをブロックする設定例です:
// ブロック対象クエリ例
GET sample-index/_search
{
"query": {
"wildcard": {
"filename": {
"value": "report*"
}
}
}
}
// INFINI Gateway設定
- name: default_flow
filter:
- context_filter:
context: _ctx.request.to_string
message: "このクエリは許可されていません。システム管理者に連絡してください。"
status: 403
action: deny
must_not:
contain:
- 'wildcard":'
この設定により、クエリ内に'wildcard":'という文字列を含むリクエストがブロックされます。