-
はじめに
この記事に興味を持っていただきありがとうございます。この記事は、Azure のアラートを Teams へ投稿する方法について書かれています。
これから自前でなんとかしようと書いていきます。自前でやらない場合、 CloudBot というサービスが使えそうです(詳細わかりません。すみません)。
なぜ Teams へ投稿するのか
従来、このようなアラート通知にはメールが使われてきました。メールのままでもよいのに、なぜ Teams を使うのか、私見を書いてみます。
- アラートを複数人で閲覧できる → なにかのアラートに対して、スムースに Teams 上で会話できます。
- アラートに対する処理を実装できる → 投稿にフォームを付けて、別サイトへ誘導できます。
- 他サービスとの連携が容易 → Power Automate を用いれば、他のサービスと連携させるのも容易です。
- メーラーより使い勝手がいいかも → これは主観的な理由ですね。
いかがでしょう?やってみたくなりましたか?
Teams へ投稿するいくつかの方法
Teams へメッセージを投稿する方法はいくつかあります。
方法 Pros/Cons 電子メール 一番お手軽。長いメールは省略されて表示される。eml ファイルがたまる。 WebHook コネクタ お手軽。特定のフォーマットにしないと投稿できない。 Graph API 自由度が高い。認証が必要。 それぞれ詳しく見てみます。
電子メール
メールを送ることで投稿します。メールの宛先は、Teams チャネルにあらかじめ設定されているメールコネクタです。
Azure Monitor のアクショングループには、指定されたメールアドレスにメール送信する機能がありますので、チャネルのメールアドレスをセットするだけで Teams へ投稿されます。
投稿内容は下記のように表示されます。
長いメールは省略されてしまいます。
WebHook コネクタ
WebHook へ HTTP POST することで投稿します。WebHook は、チャネルに追加すると使用できるようになります。
Graph API
Graph API を叩くことで投稿します。投稿するだけであれば、WebHook コネクタと変わりません。Graph API を使用する利点は、新規のメッセージを投稿するだけではなく、既存メッセージへ返信できることです。例えば、問題発生時には新規メッセージ、問題解決時には返信メッセージとすることで、見た目にわかりやすくなります。
メッセージの形式
電子メールの場合、投稿するメッセージの形式を選ぶことはできません。WebHook コネクタと Graph API では、2 つの形式から選ぶことができます。
形式 説明 メッセージカード 文字の修飾、画像の読み込み、フォームの埋め込み等ができます。 アダプティブカード メッセージカード形式を置き換える形式です。より表現力が豊かになっています。[1] [メッセージカード形式のサンプル]
[アダプティブカード形式のサンプル]
アラート発生時に処理を動かす
Azure Monitor Alert には、アクショングループというものがあり、アラート発生時に関連付けられたアクションを実行できます。
実行できるアクションには以下のものがあります。
- Azure Automation Runbook
- Azure Functions
- Event Hubs
- ITSM (ServiceNow か BMC Helix)
- Azure Logic Apps
- WebHook
- Secure WebHook
これらのうち、Teams への投稿によさそうなものは Azure Functions と、Azure Logic Apps です。WebHook を使用できれば簡単だったのですが、残念ながらポストされる内容が上記のメッセージ形式とは異なるため、Teams に反映されません。
Functions と Logic Apps のどちらがよいのか、いくつかの項目で比べてみます。
比較項目 Functions Logic Apps 料金(従量課金プラン) 実行 100 万回、使用量 400,000 GB 秒[2] まで無料 実行 4000 回まで無料 作り方 好みのプログラミング言語で作成してデプロイする Azure ポータル上でビジュアルデザイナを使う 向き不向き なんでもできる 簡易的な処理のみ。複雑なことは難しい 移植性 ○ × 保守性 ○ △ Functions がよさそうですが、まずは最初の一歩として Logic Apps を使ってみます。
Azure Monitor のアラート形式
早速作り始める前に、Azure Monitor が送信してくれるアラートについて調べます。アラートには、後から登場した共通アラートスキーマ形式と、クラシカルな非共通アラートスキーマ形式の 2 つがあります。
非共通アラートスキーマは、歴史的な経緯により、アラート種別(メトリックやリソースヘルス等)毎に、それぞれ異なる内容となっています。取り扱うときはアラート種別に合わせて処理を分ける必要があります。
共通アラートスキーマは、非共通アラートスキーマの問題を解決し、全ての種別で共通となる部分+個別部分という内容になっています。
両方でサポートしているアラート種別と、片方でしかサポートしていないアラート種別があります。
共通アラートスキーマ
共通アラートスキーマがサポートしているアラート種別は、ドキュメント によると以下の 9 つです。
- Platform
- Application Insights
- Log Alerts V2
- Activity Log
- Administrative
- Policy
- Security
- Service Health
- Resource Health
- Prometheus
共通アラートスキーマの構造
全アラート種別で共通となる内容は、エッセンシャルというフィールドに格納されています。
アラート種別毎に異なる内容は、アラートコンテキストというフィールドに格納されています。
非共通アラートスキーマ
共通アラートスキーマがサポートしているるアラート種別は、ドキュメントによると以下の 8 つです。
- Metric
- Static threshold
- Dynamic threshold
- Log Alerts V1
- Metric
- Number of results
- Activity Log
- Administrative
- Service Health
- Resource Health
- Cost Budget
Azure 料金を見たいときは、こちらを使うことになりそうです。それ以外は共通アラートスキーマがよさそうです。
Azure Logic Apps を使用して、Teams へアラートを投稿する
必要な情報が揃いましたので、共通アラートスキーマのエッセンシャル部分を Teams へ投稿する Logic Apps を作成します。構成は以下のようになります。シンプルですね。
Azure Logic Apps を作成する
手ずから作るとだいぶ長くなりますのでテンプレートを用意しています。
Logic Apps のテンプレートを開いてください。
[Deploy to Azure]をクリックしてください。Azure ポータルへ遷移します。
以下のパラメータを入力して、Logic Apps を作成します。
パラメータ 説明 Workflows_name Logic Apps の名前 Teams_webhook_url POST 先の WebHook URL(Teams チャネルへ追加した WebHook コネクタ) アクショングループと Logic Apps を紐付ける
アクショングループに、作成した Logic Apps を紐付けます。特に難しいところはなく、画面から操作するだけです。[共通アラートスキーマを有効にします。] は、「はい」を選んでください。
テストする
[アクショングループのテスト] をクリックすると、アラート種別を選択してテストできます。いろいろなアラートで試してみてください。
共通アラートスキーマでサポートされないものは、空のメッセージになるはずです。
できあがったもの
Teams に以下のようなメッセージが投稿されるようになりました。
共通アラートスキーマのエッセンシャル部分を投稿する Logic Apps を作成しました。もっと様々な情報を投稿したい場合は、アラートコンテキスト部分を参照します。Logic Apps でもがんばればできるのですが、前述の通りメンテナンス性が悪いので、Azure Functions で実装します。
Azure Functions を使用して、Teams へアラートを投稿する
Azure Functions は、HTTP トリガとして作成します。一から作成すると長くなりますので、サンプル実装 を用意しています。 これを Azure へデプロイしていきます。デプロイする前に、いくつか準備が必要です。
事前準備
やることは 3 つです。
- Azure AD アプリケーションを登録
- シークレットを発行
- Azure AD アプリケーションにロールを割り当て
既にこのあたりのことをご存知の方は、飛ばして Azure Functions App を作成するまで進んでください。
Azure AD アプリケーションを登録する
プログラムの中で、Azure リソース名を取得するために Azure Graph API へアクセスしています。API へのアクセス権を与えるため、アプリケーションを登録します。
-
Azure ポータルから、Azure Active Directory を開き、アプリの登録 へ進みます。
-
[新規登録]をクリックします。
- 名前を入力し、[登録]をクリックします。名前以外はデフォルトのままで構いません。
- アプリケーションが登録されました。アプリケーション(クライアント)ID と、ディレクトリ(テナント)ID を控えておきます。
シークレットを発行する
続いて、アプリケーションのシークレットを発行します。
-
[証明書とシークレット]をクリックします。
-
[新しいクライアントシークレット]をクリックします。
- 説明を入力し、[追加]をクリックします。
- シークレットが作成されますので、値を控えておきます。もし値を控えるのを忘れたり、なくしてしまったときは、また新たにシークレットを追加してください。
ロールを付与する
続いて、アプリケーションにサブスクリプションに対するロールを付与し、リソース名を取得できるようにします。
- Azure ポータルからサブスクリプションを開き、[アクセス制御(IAM)] をクリックします。
- [ロールの割り当ての追加] をクリックします。
- [閲覧者] ロールを選択し、[次へ] をクリックします。
- [メンバーを選択する] をクリックし、作成したアプリケーションを選択します。
- [レビューと割り当て] をクリックし、ロールを付与します。
Azure Functions App を作成する
Azure Functions App のテンプレート を開いて、[Deploy to Azure]をクリックしてください。Azure ポータルへ遷移します。
以下のパラメータを入力して、Function App を作成します。
パラメータ 説明 TEAMD_WEBHOOK_URL Teams に設定した WebHook コネクタの URL AZURE_CLIENT_ID 上記で控えたアプリケーション(クライアント)ID AZURE_CLIENT_SECRET 上記で控えたシークレット AZURE_TENANT_ID 上記で控えたディレクトリ(テナント)ID 上記以外のパラメータは、お好みに応じて変更してください。
アクショングループと Azure Functions App を紐付ける
Logic App と同様に、アクショングループに作成した Azure Functions App を紐付けます。
できあがったもの
Teams に以下のようなメッセージが投稿されるようになりました。
参考リンク
-
Teams チャネルへメッセージを投稿する方法
-
メッセージ形式
Footnotes
-
ただし、ドキュメントにはTeams コネクタではメッセージカード形式を使うようにと書かれています。実際には使えているので、ドキュメントはなにか別のものを指しているのかもしれません。 ↩
-
使用量の 「GB 秒」という単位は、メモリ使用量 × 実行時間を表します。例えば、メモリ使用量 128MB(最低単位)、実行時間 1 秒とすると、8 回実行で 1 GB 秒になります。 ↩