LogAnalytics - Kusto Query (KQL)クエリーでJSONを抽出する方法


はじめに

Azure環境を触りだして、LogAnalyticsを使ってイベントをフィルターする際に、JSONが含まれているレコードを条件にしたい場合の方法についてまとめてみました。

サンプル例

  • AWS CloudTrailのログサンプル
  • コンソールログインでフィルタ
  • JSONで出力される以下の"Success"のみを条件に絞りたい
{"ConsoleLogin":"Success"}

KustoクエリーのJSON抽出方法

以下の2通りが機能として提供されています。

  • extractjson

    • パス式を使用している JSON テキストから、指定された要素を取得する方法
    • 一つのデータのみをjson bodyから抽出する場合に使える。逆に複数のデータを抽出する場合は使えない。
    • メリットとしてはシンプル、型変換ができる
    • 構文
      • extractjson(Jsonpath ,データソース)
  • parse_json

    • JSON テキストより、jsonをparseして読み込ませて、複数のデータを抽出する
      • イメージは Python の json.loadと覚えておけば良さそう
    • 一度読み込ませることで、複数のデータを抽出できる
    • 構文
      • parse_json(json)

やってみる

1. extractjsonパターン

AWSCloudTrail
| where TimeGenerated > ago(7d)
| where EventName == "ConsoleLogin" // CloudTrailのイベントを絞る
| extend extractjson_result = extractjson("$.ConsoleLogin", ResponseElements)  // ResponseElementsからConsoleLoginを抽出する
| project TimeGenerated,EventName,UserIdentityUserName,ResponseElements,extractjson_result // 出力

結果

- ResponseElementsが元データ
- extractjsonで抽出したデータを "extractjson_result" フィールドで表示

2. parse_jsonパターン

AWSCloudTrail
| where TimeGenerated > ago(7d)
| where EventName == "ConsoleLogin" // CloudTrail のイベントを絞る
| extend d=parse_json(ResponseElements) // parse_json で読み込み
| extend parsejson_result = d["ConsoleLogin"]  // 正規化されたJSONを抽出する
| project TimeGenerated,EventName,UserIdentityUserName,ResponseElements,parsejson_result // 出力

結果

- 一度、parse_jsonでjson.loadしているのがポイント
- 正規化することで、複数のjson抽出するので、複数を抽出するのであればこちらがお勧め

用途例

  • 通常のケースは parse_json() の方が利用用途が多そう
  • Python等慣れている方はjson.loadの考え方がしっくりくるので後者かと
  • extractjsonは型変換が出来るので、用途的にはそちらかも

最後に

  • まだ Azure Monitor / LogAnalytics を使い始めたばかりですが、他にも気になる点があれば投稿していきたいと思います。