🌳

Azure Monitor の集計ルール

2024/07/12に公開

はじめに

Azure Monitor 集計ルールがプレビューでリリースされました。ドキュメントを見ているといろいろ便利そうなので、試してみようと思います。

更新履歴

日付 内容
2024/07/12 新規作成
2024/08/04 Azure ポータルの Sentinel のメニューからの設定方法を追記

仕様

公式ドキュメントはこちらです。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/summary-rules?tabs=api

ドキュメントを読むと何ができるかパッと理解が難しいのですが、ざっくりと以下の認識です。

  • 書き込まれたログに対して、指定した間隔で集計用のクエリを定期実行する
  • 集計用クエリの実行結果をカスタム テーブルに書き込む
  • 実行間隔や集計用クエリはカスタマイズ可能

ドキュメントにもありますが、想定用途として以下になるかと思います。

  • 大規模なログデータの集計
    月次または年次で集計やレポート作成する場合にそのままクエリを実行するとタイムアウトになるケース。その場合に一定間隔で集計しておくことで、まとめて集計するときの効率がよくタイムアウトを懸念する必要がない。

  • コスト削減
    ログすべては必要ないけれども集計データが必要であるため、ログを収集しているケース。この場合、Basic ログに記録して集計ルールを使用して集計データのみをカスタム テーブルに分析ログとして記録する。ただし Basic ログを集計ルールで処理する場合は別途コストがかかる。

試す

現状は Azure ポータルからは設定できず、ARM テンプレートもしくは API 経由になります。今回は SigninLogs を集計し、SigninLogsSummary_CL テーブルに記録するルールを作成します。API 経由の場合、PowerShell で実行するには以下になります。なお、集計データに合うカスタム テーブルも併せて作成しています。

# 必要なパラメータの設定
$subscriptionId = "mysubscription"
$resourcegroupName = "myrg"
$workspaceName = "mylaws"
$tableName = "SigninLogsSummary_CL"

# カスタム テーブルのカラム定義
$column = @{
    'TimeGenerated' = 'DateTime';
    'UserPrincipalName' = 'string';
    'IPAddress' = 'string';
    'AppDisplayName' = 'string';
    'ConditionalAccessStatus' = 'string';
    'StatusCode' = 'string';
    'Count' = 'int'
}

# Azure へのサインイン
Connect-AzAccount -subscription $subscriptionId

# カスタムテーブルの作成
New-AzOperationalInsightsTable -ResourceGroupName $resourceGroupName -WorkspaceName $workspaceName -TableName $tableName -Column $column


# 集計ルール名の設定
$ruleName = "SigninLogsSummaryRule"

# API エンドポイントの設定
$endpoint = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.OperationalInsights/workspaces/$workspaceName/summarylogs/$ruleName" + "?api-version=2023-01-01-preview"

# 集計ルールの定義
$ruleDefinition = @{
    properties = @{
        ruleType = "User"
        description = "SigninLogs Summary Rule"
        ruleDefinition = @{
            query = "SigninLogs | extend StatusCode = tostring(Status.errorCode) | summarize count() by UserPrincipalName, IPAddress, AppDisplayName, ConditionalAccessStatus, StatusCode"
            binSize = 60
            destinationTable = "SigninLogsSummary_CL"
        }
    }
}

# json に変換
$ruleDefinitionJson = $ruleDefinition | ConvertTo-Json -Depth 8

# 集計ルールの作成
Invoke-AzRestMethod -Method Put -Path $endpoint -Payload $ruleDefinitionJson

実行結果

想定通りに集計されていました。集計件数は特に指定しなければ count_ に記録されていますね。

2024/8/4 追記

Sentinel の画面から設定できるようになっていました。こちらでは概要ルールの表記になています。カスタム テーブルの作成もできます。



Microsoft (有志)

Discussion