Edited at

Azure Log Analyticsの検索に応じてMicrosoft Teamsにメッセージを送る

More than 1 year has passed since last update.


概要

Azure Log Analyticsは様々なログを収集することができます。特定の条件が成立した時にメールで通知を行ったり、Azure AutomationのRunbookを実行したり、任意のWebhookを呼び出したりなど様々な事が実行できます。何かアクションが必要になった時に何を使って通知を実現するかには様々なツールや手法がありますが、昨今改めて注目を集めているコミュニケーションツールとしてチャットがあります。Microsoftも新しいプラットフォームとしてOffice 365にMicrosoft Teamsを追加しています。運用の中心にMicrosoft Teamsを据える動きも出はじめてきています。

この記事ではAzure Log Analyticsで何かアクションの必要なログが検知された場合にそれをMicrosoft Teamsに通知し、チャットベースで運用を回すための連携方法をstep by stepで紹介します。


イメージ図

image.png


OMSワークスペース作成

まず、OMSのワークスペースを作成します。

Azure管理ポータルにアクセスし、左上のメニューより「新規」をクリックします。

image.png

「Monitoring + Management」より「ログ分析(OMS)」を選択します。

image.png

OMSワークスペースの新規作成に必要な項目を入力し、「OK」をクリックします。

Microsoft Teamsとの連携テストは、価格レベルは「Free」で実施可能です。

image.png

デプロイが実行されますので、作成完了までしばらく待ちます。

image.png

デプロイが完了するとその旨の通知がなされます。

image.png

今作成したリソースグループをクリックします。

image.png

作成したワークスペースをクリックします。

image.png

概要が表示されます。

image.png


ログ収集設定

ここからOMSにてログを収集していきます。OMSでは様々なログを柔軟に収集できます。仮想マシンにエージェントを入れてイベントログやパフォーマンスログ、syslog等を収集しても良いですし、Office 365等のログを収集することもできます。

OMSではどのような種類のログに関しても柔軟に検索設定が行えるため対象のログはなんでも構いません。このstep by stepでは、Azureの活動ログを作成したワークスペースに収集するように構成します。

これはAzureのポータル上で実施できます。

Log Analyticsより「Azureの活動ログ」をクリックします。

image.png

ログを収集したいサブスクリプションをクリックします。

image.png

接続をクリックします。

image.png

接続が正常になされたことを通知で確認します。

image.png

Azure管理ポータル側での設定は完了しましたので、OMSポータルにアクセスします。

なお、筆者の環境ではOMSのポータルにはChromeの日本語版ではアクセスできない状況が長く続いています。OMSポータルへのアクセスに問題がある場合にはChrome日本語版以外のブラウザを利用してください。

image.png

image.png


ログ検索

まず、Azureの活動ログがOMSワークスペースに収集され、検索が行えることを確認しましょう。

「ログ検索」をクリックします。

image.png

検索クエリに「*」と入力し、全てのレコードを検索します。

image.png

正常にログが収集され、そのログが検索可能となっていることがわかります。

もしも、ログ収集設定直後でまだ検索ができない場合にはしばらく時間をおいてから再実行してみてください。

image.png

ここから、Teamsと連携したいログの種類を絞っていきます。いきなり複雑な検索クエリを手で書いてももちろん良いのですが、ここではGUI操作でイベントを絞っていってみましょう。

まず、TypeとしてAzure Activityでフィルタを行います。Azure Activityにチェックを付け「適用」をクリックします。

image.png

検索クエリが変化し、Azure Activityのみが表示されるようになります。

image.png

どのような操作に対応してどのようなログが出力されるのかをいくつか試しながら見てもらうと良い勉強になるとおもいます。

これからAzure上でなにか特定の操作が行われた時に、Teamsにそれを通知するように構成していこうと思います。どのような操作であってもかまわないのですが、このstep by stepではリソースグループが「作成」された時にそれを通知するように構成していこうとおもいます。

まずは、リソースグループを作成した時にどのようなログが記録されるのかを確認します。

リソースグループを作成してみます。

image.png

image.png

作成動作をして、しばらくしてからOMSワークスペースで検索を行います。その結果によってリソースグループを作成した際生成されるログが確認できます。

筆者の環境では以下の2レコードが記録されました。

image.png


2017/05/16 22:32:27.000 | AzureActivity

...

OperationName:Update resource group

...

Levelc:Informational

...

ActivityStatus:Succeeded

...

Caller:MEbisuda@jbs.com

...

Category:Administrative

...

TimeGenerated:2017/05/16 22:32:27.000

...

Resource:rgwritetest

...

ActivitySubstatus:Created (HTTP Status Code: 201)

...

ResourceGroup:rgwritetest

...

SubscriptionId:e8d1a84b-e542-404f-95df-721abe86fa1c

...

CorrelationId:ae969eb5-0b79-4c38-9755-07a658173b11

...

CallerIpAddress:218.33.247.57

...

HTTPRequest:{ "clientRequestId": "aac90a31-df9f-4133-98d8-1f72ff073036", "clientIpAddress": "218.33.247.57", "method": "PUT" }

...

Properties:{ "statusCode": "Created", "serviceRequestId": null, "responseBody": "{\"id\":\"/subscriptions/e8d1a84b-e542-404f-95df-721abe86fa1c/resourceGroups/rgwritetest\",\"name\":\"rgwritetest\",\"location\":\"japaneast\",\"properties\":{\"provisioningState\":\"Succeeded\"}}" }

...

EventSubmissionTimestamp:2017/05/16 22:32:40.000

...

Authorization:{ "action": "Microsoft.Resources/subscriptions/resourcegroups/write", "scope": "/subscriptions/e8d1a84b-e542-404f-95df-721abe86fa1c/resourcegroups/rgwritetest" }

...

ResourceId:/subscriptions/e8d1a84b-e542-404f-95df-721abe86fa1c/resourcegroups/rgwritetest

...

OperationId:ae969eb5-0b79-4c38-9755-07a658173b11

...

ResourceProvider:Microsoft Resources

...

SourceSystem:Azure


 


2017/05/16 22:32:27.000 | AzureActivity

...

OperationName:Update resource group

...

Level:Informational

...

ActivityStatus:Started

...

Caller:MEbisuda@jbs.com

...

Category:Administrative

...

TimeGenerated:2017/05/16 22:32:27.000

...

Resource:rgwritetest

...

ResourceGroup:rgwritetest

...

SubscriptionId:e8d1a84b-e542-404f-95df-721abe86fa1c

...

CorrelationId:ae969eb5-0b79-4c38-9755-07a658173b11

...

CallerIpAddress:218.33.247.57

...

HTTPRequest:{ "clientRequestId": "aac90a31-df9f-4133-98d8-1f72ff073036", "clientIpAddress": "218.33.247.57", "method": "PUT" }

...

Properties:{ "requestbody": "{\"name\":\"rgwritetest\",\"location\":\"japaneast\"}" }

...

EventSubmissionTimestamp:2017/05/16 22:32:40.000

...

Authorization:{ "action": "Microsoft.Resources/subscriptions/resourcegroups/write", "scope": "/subscriptions/e8d1a84b-e542-404f-95df-721abe86fa1c/resourcegroups/rgwritetest" }

...

ResourceId:/subscriptions/e8d1a84b-e542-404f-95df-721abe86fa1c/resourcegroups/rgwritetest

...

OperationId:ae969eb5-0b79-4c38-9755-07a658173b11

...

ResourceProvider:Microsoft Resources

...

SourceSystem:Azure


この結果からリソースグループ生成時には以下のログが生成されていることがわかります。


OPERATIONNAME : Update resource group

ActivityStatus : Succeeded


それぞれを検索条件に加えます。

Update resource groupにチェックを入れて適用をクリックします。

image.png

Succeededにチェックを入れて適用をクリックします。

image.png

これでできあがった以下の検索クエリを使ってアラート設定を行っていきます。

* (Type=AzureActivity) (OperationName="Update resource group") (ActivityStatus=Succeeded)

image.png


アラート設定

アラートをクリックします。

image.png

アラートルールの追加画面となります。

image.png

まず、「全般」の項目から入力していきましょう。

アラートの名前や重大度等は自由に入力して下さい。ここでは以下の用に入力します。

名前:リソースグループ生成

重要度:情報

検索クエリはすでに入力されていますので、このまま利用します。

時間枠は、検索クエリによって検索するログの範囲です。今回はAzureの活動ログを対象にしていますが、どのような種類のログであっても、それがOMSに取り込まれるまでのタイムラグを考慮して設定する必要があります。ここでは30分に設定します。

image.png

次に「スケジュール」を設定していきます。

「このアラートを確認する頻度」は自由に設定してもらって構いませんが、ここでは30分に一度に設定します。30分に1回、過去30分間分のログを検索し、対象があれば通知するイメージです。

「アラートを生成する基準」としては「結果の数」に「次の値より大きい」として「0」を指定し、1つでも検索がヒットすればアラートが発動するように設定します。

「アラートを表示しない」のチェックは30分に1回30分の範囲を検索する構成としているので、今回はチェックを付けません。目的や、確認する頻度および時間枠に合わせて設定して下さい。

image.png

次に「アクション」を設定してきます。

「電子メールの通知」は今回の主目的ではありませんので「いいえ」に設定します。

「Webhook」は「はい」に設定します。

image.png

ここまででOMS側の設定は大部分が完了し、あとはTeams側でWebhookを準備し、それを指定する形となります。

Teams側の設定に移りましょう。


Microsoft TeamsでWebhookの設定

Microsoft Teamsクライアントを用いてOMSからメッセージを受け取るグループおよびチャンネルを設定していきます。

まず任意のグループに新規にOMSからのメッセージを受け取るためのチャンネルを作成します。

image.png

チャンネル名および説明を記述します。

image.png

image.png

コネクタを設定します。

image.png

Incoming Webhookを追加します。

image.png

image.png

名前を入力して作成をクリックします。

image.png

生成されたWebhookのURLをコピーします。この値はOMS上の設定で利用します。

その後、完了をクリックします。

image.png

image.png


OMSアラートでのWebhookの設定

先程作成したURLをOMSのアラートルールの追加画面にてWebhookに入力します。

image.png

次に「カスタムJSONペイロードを含める」をクリックします。

image.png

まずテストとして、固定のテキストメッセージを送信してみます。

以下のようにJSONを記述します。単純にテキストとして「test」と送信するのみです。


{

"text" : "test"

}


そして、「webhookのテスト」をクリックします。

Teamsの該当チャンネルにメッセージが送信されたことが確認できます。

image.png

Titleを指定することもできます。

ここでは以下のように「Resource Groupが作成されました」というタイトルにしてみましょう。


{

"title" : "Resource Groupが作成されました",

"text" : "test"

}


そして、「webhookのテスト」をクリックします。

image.png

Teamsにメッセージがタイトル付きで投稿されたことが確認できます。

image.png

次はテキストをリンクしたテキストにしてみましょう。


{

"title" : "Resource Groupが作成されました",

"text" : "[test](http://www.microsoft.com/)"

}


そして、「webhookのテスト」をクリックします。

image.png

Teams側でリンクされたテキストまで確認できます。

image.png

さらに、OMSではカスタムJSONペイロード内に変数を埋め込むことができます。

今回はアラートルールの名前と、検索結果へのリンクを使ってみたいと思います。

アラートルール名は「#alertrulename」検索結果へのリンクは「#linktosearchresults」と記述すればそこが実際の値に変換されます。

実際のカスタムJSONペイロードとしては以下のようになります。


{

"title":"#alertrulename",

"text":"[検索結果](#linktosearchresults)"

}


image.png

#linktosearchresultsを使う場合にはwebhookのテストが正常に動作しませんので、実際に保存して動作を確認します。

「保存」をクリックします。

これでアラートルールが作成されました。

image.png

作成したアラートルールは設定で確認できます。

image.png

image.png

正常に動作していることを確認するために、Azure管理ポータルでリソースグループを新規に作成します。

image.png

しばらくすると、Teamsにメッセージが投稿されます。

image.png

検索結果をクリックすると、OMSの検索画面にて詳細を確認することができます。

image.png

簡単ですが、これでOMSワークスペースの作成、Azure活動ログの収集、目的のログの検索、アラートによるTeamsへの通知までを実装することができました。

非常に簡単に連携可能なことがお分かりいただけましたでしょうか。

OMSの検索クエリも非常に柔軟ですし、Teamsとの連携もWebhookにより柔軟に行なえます。OMSで何を収集して、何を検索するのか、Teamsでどのようにグループおよびチャンネルを作成し、何を情報として流すのか…非常に自由度が高く、アイデア次第で様々な使い方ができると思います。

皆さんも是非試してみてください!