株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

Azure Monitorにてアラート通知をメールにて実装する

こんにちは。クラウド関連業務をしている金沢と申します。
ポリシー違反を発見した場合にアラート通知するという要件を実施してみたく、実際に実証してみました。AZ-104の試験で実際に出てくる要件なのでこちらを勉強されている方にもいいかもしれません。

設計方針

以下Microsoft Learnより引用です。

Azure Monitor ログ
サブスクリプションに関連付けられた Activity Log Analytics ソリューションからの AzureActivity を使用した Log Analytics ワークスペースがある場合は、Kusto クエリと AzureActivity テーブルを使用して、新規および更新されたリソースの評価から非準拠の結果を表示することもできます。 Azure Monitor ログの詳細情報を使用して、非準拠を監視するようにアラートを構成できます。

参考リンク
learn.microsoft.com

これに沿い、コンプライアンス結果とLog Analyticsワークスペース、Log AnalyticsワークスペースとAzure Monitorログをそれぞれ連携させてメール通知を行います。

使用サービス

  • Azure arc
  • Policy
  • Log Analytics ワークスペース
  • Azure Monitor
    • アラート
    • アラート処理ルール
    • アクショングループ

実施手順

1. ポリシーの割り当て

参加したマシンにポリシーを割り当てます。

詳しい設定順序は以下ブログにても紹介しました。Azure arcゲスト構成ポリシーとは - ネットワールド らぼ

今回は手順は省略します。

2. Log Analyticsワークスペースの作成

Azure Monitorから送信されたログを保存・保持します。
もっと平易な表現をすると、送信されたコンプライアンス結果が含まれるデータを入れる箱の役割をします。

「Log Analyticsワークスペース」で検索を行い、「作成」を押下します。

必要な項目に記入を行いデプロイします。
今回は、Japan EastリージョンにAzurearc-DataCollectionというワークスペースを作成しました。また既にLog Analyticsワークスペースがある場合は、そちらを使っていただくのでも問題ないと思います。

3. Azure Monitorエージェントのインストールを確認・インストール

ポリシーのコンプライアンス結果を「ログ」としてLog Analyticsワークスペースに送信、またAzure Policyで監査させるための設定を行います。
Azure Monitorエージェントは各リソースとAzure Monitorを接続するために重要な役割を持ちます。これがないと、Azure Policyでの監査状況を表示・確認することができなくなります。
いくつかやり方があります。

Powershellでインストールを確認・実行

大量にマシンがある場合は以下のコマンドで指定して一覧表示することも可能です。その場合、Azure arc参加マシンかAzure Virtual Machineかで実行コマンドが異なります。
以下は、リソースグループに属しているマシンに対し、一括で実行を確認するコマンドです。

# サブスクリプションをIDで指定する場合
Set-AzContext -SubscriptionId "<サブスクリプションID>"
# サブスクリプションを名前で指定する場合
Set-AzContext -SubscriptionName "<サブスクリプション名>"

# リソースグループ名を指定
$resourceGroupName = "<リソースグループ名>"
# リージョンを指定
$location = "japaneast"

AzureVMの場合

# Azure VM を取得
$azureVMs = Get-AzVM -ResourceGroupName $resourceGroupName

# 各 VM の拡張機能(エージェント)を確認
foreach ($vm in $azureVMs) {
    $extensions = Get-AzVMExtension -ResourceGroupName $resourceGroupName -VMName $vm.Name
    $amaInstalled = $extensions | Where-Object { $_.Name -eq "AzureMonitorWindowsAgent" -or $_.Name -eq "AzureMonitorLinuxAgent" }

    if ($amaInstalled) {
        Write-Host "$($vm.Name): AMA is installed"
    } else {
        Write-Host "$($vm.Name): AMA is NOT installed"
    }
}


成功した場合、上記のように表示されます。

Azure arc接続マシンの場合

# Arc 対応マシンを取得
$arcMachines = Get-AzConnectedMachine -ResourceGroupName $resourceGroupName

# 各マシンの拡張機能(エージェント)を確認
foreach ($machine in $arcMachines) {
    $extensions = Get-AzConnectedMachineExtension -ResourceGroupName $resourceGroupName -MachineName $machine.Name
    $amaInstalled = $extensions | Where-Object { $_.Name -eq "AzureMonitorWindowsAgent" -or $_.Name -eq "AzureMonitorLinuxAgent" }

    if ($amaInstalled) {
        Write-Host "$($machine.Name): AMA is installed"
    } else {
        Write-Host "$($machine.Name): AMA is NOT installed"
    }
}


成功すると、上記のように表示されます。

リソースグループに所属する端末に対し一括でインストールすることもできます。
Azure VMの場合

# AzureVMを取得
$Machines = Get-AzVM -ResourceGroupName $resourceGroupName

# 各マシンに Azure Monitor エージェントをインストール
foreach ($machine in $Machines) {
    Write-Host "Installing AMA on: $($machine.Name)"
    
    Set-AzVMExtension `
        -ResourceGroupName $resourceGroupName `
        -VMName $machine.Name `
        -Location $location `
        -Name "AzureMonitorWindowsAgent" `
        -ExtensionType "AzureMonitorWindowsAgent" `
        -Publisher "Microsoft.Azure.Monitor" `
        -TypeHandlerVersion "1.0"
}

Azure arcの場合

# Arc 対応マシンを取得
$arcMachines = Get-AzConnectedMachine -ResourceGroupName $resourceGroupName

# 各マシンに Azure Monitor エージェントをインストール
foreach ($machine in $arcMachines) {
    Write-Host "Installing AMA on: $($machine.Name)"
    
    Set-AzConnectedMachineExtension `
        -ResourceGroupName $resourceGroupName `
        -MachineName $machine.Name `
        -Location $location `
        -Name "AzureMonitorWindowsAgent" `
        -ExtensionType "AzureMonitorWindowsAgent" `
        -Publisher "Microsoft.Azure.Monitor" `
        -TypeHandlerVersion "1.0"
}
GUIでインストールを確認・実行

特定のマシンだとわかっていたり、少数のマシンだったりする場合はGUIを用いて、ポータルでインストールするほうが早いです。

各マシンを開き、拡張機能>「AzureMonitorWindowsAgent」がインストールされていることを確認します。

ポリシーのアタッチでインストールを確認・実行

設定はやや難解になりますが、確実です。
1.ポリシーの割り当てで実施した手順を応用します。
既にカスタムテンプレートがAzure側に存在し、ちょうどよくやりやすかったのでこちらを使用しました。

learn.microsoft.com
上記リンクに従うと、それまでの設定とは違い新たにマシンを追加した場合に、スコープ条件を満たせば自動でポリシーがアタッチされます。

  • DCRの設定

正式名称Data Collection Ruleを設定すると、Azure Monitorエージェントがリソースに自動でインストールされ、また同時に設定したLog Analyticsワークスペースにデータが送信されます。リソースではなく先ほど紹介したAzure Monitorエージェントに対して設定を行うものです。
DCRは、「どこから」「何を」「どこに」送信するのかを定義したルールです。

先に挙げたリンクではDCRの設定方法に関し特に言及がなかったので、以下リンクに基づいて簡単にDCRのアタッチをご紹介します。learn.microsoft.com
ただ、今回に限ってはこの設定の目的は

Azure Monitorエージェントが指定スコープにて自動インストールができ、またセットアップができる

です。つまり先に述べますと、DCR自体の内容は使いません。今回だけに限った設定の場合、Azure Monitorエージェントが既にインストールされている方、DCRの設定方法をご存じの方、また既に設定しており、対象のリソースとターゲットが完全に一致するDCRをお持ちなのであればこちらの設定は不要といえると思います。こちらまで読み飛ばし下さい。
とはいえ、イニシアティブ定義を確認すると

WindowsVM、Azure arc対応サーバー、仮想マシンスケールセットに自動でAzure Monitorエージェントを入れてくれるポリシーなので、Windows関連のVMにはこれ1つで一括でインストールされることになります。こちらが楽だと感じる場合はおすすめです。


0. モニター>設定>データ収集ルールと遷移し、「作成」ボタンを押下する

1. 設定事項を記入します。

今回は「データ収集ポイント」はなしで大丈夫です。

2. リソースを設定します
「どこから」を設定します。「リソース」とは、ここでは「データの収集元」という意味です。どこからデータを持ってくるのかを設定します。

説明文にある通り、ここで設定したリソースにはAzure Monitorエージェントがインストールされます。新しく追加したリソースに対しても自動的に修復が働き、Azure Monitorエージェントのインストールが始まります。

3. 「収集と配信」を設定します
説明文通り、「何を」と「どこに」を設定します。
「データソースの追加」ボタンから追加します。

  • データソースの追加

先にも述べましたが、単に今回のようにポリシー違反を検知するためのアラートルールを作成する場合はこちらは不要です。好きなものを選択ください。

  • ターゲット

「どこに」を設定します。Log Analyticsワークスペースの作成にて作成したLog Analyticsワークスペースを設定します。

タグの設定が終了し、問題がなければDCRの設定は完了です。
Microsoft Learnで展開されている手順に従って、DCRをイニシアティブ定義と関連付け、マシンを展開させます。

4.診断設定の追加

ポリシーのアタッチ、データ送信用のエージェント(手段)の追加と設定を行ったので、リソースに対する設定を行います。送信先と送信アイテムを設定していきます。
Log Analyticsワークスペースの作成で作成したワークスペースにジャンプし、「アクティビティログ」>診断設定を開きます。

ここで、「監視」タブにも「診断設定」が存在しますが、こちらでの設定ではありません。この設定の違いはメトリックとアクティビティログの違いから生まれるものです。

Azure Monitor アクティビティ ログは、Azure リソースからのコントロール プレーン イベントのプラットフォーム ログです。 これには、リソースが変更されたときやデプロイ エラーが発生した場合などの情報が含まれます。 アクティビティ ログを使用して、監視するリソースについてこの情報を確認または監査するか、イベントが作成されたときに事前に通知されるアラートを作成します。

引用元:Azure Monitor のアクティビティ ログ | Microsoft Learn
learn.microsoft.com

Azure Monitor メトリックは、監視対象のリソースから時系列データベースに数値データを収集する Azure Monitor の機能です。 メトリックは、一定の間隔で収集される数値であり、特定の時刻におけるシステムの何らかの特性を表しています。

引用元:Azure Monitor メトリックの概要 | Microsoft Learn
learn.microsoft.com

今回はリソースの一定間隔の数値などではなく、ポリシーの違反等で発生したイベントを拾い上げます。データを拾ってくる対象はアクティビティログとなります。

「Activitylog-Azurearc」という名前で作成し。「Policy」のチェックボックスをオンにします。
宛先にLog Analyticsワークスペースの作成で作成したLog Analyticsワークスペースを設定し、データ送信の設定は完了です。

5.アラートを設定する

いよいよメール送信を行う設定を行います。アラート処理ルール、アクション処理グループ、アラートルールを設定し連結することで、メールが疎通するかどうかを確認します。

アクショングループの設定

送信先を事前に設定します。モニター>アクショングループで設定を行います

「pendingreboot」というアクショングループを設定し、メールアドレスを一つ登録しました。(メールアドレスはマスクさせていただきました。)


アラートルールの設定

蓄積されたログから該当のログを引っ張り出し、アラートとして通知する設定を作ります。
「モニター」>「アラートルール」で設定します。

マシンが今後追加されたときを踏まえ、「スコープ」はリソースグループを広く設定し、次の「条件」に移ります。「条件」では膨大なログからどんな条件のものをアラート条件とするかを設定します。

「条件」タブでは以下を設定しました。
※リソースグループ名、サブスクリプションIDが含まれていたため一部にマスクをしてあります。

クエリの種類ですが、今回はコンプライアンス非準拠となった場合に即時通知させるようにしたいので、「1件のイベント」を選択しました。
ある時間に定期的に通知させる場合は「集計されたログ」を選択します。

今回は以下のクエリを使用しました。

AzureActivity
| where CategoryValue contains "Policy"
| where Properties contains "<ポリシーの割り当てID>" 
| extend props = parse_json(Properties)
| where props.isComplianceCheck == "False"

クエリの仕組みとしては以下です。

//#1 AzureActivityテーブルを指定
AzureActivity
//「CategoryValue」フィールドに「Policy」が含まれる行を抽出
| where CategoryValue contains "Policy"
//#2「Properties」内部の列に特定のポリシー割り当てIDが含まれる行を抽出
| where Properties contains "<ポリシーの割り当てID>" 
//#3「Properties」列のJSON文字列を解析し、propsという新しい列に展開
| extend props = parse_json(Properties)
//#4「props」オブジェクト内のisComplianceCheckがFalseである行を抽出
| where props.isComplianceCheck == "False"


#1→4.診断設定で設定
#2→1.ポリシーの割り当てで設定
#4→1.ポリシーの割り当てで確認できるポリシーのコンプライアンス状況を確認し指定

アクションタブにて、アクショングループの設定にて設定したアクショングループを指定します。

詳細タブでは以下を指定しました。
「重大度」は、今回は2-警告を設定しました。

アラート処理ルールの設定

アラートが起きた場合に通知する時間や通知周期などを定義します。通知タイミングや料金事情によって変更しても問題ないです。
たとえば、今回の場合は「月~金のみの間でアラートが発生したときに通知する」としたいので、スケジュールを以下のように設定しました。

また上記で指定したアラートルールのみのアタッチとするため、スコープタブ>フィルターにてアラートルールIDを指定しました。
※サブスクリプションIDが含まれていたため一部にマスクをしてあります。

実装結果

「保留中の再起動がある Windows VM の監査」という組み込みポリシーを設定しました。
以下状態のマシンから、監査が問題なく発生し、また通知できていることを確認します。

まずはポリシーの状態を確認します。

ポリシーの監査状態とAzure Update Managerの表示状態が一致しています。
したがって、vSphereVM-03がアラート通知対象になります。

Log Analyticsワークスペースに保存されているものはGUIで確認できます。割り当てたポリシーから「アクティビティログ」を選択し、表示された内容が蓄積されています。

vSphereVM-03のアクティビティログの一部を確認します。以下は、2025/8/21(木)に記録された今ポリシーに関するログです。

Log Analyticsワークスペースで同じ条件で検索します。
Azure Policyポータル上で発行されているログと時刻、内容が一致したログが検索されました。アラート内容が問題なく記録されています。

一方、登録したメールアドレスを確認します。アラート通知は以下のようにきておりました。
※黒くマスクされている部分はリソースグループ名が記載されています。

約5~10分でアクティビティログの内容がアラートルール名とともに通知されていることがわかります。
メールの内容も以下のように、アラートルールにて決定した内容がそのまま反映されています。

このように、いくつかのサービスを連携させることでメールにてポリシー状態をアラートさせることが可能になりました。もし似たような要件で手詰まった方、やり方を模索している方がいらっしゃいましたら、あくまで自己流でありますがご参考になれば幸いです。