Azure Monitor でのデータ収集の変換
Azure Monitor の変換を使用すると、Log Analytics ワークスペースに送信される前に、受信データをフィルター処理または変更できます。 この記事では、変換とその実装方法についての基本的な説明を示します。 変換を作成する方法について説明した、他のコンテンツへのリンクも記載しています。
変換を使用する理由
次の表では、変換を使用して実現できるさまざまな目標について説明します。
カテゴリ | 詳細 |
---|---|
機密データを削除する | データ ソースによっては、プライバシーやコンプライアンス上の理由から、保存するのが望ましくない情報が送信される場合があります。 機密情報をフィルター処理する。 機密情報を含む行全体、または特定の列を除外できます。 機密情報を難読化する。 IP アドレスや電話番号の数字を共通の文字に置き換えます。 別のテーブルに送信する。 ロールベースのアクセス制御構成が異なる別のテーブルに機密レコードを送信します。 |
詳細情報や計算された情報を使用してデータを強化する | 変換を使用してデータに情報を追加することで、ビジネス コンテキストを提供したり、その後のデータ クエリを簡略化したりすることができます。 詳細情報を含む列を追加する。 たとえば、別の列内の IP アドレスが内部のものか外部のものかを識別する列を追加することもできます。 ビジネス固有の情報を追加する。 たとえば、他の列内の位置情報に基づいて会社の部門を示す列を追加することもできます。 |
データ コストを削減する | Log Analytics ワークスペースに送信されるデータについてはインジェスト コストが発生するため、コストを削減するには、不要なデータを除外する必要があります。 行全体を削除する。 たとえば、特定のリソースからリソース ログを収集する診断設定があるが、生成されるすべてのログ エントリが必要であるわけではない場合があります。 特定の条件に一致するレコードを除外する変換を作成します。 各行から列を削除する。 たとえば、データには、冗長なデータや最小値データを含んだ列が含まれている場合があります。 そのような場合は、不要な列を除外する変換を作成できます。 列内の重要なデータを解析する。 貴重なデータが特定の列に埋もれているテーブルがある場合があります。 変換を使用すると、重要なデータを解析して新しい列を生成し、元の列を削除できます。 特定の行を基本ログに送信する。 基本的なクエリ機能を必要とするデータ内の行を基本ログ テーブルに送信することで、インジェスト コストを削減できます。 |
サポート対象のテーブル
変換を、Log Analytics ワークスペースの次のテーブルに適用できます。
- 「Azure Monitor ログでの変換をサポートするテーブル」に記載されている任意の Azure テーブル
- 任意のカスタム テーブル
変換のしくみ
変換は、データ ソースからデータが配信された後、データが宛先に送信されるまでの間に、Azure Monitor のデータ インジェスト パイプライン内で実行されます。 データ ソースでは、データを送信する前に独自のフィルター処理を実行できますが、宛先に送信されるまでのさらなる操作については、変換に依存することになります。
変換は、データ収集ルール (DCR) で定義されます。変換には、受信データ内の各エントリに個別に適用される、Kusto 照会言語 (KQL) ステートメントが使用されます。 受信データの形式を理解し、宛先で想定されている構造で出力を作成する必要があります。
たとえば、Azure Monitor エージェントを使用して仮想マシンからデータを収集する DCR では、クライアント オペレーティング システムから収集する特定のデータを指定します。 また、データ インジェスト パイプラインへの送信後にそのデータに適用される変換を含めて、データをさらにフィルター処理したり、計算列を追加したりすることもできます。 次の図はこのワークフローを示したものです。
もう 1 つの例は、ログ インジェスト API を使用してカスタム アプリケーションから送信されるデータです。 この場合、アプリケーションはデータ収集エンドポイントにデータを送信し、REST API 呼び出しで DCR を指定します。 DCR には、変換と、宛先のワークスペースおよびテーブルが含まれます。
ワークスペース変換 DCR
ワークスペース変換 DCR は、Log Analytics ワークスペースに直接適用される特殊な DCR です。 これには、1 つ以上のサポート対象テーブルの既定の変換が含まれます。 これらの変換は、データが別の DCR から取得されていない限り、これらのテーブルに送信されるすべてのデータに適用されます。
たとえば、Event
テーブルのワークスペース変換 DCR 内に変換を作成した場合、その変換は、Log Analytics エージェントを実行している仮想マシンによって収集されたイベントに適用されます (このエージェントでは DCR が使用されないため)。 この変換は Azure Monitor エージェントから送信されたデータについては無視されます。このエージェントでは DCR が使用され、独自の変換が提供されることが想定されるためです。
ワークスペース変換 DCR の一般的な用途は、診断設定を使って構成されたリソース ログの収集です。 次の例では、このプロセスを示します。
複数の宛先
変換では、1 つの DCR を使用して、Log Analytics ワークスペース内の複数の宛先にデータを送信できます。 宛先ごとに KQL クエリを指定すると、対応する場所に各クエリの結果が送信されます。 異なるデータ セットを異なるテーブルに送信したり、複数のクエリを使用して異なるデータ セットを同じテーブルに送信したりできます。
たとえば、ログ インジェスト API を使用して Azure Monitor にイベント データを送信できます。 ほとんどのイベントは分析テーブルに送信する必要があります。そうすることで、通常のクエリの対象となることができます。一方、監査イベントは、コストを削減するために、基本ログ用に構成されたカスタム テーブルに送信する必要があります。
複数の宛先を使用するには、現在のところ、新しい DCR を手動で作成するか、既存の DCR を編集する必要があります。 複数の宛先を使用する DCR の例については、「サンプル」セクションを参照してください。
重要
現時点では、DCR 内のテーブルは同じ Log Analytics ワークスペースに存在する必要があります。 1 つのデータ ソースから複数のワークスペースに送信するには、複数の DCR を使用し、それぞれのワークスペースにデータを送信するようにアプリケーションを構成します。
変換を作成する
変換を作成する方法は、データ収集の方法に応じて複数あります。 次の表に、変換を作成するためのさまざまな方法に関するガイダンスを示します。
変換のコスト
変換そのものには直接コストは発生しませんが、次のシナリオでは追加料金が発生する可能性があります。
- たとえば計算列の追加のように、変換によって受信データのサイズが大きくなる場合は、その追加データに対して標準の取り込み料金が課金されます。
- 変換によって受信データが 50% を超えて削減された場合、50% を超えるフィルター処理されたデータ量に対して課金されます。
変換によって得られるデータ処理料金を計算するには、[変換によって除外された GB] - ([取り込まれた合計 GB] / 2) という数式を使用します。 たとえば、100 GB のデータを取り込み、変換によって 70 GB が削除された場合、70 GB - (100 GB / 2)、つまり 20 GB になります。 この計算は、データ収集ルールと日単位に従って行われます。 この料金を回避するには、変換が適用される前に、他の方法を使用して受信データをフィルター処理することをお勧めします。 これにより、変換によって処理されるデータの量を減らし、追加コストを最小限に抑えることができます。
Azure Monitor でのログ データの取り込みと保持に関する現在の料金については、「Azure Monitor の価格」を参照してください。
重要
Log Analytics ワークスペースに対して Azure Sentinel が有効になっている場合、変換によってフィルター処理されるデータの量に関係なく、フィルター インジェスト料金は発生しません。
サンプル
以下の Resource Manager テンプレートでは、さまざまなパターンのサンプル DCR を示します。 これらのテンプレートは、独自のシナリオ向けの変換に合わせて DCR を作成するための出発点として使用できます。
単一の宛先
次の例は、Azure Monitor エージェントでデータを Syslog
テーブルに送信する場合の DCR です。 この例では、変換により、メッセージにerror
があるレコードのデータがフィルター処理されます。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources" : [
{
"type": "Microsoft.Insights/dataCollectionRules",
"name": "singleDestinationDCR",
"apiVersion": "2021-09-01-preview",
"location": "eastus",
"properties": {
"dataSources": {
"syslog": [
{
"name": "sysLogsDataSource",
"streams": [
"Microsoft-Syslog"
],
"facilityNames": [
"auth",
"authpriv",
"cron",
"daemon",
"mark",
"kern",
"mail",
"news",
"syslog",
"user",
"uucp"
],
"logLevels": [
"Debug",
"Critical",
"Emergency"
]
}
]
},
"destinations": {
"logAnalytics": [
{
"workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace",
"name": "centralWorkspace"
}
]
},
"dataFlows": [
{
"streams": [
"Microsoft-Syslog"
],
"transformKql": "source | where message has 'error'",
"destinations": [
"centralWorkspace"
]
}
]
}
}
]
}
複数の Azure テーブル
次の例は、ログ インジェスト API からのデータを Syslog
と SecurityEvent
テーブルの両方に送信する場合の DCR です。 この DCR には、それぞれ異なる transformKql
と OutputStream
を持つ異なる dataFlow
が必要です。 この例では、すべての受信データが Syslog
テーブルに 送信され、悪意のあるデータは SecurityEvent
テーブルにも送信されます。 悪意のあるデータを両方のテーブルにレプリケートしたくない場合は、最初のクエリに where
ステートメントを追加することで、それらのレコードを削除できます。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources" : [
{
"type": "Microsoft.Insights/dataCollectionRules",
"name": "multiDestinationDCR",
"location": "eastus",
"apiVersion": "2021-09-01-preview",
"properties": {
"dataCollectionEndpointId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers//Microsoft.Insights/dataCollectionEndpoints/my-dce",
"streamDeclarations": {
"Custom-MyTableRawData": {
"columns": [
{
"name": "Time",
"type": "datetime"
},
{
"name": "Computer",
"type": "string"
},
{
"name": "AdditionalContext",
"type": "string"
}
]
}
},
"destinations": {
"logAnalytics": [
{
"workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace",
"name": "clv2ws1"
},
]
},
"dataFlows": [
{
"streams": [
"Custom-MyTableRawData"
],
"destinations": [
"clv2ws1"
],
"transformKql": "source | project TimeGenerated = Time, Computer, Message = AdditionalContext",
"outputStream": "Microsoft-Syslog"
},
{
"streams": [
"Custom-MyTableRawData"
],
"destinations": [
"clv2ws1"
],
"transformKql": "source | where (AdditionalContext has 'malicious traffic!' | project TimeGenerated = Time, Computer, Subject = AdditionalContext",
"outputStream": "Microsoft-SecurityEvent"
}
]
}
}
]
}
Azure テーブルとカスタム テーブルの組み合わせ
以下は、ログ インジェスト API からのデータを、それぞれ別の形式で Syslog
テーブルとカスタム テーブルの両方に送信する場合の DCR の例です。 この DCR には、それぞれ異なる transformKql
と OutputStream
を持つ異なる dataFlow
が必要です。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources" : [
{
"type": "Microsoft.Insights/dataCollectionRules",
"name": "multiDestinationDCR",
"location": "eastus",
"apiVersion": "2021-09-01-preview",
"properties": {
"dataCollectionEndpointId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers//Microsoft.Insights/dataCollectionEndpoints/my-dce",
"streamDeclarations": {
"Custom-MyTableRawData": {
"columns": [
{
"name": "Time",
"type": "datetime"
},
{
"name": "Computer",
"type": "string"
},
{
"name": "AdditionalContext",
"type": "string"
}
]
}
},
"destinations": {
"logAnalytics": [
{
"workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace",
"name": "clv2ws1"
},
]
},
"dataFlows": [
{
"streams": [
"Custom-MyTableRawData"
],
"destinations": [
"clv2ws1"
],
"transformKql": "source | project TimeGenerated = Time, Computer, SyslogMessage = AdditionalContext",
"outputStream": "Microsoft-Syslog"
},
{
"streams": [
"Custom-MyTableRawData"
],
"destinations": [
"clv2ws1"
],
"transformKql": "source | extend jsonContext = parse_json(AdditionalContext) | project TimeGenerated = Time, Computer, AdditionalContext = jsonContext, ExtendedColumn=tostring(jsonContext.CounterName)",
"outputStream": "Custom-MyTable_CL"
}
]
}
}
]
}
次のステップ
データ収集ルールを作成し、Azure Monitor エージェントを使用して仮想マシンからそのデータ収集ルールとの関連付けを作成します。