【初心者向け】簡単！AzureVMを死活監視してみた

## 背景
仮想マシンの状態を監視したい、何かあったらアラートを飛ばしたい。
Log AnalyticsやらAzure Monitorやら使えばいいんだろうけど、クエリとかよく分からないし、難しい。

けれど、仮想マシンが落ちてしまっているかどうかの死活監視くらいなら簡単にできます！
ということで難しいクエリとかは書けないけど死活監視はしたい私みたいな人用の手順をまとめます。
<br>
## 前提
死活監視の手法としてインフラ系の人はping監視を思いつくかもしれませんが、AzureVMにおいてはping監視というものが（私が調べた範囲では）ありません。
もし、できるよ！ということなら是非、教えてください。というか是非記事にしてください。私が助かります。

まぁ一旦ping監視が無いとして、代わりにAzureではHeartbeatを使います。HeartbeatはVMが正常に動いてるよ～という定期的な信号です。これを監視して、信号が途絶えたならばVMが落ちてる！とアラートを鳴らしてもらうようにします。
<br>
また、下記のブログにも記載がありますが今回行うHeartbeatによる死活監視はあくまでゲスト（仮想マシン自体）の死活監視を行うものなのでAzure自体やAzureのログ収集・アラートに関しての障害時には正常に作動しない場合がありますのでご注意ください。

[Azure VM における死活監視の考え方 - 2. 各レイヤーの監視方法](https://jpazmon-integ.github.io/blog/LogAnalytics/MonitorVM02/#2-%E5%90%84%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%81%AE%E7%9B%A3%E8%A6%96%E6%96%B9%E6%B3%95)
<br>
## 構成
全体像としては下図のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/27ab0d29-9d37-ce24-fc45-67550243e234.png)

VM上のデータ（今回はHeartbeatとします）は、まずLog Analyticsワークスペースというデータのプール的な場所に収集します。
VMとワークスペースは一対一でも良いのですが、あまりワークスペースを乱立させても管理が大変なので、VMの用途ごとやセグメントごとなどある程度のくくりで1つのワークスペースのようにまとめると良いと思います。
このVMとワークスペースを繋げる（データを収集させる）のがデータ収集ルール（DCR）です。

ワークスペースにデータを送っただけではただふよふよ溜まっているだけなので、アラートルールを作成します。このアラートルールこそがワークスペース内の特定のデータを監視し、特定の条件のもとでアラートを出します。
アラートの実際の通知方法や通知先はアラートルールとは別にアクショングループというもので設定します。アラートルールを作るときにどのアクショングループにするか選択する（紐づけする）ので、アラートルールでアラートが発生したときは紐づけられたアクショングループに設定されている連絡先へ所定の方法で通知が飛びます。

アラートルールとアクショングループは一対一でも良いですし、例えば同じVMでもHeartbeatとCPU使用率で別々にアラートルールを設定しているときに同じVMなので通知先は同じにしたい場合など複数対一の対応も可能です。この辺良くできてますね。
<br>
## 設定手順
### ワークスペースの作成
※既にワークスペースがあって、それを使う場合はスキップしてください。

１）Azure portalにログインし、上部の検索バーからLog Analyticsワークスペースと検索してサービスを開きます。
２）作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/8213ce5f-7bf6-f010-d6de-9422a7f9f130.png)

３）サブスクリプション・リソースグループ・名前・リージョンを適当なものを選択・記入します。リージョンはこの後で作成するデータ収集ルール（DCR）と同じにする必要がありますので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/eeb19ea6-417d-b79d-90cc-d0387da396ba.png)

４）タグを任意につけて、作成をクリックし完了です。
<br>
### データ収集ルール（DCR）の作成
１）Azure portalに入り、左上のハンバーガーボタンから「監視」をクリックします。
２）モニターのメニューの「設定」-「データ収集ルール」-「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/be3cc223-ad2d-5d3d-7b90-5b22a4fe8a51.png)

３）ルール名・サブスクリプション・リソースグループ・リージョン・プラットフォームを適当なものを選択・記入します。
※リージョンは使いたいワークスペースと同じである必要があります。
※データ収集エンドポイントはそのまま＜なし＞で大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/25be1ff9-9ddd-84df-1c4c-c26a3839f314.png)

４）「リソースの追加」をクリックします。範囲の選択が出るので、目的のVMを検索・選択して適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/108e07b5-f42d-cc5c-caa3-22a1e9b077f8.png)

５）「データソースの追加」をクリックします。データソースについてはパフォーマンスカウンターを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/aa827cc3-a404-5e07-c8db-754052c5d60f.png)

６）ターゲットタブの方で「ターゲットの追加」をクリックし、ターゲットの種類に「Azure Monitor Logs」を、宛先の詳細に使いたいワークスペースを選択します。その後画面下部の「データソースの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/c51aa9a6-167c-6fb0-d94b-a2261a86cfc1.png)

７）タグを任意につけて、作成をクリックし完了です。
<br>
### アラートの作成
１）Azure portalに入り、左上のハンバーガーボタンから「監視」をクリックします。
２）モニターのメニューの「アラート」-「作成」-「アラートルール」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/e6c4628f-c747-a39e-b744-82221c64d0a3.png)

３）リソースの選択で先ほどデータ収集ルールで設定した、データの集まってるワークスペースを選択します。
**※ここで選択するのはワークスペースの方で、VMではないので注意してください。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/60eaaa77-1de7-588d-4097-99d5db1162e6.png)

４）条件タブに移動し、シグナル名に「カスタムログ検索」を選択します。

※当該ワークスペースに一つのVMしか接続していないならHeartbratを選択しても良いのですが、今回は複数のVMをワークスペースに接続する想定でクエリによって、ワークスペース内の特定のVMのデータのみを監視するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/94180569-18da-322c-b605-bf3c2be10778.png)

５）クエリを記入する画面が出てくるので、下記のクエリを記入し「実行」をクリックします。ワークスペースにデータが収集されており、正しく抽出できていれば下部に結果が表示されます。実行ができたら画面下部の「アラートの編集を続行する」をクリックします。

```:特定VMのHeartbeatを監視するクエリ
Heartbeat 
| where Computer =="<コンピュータ名>" 
| where TimeGenerated > ago(5m)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/f170f464-ccb3-0241-a916-137936981e03.png)

６）「測定」の部分は下記の通りそのままでOKです。「アラートロジック」は演算子を「次の値より小さい」、しきい値を「1」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/0130a6e6-ad56-0fd4-fcea-9f2123bb0be6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/30ab428d-8279-d340-4e2b-1bdffe1896bf.png)

これによってクエリと併せて、

ワークスペース内の特定のVMのHeartbeatに関して
5分毎に
それまでの5分間の
値（カウント）を見て
1未満（＝0）だったらアラートを飛ばす
＝5分間ダウンしていたらアラートを飛ばす

といった設定になります。もちろんこの辺りは要件に合わせて変えてください。ただ時間間隔などの設定を変えるとアラートルールの料金も変わってくるのでご注意ください。
<br>
７）アクショングループの設定をします。既にあるアクショングループを設定する場合は「アクショングループの選択」をクリックしますが、今回は新たに作る前提で「アクショングループの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/deb0d6e2-f325-6a4a-cc8e-1df4055a3abb.png)

８）基本項目は適当なものを選択・記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/18311af1-fbbb-9a77-dd72-ae5f2ff07297.png)

９）通知タイプは
・Azure Resource Manager のロールへのメール
・電子メール/SMSメッセージ/ブッシュ/音声
の好きな方を選択します。当該VMの管理担当者とかに通知したいなら下の方が合ってそうですね。ここも要件に合わせて設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/4a4c61f9-8097-99c1-0bfa-fe9c49537272.png)

１０）次のアクションタブについては省略可能なのでスルーします。タグを任意につけて、作成をクリックします。
すると、アラートルールの作成画面に自動で戻り、今作ったアクショングループが設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/d5d7b850-29d7-efb9-d304-5eb7fb812c2a.png)

１１）詳細タブでは重大度、アラートルー名に適当なものを選択・記入します。
アラートルールの説明のところはAzure portal上で補足説明として確認できるもの…と思いきやアラートメール中にも含まれるので簡単な日本語の説明とか入れておくと分かりやすくなると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/eedc0c75-5d7c-9ad3-ab49-34a66f87abdb.png)

１２）タグを任意につけて、作成をクリックし完了です。
<br><br>
これで設定したVMが落ちたときにアラートが飛ぶようになります！
上記の設定だと、アラートメールが飛び始めたら、VMが落ち続けている限り5分ごとにアラートメールが飛んできます。煩わしいといえば煩わしいですが、VMが復活するとアラートメールも止むのでAzure portalを見られない人にも分かりやすいですね。

<br><br>
## 補足
### VMからデータ収集ができない - NSGの設定
DCRを設定したのにデータが収集できない…そんな時はネットワーク設定の方でブロックされているかもしれません。
うまく収集できないときは当該VMのセグメントのネットワークセキュリティグループ（NSG）に次の設定を入れてみるといける…かもしれません。

送信セキュリティ規則に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/919087d8-7d00-2bb8-7276-286dfadeab3b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/af8eeb78-5051-050c-cb0e-40f3bf3fdbda.png)
を設定追加します。
<br>

### クエリに書くコンピュータ名について
このクエリ
```:特定VMのHeartbeatを監視するクエリ
Heartbeat 
| where Computer =="<コンピュータ名>" 
| where TimeGenerated > ago(5m)
```
に書くコンピュータ名はドメイン参加している場合にはドメイン名も書きます。逆にドメイン参加していなければドメイン名は要りません。

つまりこんな感じです。
例えばVMの名前が「SampleVM」として、
```:ドメイン参加していない
Heartbeat 
| where Computer =="SampleVM" 
| where TimeG
```
```:ドメイン「contoso.local」に参加している
Heartbeat 
| where Computer =="SampleVM.contoso.local" 
| where TimeG
```

このコンピュータ名について、分からない、不安という場合には実際にワークスペースに収集されているHeaartbeatテーブルの中身を見ることでComputer列にて上記に記載すべきコンピュータ名が確認できます。

#### ワークスペースのテーブルの見方
１）Azure portalに入り、左上のハンバーガーボタンから「監視」をクリックします。
２）モニターのメニューの「ログ」をクリックします。
３）「スコープの選択」で見たいワークスペースを検索・選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/61f2b231-7af2-dbb0-b23a-021759ec6fe0.png)

４）下記のクエリを記入し実行します。

```:ワークスペース内のHeartbeatを表示するクエリ
Heartbeat
| where TimeGenerated > ago(1h)
| take 10
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/d9a5edb7-fd29-e8d2-963b-65e14b75c229.png)

収集されたHeartbeatが結果として表示されますので、Computer列に注目します。アラートルールに書くクエリも結局このデータの内computer列でクエリに書いたのと同じデータを見ている訳なのでこれをコピペすれば間違いないでしょう。

<br>

## おわり
AzureMonitorは難しいですね。でもやってみると死活監視だけならそこまで難しくありませんでした。
ITに疎い私には大助かりです。

自分用の備忘録も兼ねていますが私と同じようにAzureに挑戦している人の参考になれば幸いです。