🚀

AzureのアラートをMicrosoft Teamsにも反映させる方法

2022/10/23に公開約8,600字

ご無沙汰しております。
Jemiyaです。

すごく投稿が久々になったと思っております。
今回はAzureからアラートをMicrosoft Teams(以下、Teams)にも反映させる方法について、説明していきたいと思います!
(MicrosoftはMSと略します)

調べてみると、MSのサイトや多くのエンジニアのブログとかにはWebhookを使用するとか書かれていることが多いですが、私はその方法を使用しなくともTeamsにアラートを飛ばすことができる方法を皆さんにお伝えしたいと思います。

まずはじめにTeamsのチームやチャネルを作成してない人は作成しましょう。

Azureを開き、「ロジックアプリ」をクリックする。

ロジックアプリに入った後、「追加」をクリックする。

「ロジックアプリの作成」という画面に切り替わったら、サブスクリプション、リソースグループを指定し、ロジックアプリ名を入力、地域(リージョン)を指定する。
ログ分析化は「はい」に設定し、Log Analytics ワークスペースを指定する。
プランは「消費」を選択し(スタンダードだとTeamsに飛ばすのが難しくなるため)、可用性ゾーンを使用することもないので今回はゾーン冗長も無効にしました。
このページでの設定が全部終わったら、「次:タグ」をクリック。

タグに名前と値を入れる場合は入力し、「次へ」をクリック。(私は入力しないでそのまま進みました)

内容を確認し、誤りがなければ、「作成」をクリック。(1分程で作成は完了します)

その後、以下の画面が表示されるので、「HTTP要求の受信時」をクリックする。

下記のJSONをコピーしてください。
これは共通アラートスキーマとロジックアプリを統合させるためのJSONです。
※共通アラートスキーマ・・・さまざまな種類のアラート全体に標準化された拡張可能な JSON スキーマで、Webhook、Runbook、およびロジック アプリを通じたプログラムを使用した活用に最適です。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/alerts/alerts-common-schema-integrations

{
        "type": "object",
        "properties": {
            "schemaId": {
                "type": "string"
            },
            "data": {
                "type": "object",
                "properties": {
                    "essentials": {
                        "type": "object",
                        "properties": {
                            "alertId": {
                                "type": "string"
                            },
                            "alertRule": {
                                "type": "string"
                            },
                            "severity": {
                                "type": "string"
                            },
                            "signalType": {
                                "type": "string"
                            },
                            "monitorCondition": {
                                "type": "string"
                            },
                            "monitoringService": {
                                "type": "string"
                            },
                            "alertTargetIDs": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "originAlertId": {
                                "type": "string"
                            },
                            "firedDateTime": {
                                "type": "string"
                            },
                            "resolvedDateTime": {
                                "type": "string"
                            },
                            "description": {
                                "type": "string"
                            },
                            "essentialsVersion": {
                                "type": "string"
                            },
                            "alertContextVersion": {
                                "type": "string"
                            }
                        }
                    },
                    "alertContext": {
                        "type": "object",
                        "properties": {}
                    }
                }
            }
        }
    }

JSONをコピーしたら、「要求本文のスキーマ」にペーストする。
ここで「application/jsonに設定されているContent-Typeヘッダーを要求に忘れずに含めてください。」という吹き出しが表示されますが、「わかりました」と「今後表示しない」のどちらをクリックしても問題ありません。

下に「新しいステップ」の表示があるので、それをクリックする。

「操作を選択してください」からアクションの「チャットまたはチャネルでメッセージを投稿する」をクリックする。
※項目が多いので、「teams」と検索かけた方が早いかもです。

サインインを求められるので、「サインイン」をクリックする。

アカウントは使用したいものを使用すれば、大丈夫です。
私はアラート通知用のアカウントを使用するため、「別のアカウントを使用する」をクリックしました。

使用するアカウントのメールアドレスを入力し、「次へ」をクリック。

パスワードを入力し、「サインイン」をクリック。

以下の項目を選択・入力する。
投稿者:ユーザー(フローボットとかもありますが、基本ユーザーになると思います)
投稿先:チャネル(グループチャットに通知する場合はグループチャットを選択する)
チームとチャネルは通知先の対象を選択する。

メッセージに下記をコピペする。
今回は発生日時、対象リソース、ステータス、重要度、説明、値を抽出しました。
これを保存すれば、あとはロジックアプリ側で自動的に処理してくれます。

<p>発生日時    :@{convertFromUtc(string(triggerBody()?['data']?['essentials']?['firedDateTime']), 'Tokyo Standard Time', 'yyyy/MM/dd HH:mm:ss')}<br>\n対象リソース  :@{triggerBody()?['data']?['essentials']?['alertTargetIDs']}<br>\nステータス   :@{triggerBody()?['data']?['essentials']?['monitorCondition']}<br>\n重要度     :@{triggerBody()?['data']?['essentials']?['severity']}<br>\n説明      :@{if(equals(triggerBody()?['data']?['essentials']?['description'], ''), '-', triggerBody()?['data']?['essentials']?['description'])}<br>\n値       :@{if(equals(triggerBody()?['data']?['essentials']?['monitoringService'], 'Platform'), first(triggerBody()?['data']?['alertContext']?['condition']?['allOf'])?['metricValue'], '-')}</p>

メッセージの下に「Add new parameter」をドロップダウンすると、「件名」が表示される。

そこに以下をコピペする。(これも自動処理されます)

@{if(equals(triggerBody()?['data']?['essentials']?['monitorCondition'], 'Fired'), '【Problem】', '【OK】')}@{triggerBody()?['data']?['essentials']?['alertRule']}

ここまでの設定が終わったら、「保存」をクリックする。

次にアクショングループにもロジックアプリを結びつける設定をします。
アクショングループを紐づいているリソースを選択する。(VMでもDBでもなんでもいいです)
※アラートルールもアクショングループも設定してない場合は、以下のURLを参照してください。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/alerts/alerts-create-new-alert-rule?tabs=metric

https://learn.microsoft.com/ja-jp/azure/azure-monitor/alerts/action-groups

アラートルールをクリックする。

設定してあるアラートルールをクリックする。(これもなんでもいいです)

「編集」をクリックする。

「アクショングループの編集」をクリックする。

対象のアクショングループのチェックボックスをクリックし、「選択」をクリックする。

対象のアクショングループをクリックする。

「アクションの種類」をドロップダウンする。

「ロジックアプリ」をクリックする。

名前を入力し、「編集」(ペンマーク)をクリックする。

サブスクリプション、リソースグループ、ロジックアプリに誤りがないことを確認し、「共通の警告スキーマを有効にします。」に「はい」の設定にする。その後、「OK」をクリックする。

「変更を保存」をクリックする。

わざとエラーを起こして通知を確認するため、400エラーを選択しました。
※400エラー:Webサーバで起きるエラーの種類の一つで、クライアントの要求に何らかの誤りや問題があり処理を完了できなかったことを示すもの。

演算子を「次の値以上」、しきい値を0にしました。

「保存」をクリックする。

その後、通知が飛ぶことが確認できたら、変更したアラートルールの設定を元に戻しましょう。

おまけに。「トリガー実行」をクリックするとエラーが生じます。

ただ、Teamsに通知させることはできているので、これは無視して構いません。

以上。

Discussion

ログインするとコメントできます