Azure ではリソースに対して 診断設定 を実施することで、リソースに対しての各種情報を指定した宛先に保存することができます。
取得する項目の取得については、カテゴリ グループとカテゴリを使用して選択することができるのですが、この設定について、いくつか理解度が低いところがあり、改めて情報を確認した内容についてまとめておきたいと思います。
Contents
カテゴリ グループとカテゴリ
診断設定の設定は次のような画面となっており、ログの取得は「カテゴリ グループ」と「カテゴリ」から取得項目を選択することができます。
ログについてはカテゴリ グループとカテゴリから選択することができ、これらの違いについては リソース ログ に記載されています。
特定のカテゴリの情報を取得せばよいということ確定しているのであれば、「カテゴリ」を明示的に選択した状態にすることで対応することができます。
ログの情報の取得では「allLogs」「audit」の 2 つの「カテゴリ グループ」が提供されているケースがあります。
カテゴリ グループを選択することで、該当のグループにカテゴライズされているカテゴリを自動的に選択した状態にすることができ、今後カテゴリ グループに新しいカテゴリが追加された場合も自動的に選択された状態にすることができますので、項目の追加にも柔軟に対応することができます。
目的に応じたカテゴリ グループが提供されているのであれば、カテゴリ グループを使用するほうが運用の利便性は高いのではないでしょうか。
カテゴリ グループに含まれるカテゴリの取得方法
Azure Portal で操作する場合は、カテゴリ グループを選択することで自動的に選択が行われますので、選択された内容を確認することでカテゴリ グループに含まれているカテゴリを把握することができます。
それ以外の方法として、診断設定のカテゴリについては、Get-AzDiagnosticSettingCategory で取得する方法が提供されています。
このコマンドレットを使用することで、カテゴリ グループと カテゴリの情報を取得することができます。
単純に実行した場合は、Name しか出力が行われませんので出力項目については明示的に指定する必要があります。
以下はサンプルとなりますが、ストレージアカウントの BLOB の診断設定のカテゴリ グループ / カテゴリの情報を出力する場合は次のようになります。
$subscriptionId = "<Subscription Id>" $resourceGroup = "<Resource Group Name>" $storageAccount = "<Storage Account Name>" $results = Get-AzDiagnosticSettingCategory -ResourceId "/subscriptions/$($subscriptionId)/resourceGroups/$($resourceGroup)/providers/Microsoft.Storage/storageAccounts/$($storageAccount)/blobServices/default" $results | Select CategoryType, Name, CategoryGroup
実行結果が以下となりますが、カテゴリ (Name) がどのカテゴリ グループに設定されているかを確認することができます。
BLOB の場合は、allLogs と audit は同一となっており、どちらのカテゴリ グループを選択しても取得できる情報には差はありませんが、このような方法を使用すると、カテゴリ グループによってどのカテゴリが取得されるかを把握することができます。
REST API を使用した取得
上記はコマンドレットで実行していますが、REST API を直接呼び出すことでも情報は取得できます。
$subscriptionId = "<Subscription Id>" $resourceGroup = "<Resource Group Name>" $storageAccount = "<Storage Account Name>" $path = "/subscriptions/$($subscriptionId)/resourceGroups/$($resourceGroup)/providers/Microsoft.Storage/storageAccounts/$($storageAccount)/providers/Microsoft.Insights/diagnosticSettingsCategories?api-version=2021-05-01-preview" $results = Invoke-AzRestMethod -Method GET -path $path (($results.Content | Convertfrom-json).value).properties | ft
監査目的のログを取得したい場合、「audit」のカテゴリ グループが提供されているのであれば、そのカテゴリグループを選択しておけば必要となるカテゴリは動的にメンテナンスをされながら取得が行えるということになります。
同一の宛先に対して、複数の診断設定を設定する場合の注意点
診断設定は最大で、5 つまで設定することができます。
作成する設定で同一の宛先を指定することができるため、カテゴリ グループ / カテゴリに応じて設定を分けておくということも可能なのですが、各設定で同一の宛先を指定する場合には注意が必要となります。
同一の宛先に対して、複数の設定を使用して同一のカテゴリの情報を送信しようとすると、次の画像のように「Conflict」が発生します。
「同一の宛先に対して、複数の設定を使用して同一のカテゴリの情報を複数送信」しようとすると競合が発生し設定を行うことができません。
そのため、宛先として一つの Log Analytics Workspace を指定して、
- Setting #1: allLogs のカテゴリ グループを有効
- Setting #2: audit のカテゴリ グループを有効
のような診断設定を行うと、同一の宛先に対して allLogs と audit の両方で対象となっているカテゴリの取得が行われる設定となってしまうため競合のエラーが発生します。
宛先が違っていれば、同一のカテゴリを取得することができるのですが「同一の宛先に対して同一のカテゴリを複数送信することができない」使用となっていますので、カテゴリグループごとに設定を分ける場合などは取得するカテゴリの選択には注意が必要となります。
同一の宛先に同一のカテゴリを送信する設定ができてしまうのは想定しない動作となる
先ほど「同一の宛先に対して同一のカテゴリを複数送信することができない」と記載しましたが。
本来これが想定された動作となるのですが、Bicep 等で設定をする際に「「同一の宛先に対して同一のカテゴリを送信する設定を同時に実施する」と、実際に設定ができてしまうことがあります。
例としては次のような Bicep で診断設定を行った場合です。
resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2023-04-01' existing = { name: 'default' parent: storage } resource blobServiceDiagnosticSetting 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = { name: 'diag-${storage.name}-blob' scope: blobService dependsOn: [ blobService ] properties: { workspaceId: logAnalyticsId logs: [ { categoryGroup: 'allLogs' enabled: true } ] metrics: [] } } resource blobServiceSecurityDiagnosticSetting 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = { name: 'diag-${storage.name}-blob-security' scope: blobService dependsOn: [ blobService ] properties: { workspaceId: logAnalyticsId logs: [ { categoryGroup: 'audit' enabled: true } ] metrics: [] } }
この Bicep では blobService のシンボルの取得後に診断設定を実施していますが、診断設定の実施は「blobServiceDiagnosticSetting」「blobServiceSecurityDiagnosticSetting」が同時に実行されており、Bicep の展開が正常に完了します。
実際の設定としても、次の画像のように、同一の宛先に対して同一のカテゴリの情報取得が設定できてしまいます。(log-myLogAnalyticsWorkspace に対して、allLogs と audit で重複したカテゴリの取得が行われていますが、設定ができてしまっています)
このような状態となった場合、本来は設定ができない想定されない状態となっているため、Bicep の実行は初回は正常に完了しますが、2 回目以降の実行はエラーとなってしまい、冪等性が担保できない状態となってしまいます。
「異なる宛先に対して同一のカテゴリを送信する」ことは可能ですので、上記のような競合のエラーが発生した場合、「同一の宛先に同一のカテゴリを送信」する設定となっていないかを確認する必要があります。