🪵

Azure Monitor エージェントからストレージ アカウントにログを送信する

2024/03/20に公開

はじめに

Azure Monitor エージェントから Log Analytics ワークスペースを経由せずにストレージ アカウントや Event Hub へ直接ログを送信する機能がプレビューとして提供開始しています。従来は一旦 Log Analytics ワークスペースに保管してエクスポート設定をする必要がありましたが、この方法では Log Analytics ワークスペースのインジェスト料金とエクスポート料金のコストがかかってしまいました。今回の方法はまだ料金の情報が出ていませんが、おそらく前述の方法よりは安価に実現可能かと思います。なお、こちらの機能は、Windows 診断拡張機能 (WAD) と Linux 診断拡張機能 (LAD) の後継機能として位置づけられており、今後 WAD と LAD は積極的な開発は行われないようです。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/azure-monitor-agent-send-data-to-event-hubs-and-storage?tabs=linux%2Cwindows-1

前提条件

対象とする VM の Azure Monitor エージェントがユーザー割り当てマネージド ID を使用して構成されている必要があります。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/azure-monitor-agent-manage?tabs=azure-portal

どちらのマネージド 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 を使います。

sample
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

https://learn.microsoft.com/ja-jp/powershell/module/az.monitor/new-azdatacollectionruleassociation?view=azps-11.4.0

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')]"
                        }
                    }
                }
            }
        }
    ]
}
Microsoft (有志)

Discussion