SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure で診断設定が設定されていないリソースの確認と注意点

leave a comment

Azure の診断設定が設定されていないリソースの確認方法と注意点について。

注意が必要なのはスクリプトを使用した取得になるかと。

診断設定が設定されていないリソースの確認方法

診断設定が設定されていないリソースの確認方法としては、Azure Portal の使用 / スクリプトによる取得の二種類を利用することができるのではないでしょうか。

 

Azure Portal を使用した診断設定の設定状況の確認

Azure Portal から診断設定を確認する場合、私が使用しているのは次の 2 つの方法となります。

  1. Azure モニター -> 診断設定
  2. リソースグループ -> 診断設定
    • Azure モニターの診断設定の情報を表示しているリソースグループでフィルターしているため、本質的には Azure モニターで確認するものと同じになるかと。

これらの方法では次の画像のようにリソース毎に「診断の状態」を確認することができます。

image

稀に、このブレードで表示されない診断設定をサポートするリソースがあったりもしますが、診断設定の状態を確認する際にはこのブレードは役に立ちます。(診断設定を行うルールとして、このブレードをサポートしているものとするのは一つの考え方になるかと)

 

スクリプトを使用した診断設定の設定状況を取得

スクリプトで診断設定の設定状況を取得する場合、次のようなスクリプトを使用することができるかと。

$sunbscriptionId = "<サブスクリプション ID>"
$resourceGroupName = "<リソースグループ名>"
Connect-AzAccount -Subscription $sunbscriptionId -UseDeviceAuthentication


$resources = Get-Azresource -ResourceGroupName $resourceGroupName 
$results = New-Object System.Collections.ArrayList
foreach ($resource in $resources) {
    try {
        $diagSettings = Get-AzDiagnosticSetting -resourceId $resource.ResourceId -ErrorAction Stop 
        if ($null -eq $diagSettings) {
            [void]$results.Add(
                [PSCustomObject]@{ 
                    "Name"              = $resource.Name
                    "ResourceType"      = $resource.ResourceType
                    "DiagnosticSetting" = $null
                } 
    
            )
        }       
        else {
            foreach ($diagSetting in $diagSettings) {
                [void]$results.Add(
                    [PSCustomObject]@{ 
                        "Name"              = $resource.Name
                        "ResourceType"      = $resource.ResourceType
                        "DiagnosticSetting" = $diagSetting.Name 
                    } 
    
                )    
            }
        }
    }
    catch [System.Exception] {
        Write-Error "Not support diagnostic setting for resource: $($resource.Name) ($resource.ResourceType)"
    }
    catch {
        Write-Error $_
    }
}
$results | ? DiagnosticSetting -eq $null| Sort-Object -Property ResourceType 

 

実行すると次のように診断設定が設定されていないリソースの情報が取得されます。

image

この方法での取得ですが問題があり、「診断設定によるエクスポートを使用できないリソースも情報が取得されてしまっている」という注意点があります。

診断設定がサポートされているリソースを確認する際には、Azure Monitor のサポートされるメトリック / Azure Monitor でサポートされているリソース ログ カテゴリ の情報を確認するのですが、これらのページに記載されているすべてのリソースが診断設定をサポートしているというわけではないようです。

診断設定については「Exportability」 をサポートしているリソースの必要があります。

  • エクスポート可能性。 REST API を使用するとすべてのメトリックをエクスポートできますが、診断設定を使用した場合は、Azure Monitor バックエンドでの複雑さのため一部のメトリックをエクスポートできません。 以下の表の "診断設定を使用したエクスポートが可能か" の列には、この方法でエクスポートできるメトリックがリストされています。

上記の画像では、「Microsoft.Compute/disks」が情報として出力されています。

このリソースについては、「DS エクスポート」が「いいえ」となっています。

image

DS エクスポートは診断設定によりエクスポートが可能かを示す項目となります。

DS エクスポート – メトリックが診断設定を介して Azure Monitor ログにエクスポート可能かどうかを示します。

 

現状、スクリプトでチェックをしようとした場合、エクスポートをサポートするかは確認することができなさそうで、診断設定によりエクスポートをサポートしていないリソースについても、診断設定を取得可能なリソースとして認識をしてしまいそうでした。

この動作については、Get-AzDiagnosticSettingCategory returns categories, but the type doesn’t support Diagnostic Settings として Issue が上がっています。

エクスポートをサポートしていないリソースに対して、診断設定を設定しようとすると「The resource type ‘microsoft.compute/disks’ does not support diagnostic settings.」というような Exception が発生し、設定を行うことができません。

このようなリソースのログ / メトリックをエクスポートしたい場合は、REST API 経由でリソース ログ / プラットフォーム メトリックを取得してエクスポートするような処理を個別に実装する必要があるのではないでしょうか。

スクリプトで診断設定が未設定となっているリソースであり、診断設定をサポートするリソースのみを抽出することが出来ればよかったのですが、現状フィルターに使用できそうな項目が無く、スクリプトで機械的にフィルターをするのは難しいのかもしれません。

 

まとめ

現状、診断設定が未設定のリソースの確認は Azure ポータルから確認するのが良さそうな雰囲気がありました。

スクリプトで実装する場合には Get-AzDiagnosticSettingCategory returns categories, but the type doesn’t support Diagnostic Settings の状況を確認するのが良さそうかと思います。

Share

Written by Masayuki.Ozawa

8月 30th, 2024 at 9:51 pm

Posted in Azure

Tagged with

Leave a Reply