APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

LogicAppsでサーバアラートを受け取るその2

はじめに(前回までの流れ)

Power Platform推進チームの鈴木です。前回のブログでは、LogicAppsを使って、AzureMonitorによるサーバアラートを受け取る入口部分まで作りました。 今回は、受け取ったアラートを運用者やユーザーへ通知できるよう、より実践的にLogicAppsを改良してみます。

やりたいこと

  • AzureMonitorでWindowsサーバのEventログを採取する
  • Eventログを定期的に検索し、エラーログだけLogicAppsへ転送する
  • 転送したログをSharePointリストに記録する
  • 転送したログのうち、クリティカルなアラートログだけをTeamsに通知する

やってみる

以下の順番で実施します。 LogicAppsによる処理を組み込む前にSharePointやTeamsに対する下準備が必要です。

  1. 通知先となるSharePointリストやTeamsチャネルを作る
  2. LogicAppsへLogAnalyticsワークスペースを参照する権限を付与する
  3. LogicAppsへログ結果を受け取る処理を実装する
  4. LogicAppsへSharePointリストに対するログ記録処理を実装する
  5. LogicAppsへTeamsチャネルに対するログ通知処理を実装する

1.通知先となるSharePointリストやTeamsチャネルを作る

Microsoft365のホーム画面から[SharePoint]を選択します。
任意のチームサイトを選択し、中央ペインから[新規]>[リスト]を選択します。

SharePointの選択

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

リスト作成画面で[CSVから]を選択します。

リストの作成

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

リストのプレビュー

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

SharePointリスト

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

Teams通知チャネル

これで通知先となるSharePointリストやTeamsチャネルの作成が完了しました。

2.LogicAppsへLogAnalyticsワークスペースを参照する権限を付与する

前回のブログで作成した AzureMonitor から LogicApps へのアラート通知の場合は、アクセス権限設定は不要でした。
一方、今回実装する LogicApps から AzureMonitor への情報参照の場合は、アクセス権限設定が必要です。 今回は、LogicAppsのマネージドIDを使って、アクセス権限を設定します。

前回作成したLogicAppsを選択し、左メニューから[ID]を選択します。
中央ペインから[システム割り当て済み]タブを選択し、状態を[オン]にします。
設定を保存すると、LogicAppsのシステム割り当てマネージドIDが生成されます。

システム割り当てマネージド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を経由させることで様々な監視運用を検討できると思います。