AzureDataExplorerの外部テーブルを利用してストレージアカウント内にある診断ログをクエリで検索してみました。
ログ検索前の準備
DataExplolorerを利用するにあたり、以下の準備をします。
- ストレージアカウントを作成
- ActivityLogの診断ログを追加
- AzureDataExplolorerリソース作成
- AzureDataExplolorerにDBを追加
- AzureDataExplolorerで外部テーブルを追加
ストレージアカウントを作成
まず、ストレージアカウントを以下のAzureCLIで作成します。
$rg_name = "Test-001-RG"
$location = "japaneast"
$storage_name = "satestactlog9483762"
#リソースグループの作成
az group create `
-l $location `
-g $rg_name
#ストレージアカウントの作成
az storage account create `
-n $storage_name `
-g $rg_name `
-l $location `
--kind StorageV2
ActivityLogの診断ログを追加
以下の記事を参考に設定を追加します。
以下の記事にも記載していますが、AzureCLIではこの設定を入れることができないのでAzureポータル上から設定をします。
AzureDataExplolorerリソース作成
Azure Data Explorer Clustersの画面に遷移して「作成」をクリックしてリソース作成していきます。

「基本」タブの設定
名前は一意の値を入力する必要があります。
また、今回はワークロードは「開発/テスト」を選択しています。

「スケーリング」タブの設定
ワークロードが「開発/テスト」の場合は手動スケールしか選択できません。
また、今回はテストなのでインスタンス数は1のまま次に進みます。

「構成」タブの設定
デフォルト値のままとします。

「セキュリティ」タブの設定
デフォルト値のままとします。

「ネットワーク」タブの設定
デフォルト値のままとします。
この設定を変更するとプライベートエンドポイント経由で通信が可能となります。

「診断設定」タブの設定
デフォルト値のままとします。

AzureDataExplorerの診断ログはLogAnalyticsにのみ送信できるようです。
これで、「作成」をクリックしてリソース作成します。
デプロイ完了までは10分くらいかかります。
AzureDataExplolorerにDBを追加
AzureDataExplolorerのデプロイが完了したらAzureDataExplolorer内にDBを作成します。
・リソースに移動し「データベース」から [データベースの作成] をクリックします。
![リソースに移動し「データベース」から [データベースの作成] をクリック](https://bonjiri-blog.com/wp-content/uploads/search-diagnostic-logs-using-azuredataexplorer-008.png)
・「新しいデータベースの作成」のポップアップが開くので設定を入力して「作成」をクリックします。
今回はすべてデフォルトで設定します。

[参考] 保持日数の上限
保持日数とキャッシュの上限は36500となっているので約10年は保持できるようです。

AzureDataExplolorerで外部テーブルを追加
UIを利用する方法とクエリ画面からコマンドで作成する方法の2パターンあります。
ここではUIを利用する方法で実施しますが、下部に クエリ画面からコマンドで作成する方法 もまとめていますので参考にしてください。
UIを利用する方法
ストレージアカウントのデータを外部テーブルとして取り込みます。
・「クエリ」の画面から作成したDBを右クリックして「外部テーブルの作成」をクリックします。

ブラウザの別タブでAzureDataExplolorerの画面が表示されるので、取り込む外部テーブルの設定を入力していきます。
「宛先」の設定
・テーブル名は任意の値を入力し、クラスターを接続するために「接続の追加」をクリックします。

・「接続URI」にクラスターのURIを入力します。
表示名は任意の値でOKです。

入力するURIはAzureDataExplolorerの「概要」画面で表示されていたURIです。
また、2回目以降に外部テーブルを作成する場合には「接続の追加」の作業は不要となります。

「ソース」の設定
・「コンテナーの選択」をクリックして、外部テーブルにしたいストレージアカウントのコンテナーを指定します。
今回は上記で作成したストレージアカウントの中に診断設定追加によって作成された [inshits-activity-logs] というコンテナーを指定します。

コンテナー指定後は「ファイルのフィルター」や「ファイルを定義するスキーマ」はデフォルトのままにします。

[参考] もしコンテナー選択時に「ストレージアカウントのロールの割り当てが見つかりません」と出てきたら
コンテナーを選択後に「ストレージアカウントのロールの割り当てが見つかりません」と出てきて権限が足りない旨が表示されることがあります。

もし表示されたら、指示の通り「ストレージ BLOB データ閲覧者」を追加しましょう。
「スキーマ」の設定
・デフォルトのままで「テーブルの作成」をクリックします。

この「テーブルの作成」をクリックすると最終確認などの画面は出ずに、すぐにテーブルが作成されるので少し注意が必要です。
テーブルが作成されたらクエリ実行画面に移動しておきます。

今回はそのままブラウザ上で「Query」のページを開いていますが、AzureポータルのAzureDataExplolorerリソース画面から「クエリ」を開いても同じです。
これでログを検索する準備が完了しました。
AzureDataExplorerを利用して診断ログをクエリで検索する
ここからは準備していたActivitylogをAzureDataExplorerで検索してみます。
クエリで検索する
クエリ実行画面でクエリを入力してログを検索します。
まずは取り込んだテーブルのすべてを表示させてみます。
テーブル内のすべての情報を表示させる場合には以下のように外部テーブルのみをクエリで実行します。
external_table("activity-logs-table")

また、各ログをプルダウンさせると以下のように詳細を見ることができます。
LogAnalyticsと表示形式が異なるので、LogAnalyticsに慣れていると違和感があるかもしれません。

検索クエリにはLogAnalyticsとほぼ同じKQLが利用できる
基本的には同じKQLを利用可能です。
時間でフィルタリングして表示件数を絞る
以下のクエリで検索可能です。
LogAnalyticsでは時間のカラムは「TimeGenerated」ですのでここは少しだけクエリの書き方に違いがあります。
external_table("activity-logs-table")
| where ['time'] >= ago(1h)

合計件数が8件となり、表示する件数を絞れていることが分かります。
カテゴリーでフィルタリングする
以下のクエリで検索可能です。
時間とカテゴリーと操作名のカラムだけを表示させています。
external_table("activity-logs-table")
| where category == "Administrative"
| project ['time'], category, operationName

外部テーブルを削除する
外部テーブルの削除はクエリで実行可能です。
Microsoftの公式ドキュメントを調べましたが、Azureポータルから削除はできないようです。
今回だと以下のように入力します。
テーブル名が [] と “” で囲まれている必要があるので注意してください。
.drop external table ["activity-logs-table"]
削除クエリの実行結果は1件表示されますが、削除したテーブル名が記載されているだけのものになります。

[参考] 外部テーブルをクエリ画面からコマンドで作成する方法
クエリの画面で以下のコマンドを打つと外部テーブルを作成可能です。
外部テーブルの検索と削除のクエリも合わせて記載しておきます。
// 1.外部テーブルとして取り込むコンテナ内のログのスキーマを取得
let options = dynamic({
'StorageContainers': [
h@'https://satestactlog9483762.blob.core.windows.net/insights-activity-logs;impersonate'
],
'FileExtension': '.json',
'DataFormat': 'json'
});
evaluate infer_storage_schema(options)
// 2.外部テーブルを作成
// ※()内のスキーマには1.で取得したスキーマを入力してください。ここではActivityLogのスキーマを入力しています。
.create external table Test_ExternalTable001
(
RoleLocation:string, Stamp:string, ReleaseVersion:string, ['time']:datetime, resourceId:string, operationName:string, category:string, resultType:string, resultSignature:string, durationMs:long, callerIpAddress:string, correlationId:guid, ['identity']:dynamic, level:string, properties:dynamic, tenantId:guid, resultDescription:string
)
kind=storage
dataformat=json
(
h@'https://satestactlog9483762.blob.core.windows.net/insights-activity-logs;impersonate'
)
// 3-1.クエリで検索
external_table("Test_ExternalTable001")
// 3-2.クエリで検索(時間でフィルタリングして表示件数を絞る)
external_table("Test_ExternalTable001")
| where ['time'] >= ago(6h)
// 3-2.クエリで検索(時間でフィルタリングして表示件数を絞る)
external_table("Test_ExternalTable001")
| where category == "Administrative"
| project ['time'], category, operationName
// 4.外部テーブルを削除
.drop external table ["Test_ExternalTable001"]
[参考] .createコマンドに関する公式ドキュメント

[参考] infer_storage_schema に関する公式ドキュメント
