
こんにちは。 やましー@データ活用クラウドエンジニア(@yamashi18041) です。
システムを安定稼働させ、重大な問題を未然に防ぐためにも監視は非常に重要です。
最近はPaaSを活用することによるサーバーレスが人気を集めています。
しかし、日本では依然として自由度の高いIaaSである仮想マシン上で自作のバッチ処理などを走らせて運用しなければならないこともあると思います。
ということで今日はAzure Log Analyticsを使ってWindowsのイベントログを収集し、Azure Monitorで監視してアラートメールを飛ばす方法を解説します。
実際、私が構築したシステムで採用しているバッチ処理のエラー監視です。
ステップバイステップでスクショ多めで、いくつか注意事項や考慮するべき設定項目について、ポイントを押さえながら説明していきたいと思います。
目次を手順ベースにしています。
監視をきっちり実装できることで問題の対処が早く行えて、リカバリーまでの時間を小さくすることができます。
結果、お客様から信頼され、「いつも、ありがとう」と最高にうれしいご褒美がもらえます。
お客様からの感謝の言葉は本当にうれしいですね。
是非監視マスターになってください!
今回の記事は次のような読者を想定しています。
- 監視について興味がある
- Azure Log Analyticsの使い方を知りたい
- Azure Monitorの使い方を知りたい
- Windowsのイベントログの出力方法を知りたい
それでは今回の具体的なアーキテクチャから説明していきます。
具体的な監視のアーキテクチャ

- 仮想マシンはWindows Server 2016 を使います。
- 仮想マシン上でPowerShell を実行します。
- PowerShellでWindowsイベントログにエラーログを出力します。
- するとエージェントがそのエラーログをLog Analyticsに転送します。
- Azure Alertには条件とアクションがセットになったルールがあります。
- Azure Alertはルールの条件でLog Analyticsを検索(監視)します。
- 検索条件に合致した時アクション(メール配信) を実行します。
Azure Monitorとは
Azure Monitorは様々な統計情報やログを収集、分析してそれに対する包括的なソリューションを提供するサービスです。
今回はこの中でも「Log Analytics」と「Alerts」を使用してみたいと思います。
Azure Log Analyticsとは

Log Analyticsについてざっくり説明しておきます。
Azure Log AnalyticsはAzure Monitorのなかの一つの機能として位置づけられています。
Log Analyticsとはログやメトリックを蓄積し、それを検索し、可視化することができるサービスです。
ログにはWindowのイベントログや、LinuxのSysLog、テキストログ等様々なログを蓄積できます。
また、サーバー内で作られたログではなく、ポータルから操作したときの履歴であるアクティビティログも蓄積することができます 。
メトリックとはサーバのCPU使用率、メモリ使用率などのサーバー内の計測できる指標値のことを言いますが、このメトリックを蓄積することができます。
これらの機能を使うためには「Log Analyticsワークスペース」というリソースを作りそこにサーバーを接続することでログが蓄積され始めます。
Azure Alertsとは

Azure Alerts (アラート) もAzure Monitorのなかの一つの機能として位置づけられています。
Azure Alertsは、様々なリソースから生成されるログやメトリックなどの情報を監視します。
そして条件に合致した情報を見つけると、アクション(今回はメール送信)を実行します。
Azure Alertsは「アラートルール」と「アクショングループ」の二つで構成されます。
アラートルール

監視の単位はルールと呼ばれ、以下の3つで構成されます。
- 「リソース」
監視の対象のリソースが - 「条件」
どうなったときに - 「アクション」
何をするか
監視の条件に指定可能なリソースから生成される情報は以下に記載してある通り5種類に分類されます。
- メトリックの値 (CPU使用率やメモリ使用率)
- ログの検索クエリ (Log Analytics) ★今回はこれを使う
- アクティビティ ログのイベント (Azure アクティビティログ)
- 基になっている Azure プラットフォームの正常性 (Azure Service Health)
- Web サイトの可用性のテスト (Application Insights)
ただし、リソースから生成される情報はリソースごとにあったりなかったりするので、監視できる情報は事前に調べておくことをお勧めします。
アクションには次に説明するアクショングループをリンクすることで監視の条件に合致した場合にそのアクションを実行することができます。
アクショングループ

アラートルールのアクションに複数のアクショングループをリンクさせることで条件に合致したときにそのアクションを実行させることができます。
また、アクショングループを一つ作っておくことで複数のアラートルールからリンクすることができます。
アクショングループに指定できるアクションは結構いろいろとあります。
- 電子メール ★今回はこれを実行する
- SMS
- Azureアプリのプッシュ通知
- 音声(TEL)
- AzureFunction(小規模なコード(関数)実行)
- ロジックアプリ(アプリ、データ、システム、サービス連携)
- Webhook(POSTリクエスト)
- ITSM(IT Service Management Connector連携)
- Automation Runbook(PowerShell等のスクリプト実行)
それでは実際に構築していきたいと思います。
Log Analyticsワークスペースを作成する
まずはLog Analytics ワークスペースを作成していきます。

左のペインから「すべてのサービス」「モニター」「Log Analytics ワークスペース」の順に選択します。

Log Analyticsの管理画面が開いたら「+ 追加」を選択します。

ワークスペースの作成画面では「新規作成」を選択します。
「Log Analyticsワークスペース」に、今回「demo-log-analytics-ws01」としてみました。
「サブスクリプション」と「リソースグループ」は普段お使いのものを選んでください。
「場所」こちらは2019年現在日本の場合は「東日本」しか選べません。西日本は選べません。
「価格レベル」は2018年?に改定されたあとに作成する場合は「従量課金制(1GBあたり(2018))」しか選ぶことができません。
入力が完了したら「OK」を選択します。

「更新」ボタンを押すことで作ったリソースが表示されます。
作ったリソースを選択して、「demo-log-analytics-ws01」の管理画面に遷移します。
Log Analyticsに仮想マシンと接続する
ワークスペースを作成後は仮想マシンと接続します。
仮想マシンを接続することで、仮想マシンの中にLog Analyticsのエージェントがインストールされ、Log Analyticsワークスペースへいろいろなログを送信してくれるようになります。

作ったLog Analyticsのリソースdemo-log-analytics-ws01のペインにある「ワークスペースのデータソース」の「仮想マシン」を選択します。
そうすると右側に仮想マシンの一覧が表示されます。
この時はLog Analytics接続の状況は接続されていませんになっていますので、接続していきます。
仮想マシンを選択すると接続確認の画面に遷移します。

接続を選択すると接続が始まります。
接続が完了すると状態にが「このワークスペース」になります。
また、この時Log Analyticsエージェントがインストールされたも確認してみたいと思います。

「Virtual Machine」を選択して仮想マシンの管理画面を開きます。
Log Analyticsワークスペースに接続した仮想マシン「ymstech-vm01」を選択します。

「拡張機能」を選択します。

「MicrosoftMonitoringAgent」の状態が「Provisioning succeeded」になっていてインストールが成功したことが分かります。
どんな情報を収集するかLog Analyticsに設定する
ワークスペースを作成し、仮想マシンを接続しただけだと仮想マシンからログは送られてきません。
どんなログやメトリックを収集するかをLog Analyticsワークスペースに設定することで初めて仮想マシンからログが送られてきます。
ちなみに、この段階だと死活監視用の「Heart Beat」だけが仮想マシンから1分おきに送信されてきている状態です。

では、収集するログの設定を行っていきましょう。
収取するログを設定するために、作成したLog Analyticsワークスペース「demo-log-analytics-ws01」の管理画面に行きます。
左のペインの設定項目にある「詳細設定」を選択します。
すると、詳細設定の画面に遷移します。

詳細設定の画面では左から「Data」「Windowsイベントログ」を選択します。
今回は 「次のイベントログからイベントを収取」に「demo-script」とします。この項目については後程詳しく説明します。
その後「+」をクリックすると

ログが下に追加され「エラー( Error )」「警告( Warning )」「情報( Information )」について設定ができるようになります。
今回はすべてチェックしておくことにします。
「情報」をチェック入れるとログの種類によってはかなりの量を収集することなるので、事前に必要なログの種類を見極めておくことが大事です。

収集するログの追加が終わったら「Save」をします。これは忘れがちなので必ずSaveしましょう。

これでどんなログを収集するかの設定が完了です。今回はログ名が「demo-script」という名前のログを収集することにしました。
ここで、「次のイベント ログからイベントを収集」に設定するイベントログについて詳しく説明したいと思います。
収集するイベントログについて

Log Analyticsの「次のイベント ログからイベントを収集 」に指定するログの名前とは、上の図のイベントビューアで見えるログの名前のことを指します。
このログの名前は左側の青い四角で囲んだ部分に表示されるものであれば収集が可能です。
なので、「Application」や「システム」のWindowsログを収集することもできます。
しかし、 Windowsログを収集すると非常に多くのログを収集することになります。
さらにLog Analyticsワークスペースに仮想マシンを接続すればするほどそのログの量は増えていきます。
Log Analyticsの料金体系からしても不要にログを収集してしまうと費用に跳ね返ってくるのでそれは避けたいですよね。
そこで、今回は自作のスクリプト専用に「demo-script」を作成し、収集するようにしました。
Windowsイベントログへ出力するスクリプトを作成する
イベントログへの書き込みは今回パワーシェルから実行します。
イベントログを出力するためのサンプルスクリプトがこちらです。
仮想マシンにログインして、このスクリプトをPowershellから実行してみます。
#Powershellのサンプルコード
# ログの名前 これがLogAnalyticsで収集設定したログの名前
$LogName = "demo-script"
# イベントソース生成(スクリプトファイル名など)
$EventSource = "TestScript01"
# イベントソースが存在するか確認(管理者としてでPowershell実行必要)
if(-not [System.Diagnostics.EventLog]::SourceExists($EventSource)) {
# イベントソースが存在しないので登録
New-EventLog -LogName $LogName -Source $EventSource
}
# ログの内容
$errormsg = "これはログ出力サンプルです。"
# イベントログへログの書き込み
Write-EventLog `
-Message $errormsg `
-LogName $LogName `
-Source $EventSource `
-EventID 1001 `
-EntryType Error `
-Category 2
イベントログへ出力がされました。表示されない場合は「最新の状態に更新」ボタンを押してみてください。

イベントログの各項目に対応するパワーシェルのコマンドレットの引数です。
これらの項目をLogAnalyticsでは検索をすることができます。
※キーワードは検索できないですが、それ以外は検索可能です。
次に、LogAnalyticsのワークスペースにログが転送されているか確認します。
LogAnalyticsで収集したログを確認する
送られてて来たログ確認してみます。

Log Analyticsの管理画面から、「ログ」を選択します。
クエリ作成画面に遷移します。

LogManagementを展開します。

LogManagement を展開すると項目が並んでいるので「Event」をダブルクリックします。
右側にクエリとして反映されるので、「実行」ボタンを押すと下に検索結果が表示されます。
LogAnalyticsで検索条件用のクエリを作成する
ここからはログを検索するためのクエリを作成していきます。
クエリは作成して保存することでAzure Alertsの条件として設定することができるようになります。
Log Analyticsで使用可能なクエリはkusto (クスト) (kql)と呼ばれます。詳しい言語の使用方法はマニュアルを参照してください。
今回は以下の検索条件で作りたいと思います。
- ログ名 :demo-script
- コンピュータ名:ymstech-vm01
- イベントレベル:Error

一度検索したいログを表示させ、「v」で詳細を開きます。
「…」を選択し「=」を選択するとクエリ画面に反映されます。
これを必要な条件分実施していきます。出来たら実行して問題がないか確認します。

作った、クエリを保存します。
Azure Alertsで検索条件をとして採用するために「名前」を付けます。
「Query」はそのまま変更はしません。
「カテゴリ」は作ったクエリをカテゴリで分けて管理できますが、あまり重要ではないので、適当なものを付けておきましょう。
「保存」を押します。
Azure Alertsのアクショングループを作成する
ここからはAzure Alertsの作成をしていきます。もう一息です!
まずはメールを送信するアクショングループを作成します。

Log Analyticsの「警告」を選択し、「アクションの管理」を選択します。


「アクショングループの追加」を選択します。
「アクショングループ名」には任意の名前を付けます。
「短い名前」にはアクショングループ名を識別できる、短くした名前を付けます。あまり使いどころが分からないので適当でOKです。メールやSMSに付与されどのアクショングループで実行されたメールなのかが分かります。
「サブスクリプション」「リソースグループ」はいつものでOKです。
「アクション」の項目に実行させる具体的なアクションタイプを選択していきます。
今回はメールを送信するので「電子メール/SMS/プッシュ/音声」を選択します。

電子メールにチェックを入れて、送信先のアドレスを設定します。
「共通の警告スキーマを有効にします。」今回は「はい」を選択しました。
これは、もともとアラートは各機能ごとにばらばらに実装されていたため、メールの本文フォーマットが統一されていませんでした。
それがAzure Monitorに統合されたことにより、メールの本文フォーマットが統一させることができるようになったようです。
OKを押して次に進みます。

アクションが登録されたので「OK」を押してアクショングループ作成完了です。
Azure Alertsのルール作成する
次に、アラートのルールを作成していきます。

ワークスペースの管理画面で、「警告」を選択し「+新しいアラートルール」を選択します。するとルールの作成画面に遷移します。

条件を設定します。「追加」を選択します。シグナルロジックの構成に遷移します。

「LogAnalyticsで検索条件用のクエリを作成する」で作成したシグナル名「demo-script-ErrorOnymstech-vm01」を選択します。

すると、詳細な条件を設定する画面に遷移します。
ここではクエリの検索結果が表示されされるので条件を作成するときに参考にしながら設定を進めることができます。下へスクロールして設定をしていきます。

図の設定は5分間隔でチェックし過去5分間にエラーログ1コでも見つけるとアクションを実行するということになります。
「基準」には「結果の数」を指定します。受信したログの数を条件にするという意味です。
「演算子」には「次の値より大きい」を指定します。
「しきい値」には「0」を指定します。
「期間」には「5」を指定します。チェック時点の過去5分間が検索範囲となります。
「頻度」には「5」を指定します。5分ごとにチェックするということになります。
「完了」を押して条件を設定完了です。

次にアクショングループをリンクします。「アクショングループの選択」を選択します。

アクショングループをチェックして、「選択」を押して完了させます。

「アラートルール名」これはかなり大事な項目です。メールの件名として採用されます。また、一度作成してしまうと、変更ができません。
「説明」はメールの本文の一部に表示されます。
「重要度」は0~4の5段階が設定されます。メールの件名と本文に記載されます。
「ルール作成時に有効にする」は「はい」で直ちに監視体制になります。
「アラートを表示しない」にチェックを入れると、一度メールを送信してから次のメール送信までの抑止時間を指定することができます。今回はチェックはしません。
「アラートルールの作成」を押し遂に監視開始です。有効になるまでに最大で10分くらい時間がかかるようです。
アラートさせてみる
Windowsイベントログへ出力するスクリプトを作成する で作成したスクリプトを実行してみます。
無事メールを受信しました。



まとめ

手順をまとめると
- Log Analyticsワークスペースを作成する
- Log Analyticsに仮想マシンと接続する
- どんな情報を収集するかLog Analyticsに設定する
- Windowsイベントログへ出力するスクリプトを作成する
- LogAnalyticsで収集したログを確認する
- LogAnalyticsで検索条件用のクエリを作成する
- Azure Alertsのアクショングループを作成する
- Azure Alertsのルール作成する
システムを安定稼働させるために欠かせない監視ですが、Azure Monitorには様々な監視ソリューションがあります。
重大な問題はしっかりとした監視を行うことで未然に防ぐことができます。
これら様々な監視ソリューションをうまく使いこなして監視マスターになっていきましょう。
最後まで読んでいただきありがとうございました。
以上、やましー@データ活用クラウドエンジニア(@yamashi18041)でした。