はじめに(前回までの流れ)
Power Platform推進チームの鈴木です。前回のブログでは、LogicAppsを使って、AzureMonitorによるサーバアラートを受け取る入口部分まで作りました。 今回は、受け取ったアラートを運用者やユーザーへ通知できるよう、より実践的にLogicAppsを改良してみます。
やりたいこと
- AzureMonitorでWindowsサーバのEventログを採取する
- Eventログを定期的に検索し、エラーログだけLogicAppsへ転送する
- 転送したログをSharePointリストに記録する
- 転送したログのうち、クリティカルなアラートログだけをTeamsに通知する
やってみる
以下の順番で実施します。
LogicAppsによる処理を組み込む前にSharePointやTeamsに対する下準備が必要です。
- 通知先となるSharePointリストやTeamsチャネルを作る
- LogicAppsへLogAnalyticsワークスペースを参照する権限を付与する
- LogicAppsへログ結果を受け取る処理を実装する
- LogicAppsへSharePointリストに対するログ記録処理を実装する
- LogicAppsへTeamsチャネルに対するログ通知処理を実装する
1.通知先となるSharePointリストやTeamsチャネルを作る
Microsoft365のホーム画面から[SharePoint]を選択します。
任意のチームサイトを選択し、中央ペインから[新規]>[リスト]を選択します。


リストは、手動作成だけでなく、ExcelやCSVから生成することが可能です。
今回は事前に用意したアラートログ結果のCSVファイルを読み込ませることでアラートログ台帳を作ります。
リスト作成画面で[CSVから]を選択します。

ファイルアップロード画面が表示されるので、事前に用意したサンプルCSVを選択します。サンプルCSVの列や値は、LogAnalyticsワークスペースの[Event]テーブルと同様のフォーマットで用意しましょう。
ファイルをアップロードするとヘッダーと値のプレビュー画面が表示されますので、内容を確認し、リストを作成してください。

リスト作成が完了するとSharePointサイトで以下のようなリストが表示されます。

次にTeamsの通知チャネルを用意します。
通知チャネルに特別な設定は不要です。任意のチャネルを使用してください。

これで通知先となるSharePointリストやTeamsチャネルの作成が完了しました。
2.LogicAppsへLogAnalyticsワークスペースを参照する権限を付与する
前回のブログで作成した AzureMonitor から LogicApps へのアラート通知の場合は、アクセス権限設定は不要でした。
一方、今回実装する LogicApps から AzureMonitor への情報参照の場合は、アクセス権限設定が必要です。
今回は、LogicAppsのマネージドIDを使って、アクセス権限を設定します。
前回作成したLogicAppsを選択し、左メニューから[ID]を選択します。
中央ペインから[システム割り当て済み]タブを選択し、状態を[オン]にします。
設定を保存すると、LogicAppsのシステム割り当てマネージドIDが生成されます。

次に生成したマネージドIDに対して、アクセス許可を割り当てます。
[Azureロールの割り当て]をクリックし、[ロールの割り当ての追加]から以下のロール割り当てを行ってください。
| 項目 | 設定する値 |
|---|---|
| スコープ | リソースグループ |
| サブスクリプション | [リソースが所属するサブスクリプション] |
| リソースグループ | [LogAnalyticsワークスペースが所属するリソースグループ] |
| 役割 | 閲覧者 |
これでLogicAppsからアラートログを格納したLogAnalyticsワークスペースを参照できるようになりました。
3.LogicAppsへログ結果を受け取る処理を実装する
それでは、いよいよLogicAppsにログ結果を受け取る処理を実装していきます。 処理のセクションは大きく3つに分かれるので、セクション単位に説明します。
3-1.LogAnalyticsワークスペースからログ結果を受け取る
HTTP受信トリガーで受信したデータからログ結果を受け取るために必要な「受信セクション」を作ります。

アクションとパラメーターは以下のとおりです。
- アクションコネクタ:Control(For each)
| パラメーター項目 | 設定する値 |
|---|---|
| パラメーター | @{triggerBody()?['data']?['alertContext']?['condition']?['allOf']} |
- アクションコネクタ:HTTP
※認証に関する設定は、詳細パラメーターから設定してください。
| パラメーター項目 | 設定する値 |
|---|---|
| URL | @{item()?['linkToSearchResultsAPI']} |
| Method | GET |
| 認証の種類 | マネージドID |
| マネージドID | システム割り当てマネージドID |
| Audience | https://api.loganalytics.io |
3-2.取得したデータからログ結果のみを抽出する
前段の受信セクションで取得したデータには、ログ結果以外のHTTP情報も含まれます。 このままでは、SharePointリストやTeamsチャネルへ通知するための判定処理が煩雑となるため、ログ結果のみを変数に格納します。

アクションとパラメーターは以下のとおりです。
- アクションコネクタ:Data Operations(Parse JSON)
| パラメーター項目 | 設定する値 |
|---|---|
| Content | @{body('HTTP')} |
| スキーマ | [サンプルのペイロードを使用してスキーマを生成] |
スキーマは、LogicAppsを実行し、実行履歴から実際のHTTPボディ部分を張り付けると簡易に生成できると思います。 今回使用したスキーマは以下のとおりです。
{
"items": {
"properties": {
"tables": {
"items": {
"properties": {
"columns": {
"items": {
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string"
}
},
"required": [
"name",
"type"
],
"type": "object"
},
"type": "array"
},
"name": {
"type": "string"
},
"rows": {
"items": {
"type": "array"
},
"type": "array"
}
},
"required": [
"name",
"columns",
"rows"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"tables"
],
"type": "object"
},
"type": "array"
}
- アクションコネクタ:Variables(Initialize variable)
| パラメーター項目 | 設定する値 |
|---|---|
| Name | OutputCSV |
| Type | Array |
- アクションコネクタ:Variables(Set variable)
| パラメーター項目 | 設定する値 |
|---|---|
| Name | OutputCSV |
| Value | @{outputs('Parse_JSON')['body'][0]['tables'][0]['rows']} |
配列変数にログ結果データのみを格納しました。
3-3.通知分岐処理の実装
ログ結果を配列変数に格納できたので、この変数を使ってSharePointリストとTeamsチャネルに通知処理を実装します。

アクションとパラメーターは以下のとおりです。
- アクションコネクタ:Control(For each)
| パラメーター項目 | 設定する値 |
|---|---|
| パラメーター | @{variables('OutputCSV')} |
For eachアクションを定義したら+アイコンから並列分岐フローを設定します。
こうすることで、SharePointリストとTeamsチャネルへの通知処理を並列処理できるようにします。

並列分岐を定義したら、片方にSharePointリストのアクションを追加します。
- アクションコネクタ:SharePoint(項目の作成)
| パラメーター項目 | 設定する値 |
|---|---|
| サイトのアドレス | [SharePointリストを作成したSharePointサイト] |
| リスト名 | [作成したSharePointリスト] |
| リスト名 | [作成したSharePointリスト] |
| ログ結果列①(ソース) | @{items('For_each_1')[1]} |
| ログ結果列②(記録時間) | @{addHours(items('For_each_1')[0],-9)} |
| ログ結果列③(イベントログ) | @{items('For_each_1')[2]} |
| ログ結果列④(コンピュータ) | @{items('For_each_1')[3]} |
| ログ結果列⑤(イベントレベル) | @{items('For_each_1')[4]} |
ログ結果列①~⑤の設定値は、取得したログ結果に含まれる列数に応じて定義してください。
記録時間にaddHours関数を使っているのは、LogicAppsとSharePointリストでタイムゾーンの差異が生じているためであり、意図的に9時間のマイナス補正をしています。
今度は、Teamsチャネルの通知を定義します。
Teamsチャネルの通知は、少し通知条件に手を加えます。
通知処理を設定する前に以下の条件分岐を加えます。
- アクションコネクタ:Control(Condition)
- パラメーター:
items('For_each_1')[4]is equal toError

items('For_each_1')[4]はイベントレベルを格納している列となります。
この条件分岐では、イベントレベル=Errorのログのみ、true判定します。
true判定のセクションには、以下のアクションを追加してください。
- アクションコネクタ:Microsoft Teams(チャットまたはチャネルでメッセージを投稿する)
| パラメーター項目 | 設定する値 |
|---|---|
| 投稿者 | フローボット |
| 投稿先 | Channel |
| Team | [通知先のチーム] |
| Channel | [通知先のチャネル] |
Message部分は以下のようにしました。
Windowsサーバで警告イベントを検知しました。
日時:@{items('For_each_1')[0]}
ソース:@{items('For_each_1')[1]}
イベントログ:@{items('For_each_1')[2]}
マシン:@{items('For_each_1')[3]}
イベントレベル:@{items('For_each_1')[4]}

動かしてみる
LogicAppsに通知処理をすべて実装しましたので、さっそく動かしてみましょう。
処理を動かすためには、ログ発生元となるWindowsでErrorやWarningに相当するイベントログを発生させる必要があります。
強制的に発生させる場合は、EventCreateコマンドを使って、ダミーのイベントログを出力すると良いでしょう。
eventcreate | Microsoft Learn
イベントログの出力からしばらく待って、LogicAppsの実行履歴を確認すると、ワークフローが実行されているはずです。

SharePointリストを確認してみましょう。
リストにログ結果が記録されています。

次にTeamsチャネルを確認してみます。 Errorログのみが下図のように通知されていれば成功です。

まとめ
今回は、AzureMonitorのアラートルールで受け取った情報を基に、SharePointリストやTeamsチャネルログ結果を通知できるような加工方法を検証しました。 アラートルールの標準機能であるメールやSMS通知に比べると、実装にひと手間必要ですが、LogicAppsを経由させることで様々な監視運用を検討できると思います。