Azure Monitor エージェントからストレージ アカウントにログを送信する
はじめに
Azure Monitor エージェントから Log Analytics ワークスペースを経由せずにストレージ アカウントや Event Hub へ直接ログを送信する機能がプレビューとして提供開始しています。従来は一旦 Log Analytics ワークスペースに保管してエクスポート設定をする必要がありましたが、この方法では Log Analytics ワークスペースのインジェスト料金とエクスポート料金のコストがかかってしまいました。今回の方法はまだ料金の情報が出ていませんが、おそらく前述の方法よりは安価に実現可能かと思います。なお、こちらの機能は、Windows 診断拡張機能 (WAD) と Linux 診断拡張機能 (LAD) の後継機能として位置づけられており、今後 WAD と LAD は積極的な開発は行われないようです。
前提条件
対象とする VM の Azure Monitor エージェントがユーザー割り当てマネージド ID を使用して構成されている必要があります。
どちらのマネージド ID を使用しているかは VM のリソース JSON から確認できます。managedIdentity の項目があればユーザー割り当てマネージド ID、なければシステム割り当てマネージド ID を使用しているはずです。
システム割り当てマネージド ID を使用している場合、補足を確認しただき、Azure Monitor エージェントの設定をユーザー割り当てマネージド ID に切り替えます。
設定
2024 年 3 月時点では Azure ポータルでの設定はできず、ARM テンプレートでデータ収集ルール (DCR) を作成する必要があります。上記の公式ドキュメントにサンプル テンプレートがありますが、今回はとりあえず syslog を BLOB ストレージに格納したいため、余分な箇所は削除し、以下の ARM テンプレートとしました。事前に指定するリソース グループにストレージ アカウントと syslogblob という名前のコンテナを準備しておく必要があります。
{
"$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": {
"syslog": [
{
"streams": [
"Microsoft-Syslog"
],
"facilityNames":
[
"auth",
"authpriv",
"cron",
"daemon",
"mark",
"kern",
"local0",
"local1",
"local2",
"local3",
"local4",
"local5",
"local6",
"local7",
"lpr",
"mail",
"news",
"syslog",
"user",
"uucp"
],
"logLevels":
[
"Debug",
"Info",
"Notice",
"Warning",
"Error",
"Critical",
"Alert",
"Emergency"
],
"name": "syslogDataSource"
}
]
},
"destinations": {
"storageBlobsDirect": [
{
"storageAccountResourceId": "[resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]",
"name": "blobNamedLinux",
"containerName": "syslogblob"
}
]
},
"dataFlows": [
{
"streams": [
"Microsoft-Syslog"
],
"destinations": [
"blobNamedLinux"
]
}
]
}
}
]
}
DCR 作成後、収集する VM をリソースに追加します。これも Azure ポータルでは設定できないようです (VM が表示されない)。ドキュメントは ARM テンプレートになっていますが、面倒なので Azure PowerShell を使います。
New-AzDataCollectionRuleAssociation -AssociationName myCollectionRule2-association1 -ResourceUri /subscriptions/9e223dbe-3399-4e19-88eb-0975f02ac87f/resourcegroups/amcs-test/providers/microsoft.compute/virtualmachines/monitortestvm01 -DataCollectionRuleId /subscriptions/9e223dbe-3399-4e19-88eb-0975f02ac87f/resourceGroups/AMCS-TEST/providers/Microsoft.Insights/dataCollectionRules/myCollectionRule2
PowerShell で設定後は Azure ポータルから確認可能です。
最後に VM の AMA で使用しているユーザー割り当てマネージド ID にストレージ BLOB データ共同作成者のロールを付与します。
ログ確認
ログは VM ごと、 1 時間単位で json ファイルでブロック BLOB として保存されます。1 時間まとめて書き込まれるわけではなく、準リアルタイムでの書き込みのようです。
以下のようなフォーマットになります。
補足1
外部から転送されてくる syslog についてもストレージ アカウントに送信ができました。そのため、大容量になりやすいファイアウォールやプロキシのログをストレージ アカウントに保管することが可能になります。
補足2
システム割り当てマネージド ID を Azure Monitor エージェントで使用している場合、以下の ARM テンプレートで切り替えが可能です。事前にユーザー割り当てマネージド ID を作成する必要があります。
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"vmName": {
"type": "String"
},
"location": {
"type": "String"
},
"userAssignedManagedIdentityResourceId": {
"type": "String"
}
},
"variables": {
"extensionName": "AzureMonitorLinuxAgent",
"extensionPublisher": "Microsoft.Azure.Monitor",
"extensionType": "AzureMonitorLinuxAgent"
},
"resources": [
{
"type": "Microsoft.Compute/virtualMachines/extensions",
"apiVersion": "2019-07-01",
"name": "[concat(parameters('vmName'), '/', variables('extensionName'))]",
"location": "[parameters('location')]",
"properties": {
"publisher": "[variables('extensionPublisher')]",
"type": "[variables('extensionType')]",
"settings": {
"authentication": {
"managedIdentity": {
"identifier-name": "mi_res_id",
"identifier-value": "[parameters('userAssignedManagedIdentityResourceId')]"
}
}
}
}
}
]
}
Discussion