リソースが存在しないAzure Monitorのアラートルールを探す

Azure,Azure Monitor,PowerShell/Azure CLI

Azureで仮想マシン等のリソースを削除した場合、一緒にAzure Monitorのアラートルールは削除されません。
そのままにしておくとリソースが存在しないアラートルールがゴミとして残ってしまいます。

そこで今回はリソースが存在しないアラートルールをPowerShellを使って抽出するサンプルを作成してみました。

スポンサーリンク

リソースが存在しないアラートルールを探すPowerShellを作成

Azure Portalでリソースが存在ないアラートルールを確認するとエラーメッセージが表示される

Azure Portalでリソースが存在しないアラートルールを参照した場合にはこのようなエラーメッセージが表示されます。

【メッセージ例】
リソース”リソース名” は移動または削除されました。このアラート ルールの実行を継続するには、スコープを変更してください。

【画面表示例】

アラートルールに関するPowerShellコマンドレット

アラートルールに関してはシグナルの種類に応じて複数のコマンドレットが用意されています。

今回はメトリックアラートを対象に実施しています。

Get-AzMetricAlertRuleV2でアラートルールの情報を確認

Get-AzMetricAlertRuleV2を実行してアラートルールの情報を取得してみます。
特定の仮想マシンをターゲットにCPU使用率のアラートを発生させるルールになります。
実行結果を見るとScopesにターゲットとなる仮想マシンのリソースID、IdにアラートルールのリソースIDが表示されている確認出来ます。

Get-AzMetricAlertRuleV2実行結果

PS C:\> Get-AzMetricAlertRuleV2 -ResourceGroupName Monitor-Test-RG

Criteria : {Metric1}
Actions : {}
ResourceGroup : Monitor-Test-RG
Description :
Severity : 3
Enabled : True
Scopes : {/subscriptions/サブスクリプションID/resourceGroups/Monitor-Test-RG/providers/Microsoft.Compute/virtualMachines/Monitor-TEST-VM-01}
EvaluationFrequency : 00:05:00
WindowSize : 00:05:00
TargetResourceType : Microsoft.Compute/virtualMachines
TargetResourceRegion : eastus2
AutoMitigate : True
LastUpdatedTime :
IsMigrated :
Id : /subscriptions/サブスクリプションID/resourceGroups/Monitor-Test-RG/providers/microsoft.insights/metricAlerts/【Monitor-Test-VM-01】CPU使用率
Name : 【Monitor-Test-VM-01】CPU使用率
Type : Microsoft.Insights/metricAlerts
Location : global
Tags : {}

ScopesのリソースIDが存在するかをGet-AzResourceを使って確認

Get-AzMetricAlertRuleV2でアラートの詳細は表示されますがScopesのリソースIDが存在しているかどうかは確認出来ません。

Get-AzResourceを使うとAzureリソースの情報を取得する事が出来ます。
逆の言い方をするとエラーになる場合はAzureリソースが存在しないと言えます。

Get-AzResourceを使ってAzure MonitorアラートルールのScopesにあるリソースIDが存在するかどうかを確認する事が出来ます。

リソースが存在しないアラートルールを探すPowerShellサンプル

上記を踏まえてサンプルのPowerShellを作ってみます。Monitor-Test-RGと言うリソースグループを対象に実施しています。

    • 内容
      • Get-AzMetricAlertRuleV2でリソースグループに存在するアラートルールを取得
      • Get-AzResourceでリソースが存在するかを確認
      • IsNullOrEmptyでリソースの情報が存在しているかどうかを確認
Get-AzMetricAlertRuleV2実行結果
$alertlistarray = Get-AzMetricAlertRuleV2 -ResourceGroupName Monitor-Test-RG

foreach ($alertlist in $alertlistarray )
{
    $resource = Get-AzResource -ResourceId $alertlist.Scopes[0] -ErrorAction SilentlyContinue
   
    if([string]::IsNullOrEmpty($resource))
        {
        #リソースが存在しない場合
        Write-Output “リソースが存在していないアラートルール名は $($alertlist.Name) です。"
        }
    else
        {
        #リソースが存在する場合
        Write-Output “アラートルール名 $($alertlist.Name) はリソースが存在しています。"
        }
}

※パイプで繋ぐなどするともっとシンプルになります。
※サンプルではリソースグループを指定してます。Get-AzMetricAlertRuleV2のみで実行する事でサブスクリプション全体に対して実行する事が出来ます。

ScopesのリソースIDが複数存在する場合はカスタマイズが必要

今回のサンプルでは$alertlist.Scopes[0]として1番目のリソースIDが存在するかどうかのみを確認しています。
複数ある場合に適用する場合には$alertrule.Scopes.countとしてリソースIDの数を取得して確認するようなカスタマイズが必要になります。

アラートルールのスコープがリソースグループやサブスクリプションになる場合はカスタマイズが必要

今回のサンプルではGet-AzResource -ResourceIdでリソースの存在確認を実施しています。
この場合ResourceIdにリソースグループやサブスクリプションを指定するとGet-AzResource: Invalid format of the resource identifier. (Parameter 'idFromServer’)と言うエラーになります。
スコープにリソースグループやサブスクリプションを指定しているかどうかを識別した上でチェックするなどのカスタマイズが必要になります。

リソースが存在しないアラートルールを探すPowerShellを試す

今回のテスト環境

仮想マシン2台のうち1台削除して確認してみます。アラートルールは合計で4個作成しています。

    • テスト環境
      • リソースグループ(Monitor-Test-RG)に2台の仮想マシン(Monitor-TEST-VM-01、02)を作成
      • それぞれの仮想マシンにCPU使用率とメモリ使用率のアラートルールを2つを設定
      • アラートルール作成後に仮想マシン(Monitor-TEST-VM-02)を削除

【アラートルール設定画面】

作成したPowerShellを実行してみる

先ほどのサンプルPowerShellをAlertRuleにリソースは存在するのか.ps1として保存し実行してみました。
リソースの存在確認が出来ている事が確認出来ました。

PowerShell実行結果

PS C:\> AlertRuleにリソースは存在するのか.ps1

アラートルール名【Monitor-Test-VM-01】CPU使用率はリソースが存在しています。
アラートルール名【Monitor-Test-VM-01】メモリ使用率はリソースが存在しています。
リソースが存在していないアラートルール名は【Monitor-Test-VM-02】CPU使用率です。
リソースが存在していないアラートルール名は【Monitor-Test-VM-02】メモリ使用率です。

最後に

非常にシンプルなサンプルですが、Azure Monitorアラートルールのリソースが存在するかどうかの確認をする事が出来ました。
定期実行させる事で不必要なリソースの洗い出しをする事が出来そうです。
今回はサンプルと言う事で非常に簡単に作っていますが、引き続き使い勝手が良くなるよう改善していきたいと思います。