はじめに(前回までの流れ)
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 to
Error
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を経由させることで様々な監視運用を検討できると思います。