JavaScriptを有効にしてください

Azure Monitor エージェントからストレージアカウントへの直接転送を試し隊

 ·   8 分で読めます  ·   [Kento GitHub Copilot]

本記事は GitHub Copilot を活用して作成しています。

Azure Monitor エージェント(AMA)の新機能で、ストレージアカウントに直接データを送信できるようになったので試してみました。

Azure Monitor エージェントとは

Azure Monitor エージェント(AMA)は、Azure 仮想マシンやハイブリッドマシンから監視データを収集するための次世代エージェントです。従来の Log Analytics エージェント(MMA)の後継として開発され、2024年8月に Log Analytics エージェントが廃止されたことを受けて、現在推奨される監視エージェントとなっています。

従来の構成では、Azure Monitor エージェントが収集したデータは Log Analytics ワークスペース にのみ送信可能でした。ログデータを外部システムに送信するには、Log Analytics ワークスペースのエクスポート機能 を使用する必要がありました。

しかし、2024年7月にパブリックプレビュー として、ストレージアカウントへの直接送信機能が追加されました。これにより、Log Analytics ワークスペースを経由せずに、Azure Monitor エージェントから直接ログデータを送信できるようになりました。

新機能の概要

従来の Azure Monitor エージェント

flowchart LR
    VM[仮想マシン] --> AMA["`Azure Monitor
                                 エージェント`"]
    AMA -- 参照 --> DCR["`データ収集ルール`"]
    AMA -- ログ送信 --> LAW["`Log Analytics
                                ワークスペース`"]
    LAW -- エクスポート機能 --> SA["`ストレージ
                                    アカウント`"]
    
    classDef vm fill:#e1f5fe,color:#000,stroke:#01579b
    classDef ama fill:#fff3e0,color:#000,stroke:#e65100
    classDef dcr fill:#f3e5f5,color:#000,stroke:#4a148c
    classDef law fill:#e8f5e8,color:#000,stroke:#2e7d32
    classDef storage fill:#fce4ec,color:#000,stroke:#880e4f
    
    class VM vm
    class AMA ama
    class DCR dcr
    class LAW law
    class SA storage

新機能による Azure Monitor エージェント

flowchart LR
    VM[仮想マシン] --> AMA["`Azure Monitor
                                 エージェント`"]
    AMA -- 参照 --> DCR[データ収集ルール]
    AMA -- ログ送信 --> LAW["`Log Analytics
                                ワークスペース`"]
    AMA -- ログ送信 --> SA["`ストレージ
                                    アカウント`"]

    classDef vm fill:#e1f5fe,color:#000,stroke:#01579b
    classDef ama fill:#fff3e0,color:#000,stroke:#e65100
    classDef dcr fill:#f3e5f5,color:#000,stroke:#4a148c
    classDef law fill:#e8f5e8,color:#000,stroke:#2e7d32
    classDef storage fill:#fce4ec,color:#000,stroke:#880e4f
    
    class VM vm
    class AMA ama
    class DCR dcr
    class LAW law
    class SA storage

この新機能により、以下のようなメリットがあります:

  • 長期アーカイブ: ストレージアカウントに低コストでログを長期保存
  • コスト最適化: Log Analytics ワークスペースエクスポート機能を使用せず、直接ストレージに送信することでコスト削減
  • データ統合: 他のシステムとの連携が容易

対応するデータソース

現在この機能がサポートしているデータ型は公開情報を見てください
Event Hubs と Storage にデータを送信する (プレビュー) - Azure Monitor | Microsoft Learn

ざっくり手順

1. 前提条件の確認

以下のリソースが必要です:

  • Azure 仮想マシン(本記事では Windows を用います)

2. ストレージアカウントの準備

ログデータを格納するストレージアカウントを作成します。

storage_account_creation
ストレージアカウントの作成: 汎用 v2 ストレージアカウントを選択

重要な設定項目:

  • アカウントの種類: StorageV2(汎用 v2)
  • レプリケーション: 要件に応じて選択(LRS、GRS など)
  • アクセス層: Hot(頻繁にアクセスする場合)

3. マネージド ID の作成

Azure Monitor エージェントがストレージアカウントや Event Hubs にアクセスできるよう、適切な権限を設定します。
Azure Monitor エージェントは、大規模な展開の場合、ユーザー割り当てマネージド ID を使用することが推奨されています。

managed_identity_setup
マネージド ID の設定: 仮想マシンでシステム割り当てマネージド ID を有効化
managed_identity_setup02
マネージド ID の設定: 仮想マシンでシステム割り当てマネージド ID を有効化

必要な権限:

送信先 必要なロール 説明
ストレージアカウント Storage Blob Data Contributor BLOB データの読み書き権限
ストレージアカウント Storage Table Data Contributor テーブルデータの読み書き権限

作成したマネージド ID を仮想マシンに割り当てておきます

managed_identity_setup03
マネージド ID の設定: 仮想マシンでシステム割り当てマネージド ID を有効化

4. データ収集ルールの作成

Azure Portal でデータ収集ルール(DCR)を作成します。
現在は Storage Account および Event Hub への直接送信が可能な DCR の作成を GUI で行うことはできません。
そこで ARM テンプレートを使用して DCR を作成します。

現在、Event Hubs またはストレージにデータを送信するデータ収集規則 (DCR) を作成するための UI エクスペリエンスはありません。

Event Hubs と Storage にデータを送信する (プレビュー) - Azure Monitor | Microsoft Learn

Azure Portal で [カスタム テンプレートのデプロイ] を選択し、[独自のテンプレートをエディターに作成]を選択します
以下の ARM テンプレートを貼り付けてください。
※公開情報の ARM テンプレートを参考に Event hub への送信先を削除しました。今回利用しないログの送信設定もありますが、一旦そのままにしています

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]",
    "metadata": {
        "description": "Location for all resources."
    }
    },
    "dataCollectionRulesName": {
    "defaultValue": "[concat(resourceGroup().name, 'DCR')]",
    "type": "String"
    },
    "storageAccountName": {
    "defaultValue": "[concat(resourceGroup().name, 'sa')]",
    "type": "String"
    }
},
"resources": [
    {
    "type": "Microsoft.Insights/dataCollectionRules",
    "apiVersion": "2022-06-01",
    "name": "[parameters('dataCollectionRulesName')]",
    "location": "[parameters('location')]",
    "kind": "AgentDirectToStore",
    "properties": {
        "dataSources": {
            "performanceCounters": [
                {
                "streams": [
                    "Microsoft-Perf"
                ],
                "samplingFrequencyInSeconds": 10,
                "counterSpecifiers": [
                    "\\Process(_Total)\\Working Set - Private",
                    "\\Memory\\% Committed Bytes In Use",
                    "\\LogicalDisk(_Total)\\% Free Space",
                    "\\Network Interface(*)\\Bytes Total/sec"
                ],
                "name": "perfCounterDataSource10"
                }
            ],
            "windowsEventLogs": [
                {
                "streams": [
                    "Microsoft-Event"
                ],
                "xPathQueries": [
                    "Application!*[System[(Level=2)]]",
                    "System!*[System[(Level=2)]]"
                ],
                "name": "eventLogsDataSource"
                }
            ],
            "iisLogs": [
                {
                "streams": [
                    "Microsoft-W3CIISLog"
                ],
                "logDirectories": [
                    "C:\\inetpub\\logs\\LogFiles\\W3SVC1\\"
                ],
                "name": "myIisLogsDataSource"
                }
            ],
            "logFiles": [
                {
                "streams": [
                    "Custom-Text-logs"
                ],
                "filePatterns": [
                    "C:\\JavaLogs\\*.log"
                ],
                "format": "text",
                "settings": {
                    "text": {
                    "recordStartTimestampFormat": "ISO 8601"
                    }
                },
                "name": "myTextLogs"
                }
            ]
        },
        "destinations": {
        "storageBlobsDirect": [
            {
            "storageAccountResourceId": "[resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
            "name": "blobNamedPerf",
            "containerName": "PerfBlob"
            },
            {
            "storageAccountResourceId": "[resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
            "name": "blobNamedWin",
            "containerName": "WinEventBlob"
            },
            {
            "storageAccountResourceId": "[resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
            "name": "blobNamedIIS",
            "containerName": "IISBlob"
            },
            {
            "storageAccountResourceId": "[resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
            "name": "blobNamedTextLogs",
            "containerName": "TxtLogBlob"
            }
        ],
        "storageTablesDirect": [
            {
            "storageAccountResourceId": "[resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
            "name": "tableNamedPerf",
            "tableName": "PerfTable"
            },
            {
            "storageAccountResourceId": "[resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
            "name": "tableNamedWin",
            "tableName": "WinTable"
            },
            {
            "storageAccountResourceId": "[resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
            "name": "tableUnnamed"
            }
        ]
        },
        "dataFlows": [
        {
            "streams": [
                "Microsoft-Perf"
            ],
            "destinations": [
                "blobNamedPerf",
                "tableNamedPerf",
                "tableUnnamed"
            ]
        },
        {
            "streams": [
                "Microsoft-Event"
            ],
            "destinations": [
                "blobNamedWin",
                "tableNamedWin",
                "tableUnnamed"
            ]
        },
        {
            "streams": [
                "Microsoft-W3CIISLog"
            ],
            "destinations": [
                "blobNamedIIS"
            ]
        },
        {
            "streams": [
                "Custom-Text-logs"
            ],
            "destinations": [
                "blobNamedTextLogs"
            ]
        }
        ]
    }
    }
]
}

ストレージ アカウント名は作成したものを入力しておきます

dcr_creation
データ収集ルールの作成: 新しい送信先として ストレージアカウント を選択

5. 仮想マシンへの関連付け

作成したデータ収集ルールを監視対象の仮想マシンに関連付けます。
これも ARM テンプレートを使用して行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "vmName": {
    "defaultValue": "[concat(resourceGroup().name, 'vm')]",
    "type": "String"
    },
    "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]",
    "metadata": {
        "description": "Location for all resources."
    }
    },
    "dataCollectionRulesName": {
    "defaultValue": "[concat(resourceGroup().name, 'DCR')]",
    "type": "String",
    "metadata": {
        "description": "Data Collection Rule Name"
    }
    },
    "dcraName": {
    "type": "string",
    "defaultValue": "[concat(uniquestring(resourceGroup().id), 'DCRLink')]",
    "metadata": {
        "description": "Name of the association."
    }
    },
    "identityName": {
    "type": "string",
    "defaultValue": "[concat(resourceGroup().name, 'UAI')]",
    "metadata": {
        "description": "Managed Identity"
    }
    }
},
"resources": [
    {
    "type": "Microsoft.Compute/virtualMachines/providers/dataCollectionRuleAssociations",
    "name": "[concat(parameters('vmName'),'/microsoft.insights/', parameters('dcraName'))]",
    "apiVersion": "2021-04-01",
    "properties": {
        "description": "Association of data collection rule. Deleting this association will break the data collection for this virtual machine.",
        "dataCollectionRuleId": "[resourceID('Microsoft.Insights/dataCollectionRules',parameters('dataCollectionRulesName'))]"
    }
    },
    {
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "name": "[concat(parameters('vmName'), '/AMAExtension')]",
    "apiVersion": "2020-06-01",
    "location": "[parameters('location')]",
    "dependsOn": [
        "[resourceId('Microsoft.Compute/virtualMachines/providers/dataCollectionRuleAssociations', parameters('vmName'), 'Microsoft.Insights', parameters('dcraName'))]"
    ],
    "properties": {
        "publisher": "Microsoft.Azure.Monitor",
        "type": "AzureMonitorWindowsAgent",
        "typeHandlerVersion": "1.0",
        "autoUpgradeMinorVersion": true,
        "settings": {
        "authentication": {
            "managedIdentity": {
            "identifier-name": "mi_res_id",
            "identifier-value": "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('identityName'))]"
            }
        }
        }
    }
    }
]
}
vm_association
仮想マシンの関連付け: データ収集ルールのリソースタブから仮想マシンを追加

6. 動作確認

設定完了後、データが送信されるまでしばらく待ちます

6-1. ストレージアカウントでの確認

ストレージアカウントの BLOB コンテナーにログファイルが作成されているかを確認します。
perfblob、wineventblob というコンテナーが作成され、ログファイルが保管されています

storage_logs_verification
ストレージアカウント内のログ: 日付別のフォルダー構造でログが保存される

テーブルにも同様にデータが保存されます。

storage_table_verification
ストレージアカウント内のテーブル: テーブルにログデータが保存される

6-2. ログデータの内容確認

ダウンロードしてみると下記のようなデータが保存されています(一部抜粋)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
    "records": [
        {
            "time": "2025-07-08T08:29:06.9414852Z",
            "CounterName": "\\Process(_Total)\\Working Set - Private",
            "CounterValue": 586563584.0,
            "SampleRate": 10,
            "Counter": "Process\\Working Set - Private",
            "Instance": "_Total"
        },
        {
            "time": "2025-07-08T08:29:06.9414852Z",
            "CounterName": "\\LogicalDisk(_Total)\\% Free Space",
            "CounterValue": 90.83481786350512,
            "SampleRate": 10,
            "Counter": "LogicalDisk\\% Free Space",
            "Instance": "_Total"
        },
        {
            "time": "2025-07-08T08:29:06.9414852Z",
            "CounterName": "\\Memory\\% Committed Bytes In Use",
            "CounterValue": 10.719915458634475,
            "SampleRate": 10,
            "Counter": "Memory\\% Committed Bytes In Use",
            "Instance": ""
        }
    ]
}

テーブルもデータが保管されています

storage_table_data_verification
ストレージアカウント内のテーブルデータ: テーブルに保存されたログデータの内容

まとめ

Azure Monitor エージェントの新機能により、ログデータをストレージアカウントに直接送信できるようになりました。これにより以下のメリットが得られます:

  • 長期アーカイブ: ストレージアカウントに低コストでログを長期保存
  • コスト最適化: Log Analytics ワークスペースエクスポート機能を使用せず、直接ストレージに送信することでコスト削減
  • データ統合: 他のシステムとの連携が容易

ただし、現在はパブリックプレビュー段階のため、本番環境での使用前には十分なテストを実施することをお勧めします。

今後、この機能が一般提供(GA)されることで、Azure Monitor を使った監視アーキテクチャがより柔軟で効率的になることが期待されます。

参考

共有

Kento
著者
[Kento GitHub Copilot]
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中