Azure Data Explorer と AzureResource Graph のデータを Log Analytics ワークスペースおよび Application Insights リソース内のデータと関連付けることで、Azure Monitor ログの分析を強化します。 この記事では、Log Analytics ワークスペースにデータを保存するサービスからクロスサービス クエリを実行する方法について説明します。 Microsoft Sentinel は Log Analytics ワークスペースにデータを格納し、Azure Data Explorer へのクロスサービス クエリをサポートしていますが、Microsoft Sentinel のすべての機能が Azure Resource Graph へのクエリをサポートしているわけではありません。
Azure portal の Log Analytics、ブック、PowerShell、REST API など、Kusto クエリ言語 (KQL) クエリをサポートする任意のクライアント ツールを使用して、サービス間クエリを実行します。
[前提条件]
| リソース | アクセス許可が必要 |
|---|---|
| Log Analytics ワークスペース |
クエリを実行する Log Analytics ワークスペースに対する Microsoft.OperationalInsights/workspaces/query/*/readたとえば、Log Analytics 閲覧者の組み込みロールによって提供されます。 |
| Azure Resource Graph | Azure Resource Graph でクエリを実行するリソースの読み取り権限 |
| Azure Data Explorer | Azure Data Explorer でクエリを実行するテーブルへのアクセス許可を表示する |
実装時の注意事項
サービス間クエリは、次のシナリオではサポートされていません。
- 政府機関向けクラウド
- IP 制限または Private Link (プライベート エンドポイント) で構成されたデータ エクスプローラー クラスター
クロスサービスの一般的な考慮事項
- データベース名は大文字と小文字が区別されます。
- パラメーター化されていない関数と、他のクロスワークスペースまたはクロスサービスの式が定義に含まれていない関数を使用します。 使用できる関数には、
adx()、arg()、resource()、workspace()、およびapp()があります。 - クロスサービス クエリでは、データ取得のみがサポートされます。
- サービス間クエリでサポートされるコマンドは、 コマンド
.show。 この機能により、クロス クラスター クエリで Azure Monitor、Azure Data Explorer、または Azure Resource Graph の表形式関数を直接参照できます。
.showサービス間クエリでサポートされるコマンド:.show functions.show function {FunctionName}.show database {DatabaseName} schema as json - クラスター内のタイムスタンプ列の識別はサポートされていません。 Log Analytics の Query API は時間フィルターを渡しません。
-
mv-expandでは、最大 2,000 個のレコードがサポートされます。 - Azure Monitor ログでは、Azure Data Explorer で外部テーブルに対してクエリを実行できるようにする
external_table()関数はサポートされていません。 外部テーブルに対してクエリを実行するには、Azure Data Explorer でパラメータなしの関数としてexternal_table(<external-table-name>)を定義します。 その後、式adx("").<function-name>を使用して関数を呼び出すことができます。 - 共用体ではなく
join演算子 を使用する場合は、hintを使用して、Azure Data Explorer または Azure Resource Graph のデータと Log Analytics ワークスペース内のデータを結合する必要があります。Hint.remote={direction of the Log Analytics workspace}を使用します。
例えば:AzureDiagnostics | join hint.remote=left adx("cluster=ClusterURI").AzureDiagnostics on (ColumnName)
Azure Resource Graph のクロスサービス クエリの考慮事項
- クエリの
arg部分は、最初の 1,000 レコードのみを返します。 制限に達した場合にレコードが不足している可能性があるため、joinと組み合わせる場合は、この点に注意してください。 -
joinオペレーターを使うと、1 つの Azure Resource Graph テーブルと Log Analytics ワークスペース内の 1 つのテーブルのデータを結合できます。 - Azure Monitor は Azure Resource Graph クエリのエラーを返しません。
- Log Analytics クエリ エディターは有効な Azure Resource Graph クエリを構文エラーとしてマークします。 たとえば、有効なクエリでは、"name <valid name> は既知の列、テーブル、変数、または関数を参照していません" のようなエラーが発生する可能性があります。
- これらの演算子はサポートされていません:
smv-apply()、rand()、arg_max()、arg_min()、avg()、avg_if()、countif()sumif()、percentile()、percentiles()、percentilew()、percentilesw()、stdev()、stdevif()、stdevp()、variance()、variancep()、varianceif()、bin_at。 - Microsoft Sentinel では、KQL が使用されているすべての機能でクロスサービス クエリをサポートしているわけではありません。
adx() を使用して Azure Data Explorer のデータのクエリを実行する
Azure Data Explorer クラスターの識別子をクエリの adx パターン内に入力し、その後にデータベース名とテーブルを入力します。
adx('https://help.kusto.windows.net/Samples').StormEvents
Azure Data Explorer クラスター テーブルを Log Analytics ワークスペースと結合する
クラスター テーブルを Log Analytics ワークスペースと結合するには、union コマンドを使用します。
次に例を示します。
union customEvents, adx('https://help.kusto.windows.net/Samples').StormEvents
| take 10
let CL1 = adx('https://help.kusto.windows.net/Samples').StormEvents;
union customEvents, CL1 | take 10
ヒント
短縮形式を使用できます: ClusterName/InitialCatalog。 たとえば、adx('help/Samples') は adx('help.kusto.windows.net/Samples') に変換されます。
一方のテナントの Azure Data Explorer クラスターのデータを他方の Azure Monitor リソースと結合する
サービス間のクロス テナント クエリはサポートされていません。 両方のリソースにまたがるクエリを実行するには、1 つのテナントにサインインします。
Azure Data Explorer リソースがテナント A にあり、Log Analytics ワークスペースがテナント B にある場合は、次の方法のいずれかを使用します。
- Azure Data Explorer を使って、異なるテナントにプリンシパルのロールを追加します。 テナント B のユーザー ID を、許可されているユーザーとして Azure Data Explorer クラスターに追加します。 Azure Data Explorer クラスターの TrustedExternalTenant プロパティにテナント B が含まれていることを検証します。テナント B でクロス クエリを完全に実行します。
- Lighthouse を使用して、Azure Monitor リソースをテナント A に投影します。
さまざまなテナントから Azure Data Explorer クラスターに接続する
Kusto Explorer によって、ユーザー アカウントの所属元であるテナントに自動的にサインインされます。 同じユーザー アカウントを使用して他のテナントのリソースにアクセスするには、接続文字列に TenantId を明示的に指定する必要があります。
Data Source=https://ade.applicationinsights.io/subscriptions/SubscriptionId/resourcegroups/ResourceGroupName;Initial Catalog=NetDefaultDB;AAD Federated Security=True;Authority ID=TenantId
arg() を使用して Azure Resource Graph のデータのクエリを実行する (プレビュー)
arg("") パターンに続けて Azure Resource Graph テーブル名を入力します。
次に例を示します。
arg("").<Azure-Resource-Graph-table-name>
ヒント
arg() オペレーターは、Microsoft Defender ポータルで高度なハンティングに使用できるようになりました。 この機能を使用すると、Microsoft Sentinel テーブルに対してクエリを実行する結果を得ることができます。 詳細については、 高度なハンティングでの Azure Resource Graph クエリに関するページを参照してください。
新しい Azure Resource Graph のクロスサービス クエリ機能を使用する Azure Log Analytics クエリのサンプルを次に示します。
例: Azure Resource Graph クエリの結果に基づいて Log Analytics クエリをフィルター処理する
arg("").Resources
| where type == "microsoft.compute/virtualmachines" and properties.hardwareProfile.vmSize startswith "Standard_D"
| join (
Heartbeat
| where TimeGenerated > ago(1d)
| distinct Computer
)
on $left.name == $right.Computer
例: arg() クエリから取得した特定のリソースにのみ適用されるアラート ルールを作成する
タグに基づいてリソースを除外します。 たとえば、 Test タグを持つ VM のアラートをトリガーしないでください。
arg("").Resources
| where tags.environment=~'Test'
| project name
CPU 使用率に関連するパフォーマンス データを取得し、 prod タグを使用してリソースにフィルター処理します。
InsightsMetrics
| where Name == "UtilizationPercentage"
| lookup (
arg("").Resources
| where type == 'microsoft.compute/virtualmachines'
| project _ResourceId=tolower(id), tags
)
on _ResourceId
| where tostring(tags.Env) == "Prod"
その他のユース ケースの例
- タグを使用して、VM が 24 時間 365 日実行されているか、夜間にシャットダウンする必要があるかを判断します。
- 定義された数のコアを含む任意のサーバーにアラートを表示します。
Log Analytics ワークスペースからクロスサービス クエリに基づいてアラートを作成する
Log Analytics ワークスペースからクロスサービス クエリに基づいてアラート ルールを作成するには、「 ログ検索アラート ルールを作成または編集する」の手順に従って、[ スコープ ] タブで Log Analytics ワークスペースを選択します。
ヒント
アラートのスコープとして関連リソースを選択して、Azure Data Explorer と Azure Resource Graph から Log Analytics ワークスペースへのクロスサービス クエリを実行します。
Azure Resource Graph テーブルを Log Analytics ワークスペースと結合する
クラスター テーブルを Log Analytics ワークスペースと結合するには、union コマンドを使用します。
次に例を示します。
union AzureActivity, arg("").Resources
| take 10
let CL1 = arg("").Resources ;
union AzureActivity, CL1 | take 10
共用体ではなく join 演算子 を使用する場合は、 hint を使用して、Azure Resource Graph のデータと Log Analytics ワークスペース内のデータを組み合わせる必要があります。
Hint.remote={Direction of the Log Analytics Workspace}を使用します。 次に例を示します。
Perf | where ObjectName == "Memory" and (CounterName == "Available MBytes Memory")
| extend _ResourceId = replace_string(replace_string(replace_string(_ResourceId, 'microsoft.compute', 'Microsoft.Compute'), 'virtualmachines','virtualMachines'),"resourcegroups","resourceGroups")
| join hint.remote=left (arg("").Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project _ResourceId=id, tags) on _ResourceId | project-away _ResourceId1 | where tostring(tags.env) == "prod"