AzureサービスだけでIaaSをどこまで監視できるか試してみた

JP1/System Walker/Datadog/Mackerelといった監視エージェント。とても便利ですよね。

でもAzureにも監視サービスがいくつもあります。

そこで、AzureのサービスだけでIaaS(Virtual Machines)をどこまで監視できるかを試して、監視エージェントが必要なケースを纏めてみました。

# 監視したいものは何か？
はじめに対象を定義しておきます。

* 対象OS  
Windows/Linux問わないこととしますが、この記事ではWindows Serverをベースに解説しています。値は違いますが、基本的にはLinuxにも適応可能だと思って下さい。
* 監視したいもの  
    * CPU使用率やメモリ使用率等の各種パフォーマンス情報
    * イベントログ(syslog)
    * サービス(プロセス)

# 最終的な構成図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1c537201-3339-15aa-ffe8-72875c6ffbc7.png)

Azureオンリーで監視しようとした場合の私的最適構成案がこれです。
なぜこういう構成なのかと、実現するための手順を解説していきたいと思います。

# 細かく解説

## まずはここのラインから
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/19da1b68-b290-aa85-1b0d-c324525cb67b.png)
<br>

### メトリック
IaaSであれPaaSであれ、Azureではパフォーマンスと正常性を視覚的に確認できるメトリックが標準で準備されています。CPU使用率とかネットワークI/Oとかの数値データですね。
メトリックは1分間隔で取得されます。

#### ホストVMメトリック
* [メトリック]→[メトリック値]の順に選択します
* ここでは[ホスト]Percentage CPUを選択してみます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/df5ec93b-f694-d876-ba96-97b625820a93.png)
<br>

* 以下のような感じでCPU使用率が表示されました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3109a1e8-e25f-3ee1-70bd-9e376e78ded5.png)
<br>

* 過去24時間のCPU使用率が表示されていますが、最大で30日間のメトリックを確認することが可能です。

#### ゲストVMメトリック
* デフォルトだと以下の項目に対するメトリックを確認することができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9137e443-054d-4eec-492d-45476a4f9e08.png)

* なんだか少ない気がします。例えばメモリ使用率とかディスク空き容量とかを確認したい場合はどうすればよいのでしょうか
* [ホスト]と表示されていることがポイントで、仮想マシンをデフォルトで作成した直後だと、ゲストOS側からパフォーマンス情報を取得しておらず、Azureホストからのみ取得している状態です
* ゲストレベルの診断を有効にすることで、OSのパフォーマンスモニター情報を取得することができます
* ゲストOSのパフォーマンス情報まで取得するためには、[診断設定]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a367d2c0-ff60-ef43-b5c6-2e6c3e040f2f.png)
<br>

* [ゲストレベルの監視を有効にする]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2c11f53b-369c-dff3-15ba-346639924512.png)
<br>

* しばらく待つと以下のようにパフォーマンスモニターの情報を確認することができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6adb7dd0-e008-ca1e-5d3e-b591debfc056.png)
<br>

* ちなみにゲストレベルの監視は、仮想マシン作成時に設定することも可能です
* 作成時に[ゲストOSの診断]項目を、[有効]にすることでゲストOS診断を有効にした状態で仮想マシンを作成できます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1b8ce7bc-d053-fe89-a114-37f39ed67a8d.png)
<br>

#### ゲストVMメトリック確認
* 項目を見ると分かるようにWindowsのパフォーマンスモニター値がそのまま表示されています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6d0e69a9-fdd7-57b4-c237-294ee20ad012.png)
<br>

* ディスク空き容量を見てみます。以下は過去1時間のディスク空き容量のメトリックです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/750e99a1-de1a-c73d-c607-c5932209d91b.png)
<br>

* ちなみに実態はVirtual Machines拡張機能「IaaSDiagnostics」が追加されたことで、ゲストOSのパフォーマンスモニタ情報を取得できるようになりました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/db291bbe-f0f5-2d47-7034-0cd9be16c239.png)

### アラート
ここまでで細かいリソースのパフォーマンスを可視化することができました。
次は閾値を超えた場合のアラート通知についてです。

#### メトリックアラート
* アラート画面から[メトリックアラートの追加]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/15034504-587e-5ae6-a1fc-e3391bbe95e2.png)
<br>

* 監視対象メトリックと閾値、期間を設定します
* この例では、5分以上、CPU使用率が90%より大きくなった状態が続いた場合にアラートとして検知します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/882d576c-7904-34e8-b0a5-1c22a9b90c80.png)
<br>

* 次にアラートを検知した場合の通知手段を選んでいきます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/dd893be0-ab24-3661-e822-e990117e0ea2.png)
<br>

* 通知手段は以下から選択できます
    * メール
    * Webhook
    * Automation Runbook
    * Logic Apps

* Webhook/Runbook/Logic Appsが選択出来るため、通知方法はいろんあパターンがあるかなと思います
    * 例えば、Twilio APIを呼び出して架電したり、PagerDuty APIを呼び出して架電したり、Slackに通知したり
    * メトリックアラートからだとWebhookカスタムペイロード指定ができないので、Webhook単体だとSlack通知できません。Logic Appsを間にかますか、RunbookのPowershellでSlack通知を書くかのどちらかになるかと思います

#### メトリックアラート設定確認
* [アラートルール]から設定した内容を確認することができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/5364cd4a-243e-916a-b1bf-4757397aedfc.png)
<br>

* 設定したアラートを一時的に無効化することも可能です
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/533b92dd-fa76-ad44-e86a-f698bd7a64be.png)
<br>

## 次にここのライン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ed4b92c8-58ec-3ede-4d7a-2a1490d43743.png)
<br>

### Log Analyticsへイベントログ収集
ゲストレベルの診断を有効化するとパフォーマンスモニターだけでなく、イベントログもAzure Storage(Table)に収集することが可能です。
ただ、それを監視するためにはStorageから更にLog Analyticsに転送する必要があります。
長期間保管する用途でもない限りは、仮想マシンから直接Log Analyticsへ転送したほうが効率がよいです。

* ポータルからLog Analytics（OMSワークスペース）を作成します  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/21a6dd3a-5627-f2df-39fd-902565043a54.png)
<br>

* OMSワークスペースのメニューより、[仮想マシン]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/db4b45d4-3fa6-be3b-8790-260a7548589d.png)
<br>

* イベントログ収集対象の仮想マシンを選択して、[接続]ボタンを押します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a70cafef-7a37-b105-db04-8c9f912e9792.png)
<br>

* ワークスペースへの追加が完了すると、仮想マシンの拡張機能「MicrosoftMonitoringAgent」が追加されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0fef0ad7-def9-7e69-1f68-2cf6a08546e7.png)
<br>

* これだけだとまだLog Analyticsが仮想マシンを認識しただけなので、ログを収集する設定をしていきます
* OMSワークスペースのメニューより、[詳細設定]→[Data]→[Windowsイベントログ]の順に選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/cf5dc801-e4a4-a322-e951-97b6dd4e951f.png)
<br>

* SystemとApplicationイベントログを追加します
Securityイベントログは収集できません。これはSecurity & Complianceソリューションを使ってねっていうメッセージだろうか。そのうち検証してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/44c893e4-44f7-383b-de98-4f8605c177f4.png)
<br>

* OMSワークスペースのメニューより、[ログ検索]を選択します
* クエリを発行することで収集したログを確認できます
* 以下はComputer名が「win-monitor」且つタイプが「Event」のものを抽出しています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/98b575ee-158c-0466-90e4-273597af12ad.png)
<br>

* 以下のように結果が表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/42ffe4ec-6ff5-0a75-4e5d-a4455da5ca0d.png)
<br>

### Log Analyticsアラート設定
特定の条件のメッセージが出力されたときにアラート通知する設定を行います。

* アラートルールの元となるクエリを発行し、[New Alert Rule]を選択します
* ここではコンピュータ名が「win-monitor」且つタイプが「イベント」且つイベントレベルが「Error」のものを抽出しています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/cd842331-cfd4-937e-d05f-3c1ed1bd817a.png)  

<br>

* 条件を細かく決めていきます。条件欄を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e1d9a0e0-bb9f-cfe1-e134-f436fb252563.png)
<br>

* 閾値を設定します。このクエリを実行したときにヒットした数が閾値を超えた場合にアラート通知するという条件になります
* 1件でもErrorイベントを検知したらアラート通知したいので、ここでは「0より大きい場合」という条件にします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/13f4a209-abd9-b7c2-1d8e-f7d04a18e2b3.png)
<br>

* 次に評価基準を設定します。「期間」はどれくらいの範囲を対象とするか、「頻度」はクエリ発行間隔を表しています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/53f8e6f9-e713-2fc7-c204-a86becdd93ed.png)
<br>

* 今回は10分間隔でクエリを発行し、クエリ発行から10分前までのデータを対象としています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/76b75a93-6dab-5da9-2a71-db73c77be93e.png)
<br>

* ここで注意事項
頻度と期間を短くすればほぼリアルタイムで検知可能では？と思いますが、これには注意が必要です。
ソース（今回はイベントログ）からLog Analyticsへの送信頻度や間隔は指定できないので、いつデータが収集されるかが分かりません
あまり短くしすぎるとアラート検知漏れが発生する懸念があります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3a4f4843-cb79-7468-67ba-983719e6b19f.png)

* 次にアラート名と重要度を設定します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/01dfd7b3-6ee0-47d8-5536-7a7d2a8f1fa5.png)

* 最後にアラートを検知したときにどういうアクションを起こすかを定義します
* 以下のアクションを選択できます
    * メール/SMS
    * Webhook
    * ITSM
    * Automation Runbook
* メトリックアラートと違って、Log Analyticsのアラートでは、カスタムJSONペイロードを含めることが出来るため、間にLogic Appsを挟まなくてもSlack通知が可能ですね
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/cb14fa71-dda0-a6d7-a50d-59da8190f450.png)

* 設定したアラートはLog Analyticsメニューの[アラート]から確認可能です
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/284c817b-618c-9c25-5b32-89cb99214c12.png)

### Log Analyticsにメトリック値も収集する
本記事ではメトリック値はAzure Alertを使って検知していますが、分析目的でパフォーマンスモニター等のメトリック値をLog Analyticsに収集するのももちろんありだと思います。

* Log Analyticsの詳細設定より、[Data]→[Windowsパフォーマンスカウンター]→[選択したパフォーマンスカウンターを追加する]の順に選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/926bdda0-4f43-9656-d588-3ace98168bc4.png)

# 監視エージェントが必要なケースは？

## OS上のサービスやプロセスの監視
Azureの機能では監視することができません。代替案としては以下のような手法が考えられます。

* プロセスがダウンした場合、イベントログやsyslogに出力されるであろうことを前提にイベントログ(syslog)監視のみでいく
* タスクスケジューラー等で定期的に状態を確認し、異常だとイベントログに出力するように作り込む

## アラート通知に即時性を持たせたい
Log Analyticsでは検知するのに時間が掛かる可能性があるため、ログアラートを即時検知させたいようなケースでは必要になります

## クラウド毎に運用を変えたくない
マルチクラウドで運用しているケースが挙げられます。クラウドに応じて監視手法を変えることがないメリットは大きいですね

# まとめ
今回可能な限りAzureサービスのみでIaaSの監視を考えてみました。
エージェント製品が必要なケースももちろんあるので、システムの特性に合わせて選定できるようになれればと思います。