AzureMonitorの[アラート]機能を利用して、仮想マシンが作成された際にメール通知をするということを試してみました。
Azure環境の仮想マシン作成状況を把握出来たらいいなと思ったのと、不正な仮想マシン作成の検知にも活用できるかと思いますので参考にしていただけますと幸いです。
今回作成した構成
以下のような構成で設定しました。
利用するAzureリソースは[LogAnalytics]と[AzureMonitor (アラート) ]です。

メール通知が来るまでの流れとしては以下の通りです。
- 1.AzureMonitorのアラートでLogAnalyticsに対してクエリを実行し、仮想マシンの作成ログがないかを定期的に確認しに行きます。
- 2.仮想マシンのログが出ていたら、メールを送信します。
各リソースの設定
ここからは上記の構成における各リソースの設定内容や設定方法について記載していきます。
①LogAnalyticsの作成
まずLogAnalyticsをAzureCLIで作成します。
#任意のパラメータを定義
$rg_name = "Test-RG"
$location = "japaneast"
$la_name = "Test-LogAnalytics"
$retention_time = 60
#リソースグループ作成
az group create `
--name $rg_name `
--location $location
#ログアナリティクス作成
az monitor log-analytics workspace create `
--name $la_name `
--resource-group $rg_name `
--location $location `
--retention-time $retention_time
②ActivityLogをLogAnalyticsへ格納
ActivityLogを上記で作成したLogAnalyticsへ格納する設定をサブスクリプションに対して実施します。
・対象のサブスクリプションを開き、[アクティビティログ] > [アクティビティログのエクスポート]をクリックします。
![[アクティビティログのエクスポート]をクリック](https://bonjiri-blog.com/wp-content/uploads/monitor-alertvm-create-email-005.png)
・診断設定のページにて[診断設定を追加する]をクリックします。
![[診断設定を追加する]をクリック](https://bonjiri-blog.com/wp-content/uploads/monitor-alertvm-create-email-006.png)
・[診断設定の名前]を入力し、[カテゴリ]では[Administrative]のみを選択します。
また、[宛先の詳細]では[Log Analytics ワークスペースへの送信]を選択したのちに先ほど作成したLogAnalyticsを選択し、最後に[保存]をクリックします。

ActivityLogのうち[Administrative]のログのみが、指定したLogAnalyticsに格納されます。
[Administrative]には仮想マシンの作成のログが含まれますので今回はこれを選択するだけで十分となります。
③Alertの作成・設定
今回はアラートのリソースから作成するのではなく、LogAnalytics上からアラートを作成していきます。
この方法ですと実装するクエリの実行結果を確かめながら作成することができます。
・上記で作成した[LogAnalytics]のページより、[ログ]をクリックします。
![[ログ]をクリック](https://bonjiri-blog.com/wp-content/uploads/monitor-alertvm-create-email-030.png)
※[ログ]クリック後に2つほどポップアップが出てくることがありますが、無視して問題ないので、右上の×ボタンをクリックして消してください。
・クエリを入力する画面が表示されるので、その部分に以下のようにクエリを記載し、[新しいアラートルール]をクリックします。
AzureActivity
| where ActivitySubstatusValue == "Created"
| where TimeGenerated > ago(10m)
| summarize countif(OperationNameValue == "MICROSOFT.COMPUTE/VIRTUALMACHINES/WRITE")
| where countif_ > 0
![[新しいアラートルール]をクリック](https://bonjiri-blog.com/wp-content/uploads/monitor-alertvm-create-email-031-01.png)
クエリの内容については下部の「[補足]クエリの解説」に記載してありますので参考にしてください。
・「アラートルールの作成」画面が表示されるのでアラートルールを作成していきます。
最初に表示される[条件]タブのページの中で[アラートロジック]の欄のみ以下のように設定し、[アクション]タブに移動します。
- 演算子:[次の値より大きい]
- しきい値:[0]
- 評価の頻度:[5分]


・[アクショングループの作成]をクリックします。

アクショングループの作成
・[リソースグループ]、[アクショングループ名]、[表示名]を入力し、[通知]のタブをクリックします。

・[通知の種類]にて[電子メール/SMS メッセージ/プッシュ/音声]を選択すると、右側にポップアップが出てくるので[電子メール]にチェックを入れ、送信したい宛先のメールアドレスを入力します。
また、このアクションの[名前]も入力し、[確認および作成]のタブをクリックします。

・[確認および作成]の画面で確認したのちに[作成]をクリックします。

アラート作成に戻る
・アクショングループ作成後はアラートの作成画面に戻るので、[詳細]タブをクリックします。

・[詳細]では、[アラート名]を入力し、そのほかの値はそのままで[確認および作成]タブをクリックします。

・[確認および作成]画面で確認したのちの[作成]をクリックします。

これにてアラートが作成完了しました。
[補足] クエリの解説
クエリの中身について解説していきます。
AzureActivity
| where ActivitySubstatusValue == "Created"
| where TimeGenerated > ago(10m)
| summarize countif(OperationNameValue == "MICROSOFT.COMPUTE/VIRTUALMACHINES/WRITE")
| where countif_ > 0
1行目は何のログを見るかの宣言で、今回はActivityLogを検索したいので[AzureActivity]を指定します。
2行目はリソースが作成された際に検出されるログでソートをかけており、今回は仮想マシンが【作成されたとき】を検知するので[ActivitySubstatusValue]が[Created]に一致するという条件でソートします。
3行目は検索するログの期間を指定しており、今回は「10分前までのログの中で」という条件で検索をしています。
4行目は[summarize]演算子を利用して、[countif]で得られた結果を[_countif]というテーブルとして出力します。
countif内では仮想マシンに対して書き込み操作が実行されたときに検出されるログ(OperationNameValue == “MICROSOFT.COMPUTE/VIRTUALMACHINES/WRITE”)の値をカウントします。
そのため4行目では[_countif]というテーブルを作成し、その値には[countif]で得られた結果、すなわち【2,3行目でソートされた結果のうち、さらにその中から仮想マシンへの書き込み操作が実行された結果の数】が格納されます。
そして5行目で、「その値が0より大きければ値を返すし、0であれば値を返さない。」という処理をしています。

仮想マシン作成後からActivityLogが作成され、そのログがLogAnalyticsに格納されてクエリで検索できるようになるまでタイムラグがあります。
仮想マシンを実際に作成して試したところ約5分後にクエリで検索できるようになったため、余裕をもって今回はクエリの設定を10分前までのログを検知するように記載しています。
[参考] クエリ内の検索時間とアラートにおけるクエリの実行間隔を一致させない理由
先ほども記載した通り、今回のクエリ内では10分前までのログを検知するように記載していますが、アラートの設定では5分間隔でクエリを実行しており、[クエリ内の検索時間]と[クエリの実行間隔]は一致していません。
これは、「LogAnalyticsにログが反映されるまでの時間がクエリの実行間隔を跨ぐような形でログが連携されてしまう場合に、ログが検出されない可能性があることを防ぐため」です。
具体的にどういうことなのか? 図にもまとめてみましたのでこれを見たほうがわかりやすいかと思います。


実際に仮想マシンを作成してメール送信されるかを確認する
最後に実際に仮想マシンを作成して、アラートが来るかを試してみます。
今回は[Test-VirtualMachine]という名前の仮想マシンを作成しました。

仮想マシンを作成した時間はアクティビティログより、[18:56]でした。

そして、アラートの検知によるメール通知が来たのは約13分後の[19:03]でした。

アラートによる仮想マシン作成のメール通知は正常に動作していることが確認できました。
さいごに
【仮想マシンが作成されたらメール通知する】ことはできましたが、約13分後に通知が来るという結果となりました。
ログがLogAnalyticsに連携される時間や、アラートの確認頻度の5分という間隔などを加味するとこのくらいかかるのは仕方ないのかもしれません。