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

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

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

##イメージ図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/55178153-cbaf-4c2d-09c6-ee33bc047750.png)


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

[Azure管理ポータル](https://portal.azure.com/)にアクセスし、左上のメニューより「新規」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/f111e1fb-6ee0-9710-85c7-4e4632a7f5b9.png)

「Monitoring + Management」より「ログ分析(OMS)」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/adbe218a-b3d0-35fe-80b2-73ad0e275d72.png)

OMSワークスペースの新規作成に必要な項目を入力し、「OK」をクリックします。
Microsoft Teamsとの連携テストは、価格レベルは「Free」で実施可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/f6c15886-88d4-9bf5-20ad-f4548be668a2.png)

デプロイが実行されますので、作成完了までしばらく待ちます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/b92bc0b1-bc00-40aa-11c9-4bb7fa5f0b19.png)

デプロイが完了するとその旨の通知がなされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/adf048b0-d339-2bb8-a519-271566b216a1.png)

今作成したリソースグループをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/11e8d9e6-98bd-4e43-862b-a7781e980e6c.png)

作成したワークスペースをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/d5820668-6aee-6472-0da6-895ef5cff337.png)


概要が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/4a24e8ec-743e-ceb0-4281-54f55942fc52.png)

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

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

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

Log Analyticsより「Azureの活動ログ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/7d0fd841-8aec-b1e8-2404-f9ae262cc38a.png)

ログを収集したいサブスクリプションをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/d0f9e9ce-309c-3eaf-a5af-a414a72f3176.png)

接続をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/c024fce2-09d4-58a8-9166-652de15e47d8.png)

接続が正常になされたことを通知で確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/75352e4c-ed5b-eb13-8395-8f9ab35c91cc.png)

Azure管理ポータル側での設定は完了しましたので、OMSポータルにアクセスします。
なお、筆者の環境ではOMSのポータルにはChromeの日本語版ではアクセスできない状況が長く続いています。OMSポータルへのアクセスに問題がある場合にはChrome日本語版以外のブラウザを利用してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/e727fae0-219d-7d78-91dc-3eb54f5d0b03.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/cc8201b1-e1ed-5725-1505-0876ddb21916.png)

#ログ検索
まず、Azureの活動ログがOMSワークスペースに収集され、検索が行えることを確認しましょう。
「ログ検索」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/18aa12c4-7320-8db5-1cb7-25c74eaa3a40.png)

検索クエリに「*」と入力し、全てのレコードを検索します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/940da0dd-10b4-6396-4552-f260a8ac3d77.png)

正常にログが収集され、そのログが検索可能となっていることがわかります。
もしも、ログ収集設定直後でまだ検索ができない場合にはしばらく時間をおいてから再実行してみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/cedbd54f-03ee-2591-af17-5bac30adefa0.png)

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

まず、TypeとしてAzure Activityでフィルタを行います。Azure Activityにチェックを付け「適用」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/f906e2b1-473f-306f-ad68-a18841b4b523.png)

検索クエリが変化し、Azure Activityのみが表示されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/9f131fd5-0402-6fb7-5d61-47350c5e68ff.png)

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

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

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

リソースグループを作成してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/73cc5162-af71-7fb9-e200-a9996479e0f2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/ee4750e9-2911-37f1-98f3-4d3f1078272f.png)

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

筆者の環境では以下の2レコードが記録されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/6f2d46c1-04de-4b7d-75b7-f8b84726f4c0.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](https://qiita-image-store.s3.amazonaws.com/0/186993/64e4e706-c97a-7705-1a64-74602d04754e.png)

Succeededにチェックを入れて適用をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/0948f221-2d55-457b-a2e6-523a9ade78d4.png)

これでできあがった以下の検索クエリを使ってアラート設定を行っていきます。
`* (Type=AzureActivity) (OperationName="Update resource group") (ActivityStatus=Succeeded)`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/e5d22605-7cd4-18b5-9bd7-4ccaea3bbc64.png)

#アラート設定
アラートをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/abeeffe6-3872-0c7d-8c0d-24dbfa7dd181.png)

アラートルールの追加画面となります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/c42e3dd2-fd64-67c9-273f-eca65e4d20c3.png)

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

アラートの名前や重大度等は自由に入力して下さい。ここでは以下の用に入力します。
名前：リソースグループ生成
重要度：情報

検索クエリはすでに入力されていますので、このまま利用します。
時間枠は、検索クエリによって検索するログの範囲です。今回はAzureの活動ログを対象にしていますが、どのような種類のログであっても、それがOMSに取り込まれるまでのタイムラグを考慮して設定する必要があります。ここでは30分に設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/02d9a27a-c90f-81cd-67f6-23339ed5503c.png)

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

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

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

「アラートを表示しない」のチェックは30分に1回30分の範囲を検索する構成としているので、今回はチェックを付けません。目的や、確認する頻度および時間枠に合わせて設定して下さい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/a8eac328-c60d-d540-ce43-933ea52148c4.png)

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

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

「Webhook」は「はい」に設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/418db8fc-bb92-3a59-0a69-4cd362d08610.png)

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

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

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

まず任意のグループに新規にOMSからのメッセージを受け取るためのチャンネルを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/aaff66ab-ada9-5175-2db5-9da1671d4326.png)

チャンネル名および説明を記述します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/c7882690-ad28-250b-66ae-8ad4d7513891.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/0836e470-f27f-e72f-37f4-e061b5966dd5.png)

コネクタを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/99d28591-45ec-5411-870d-35a514926f95.png)

Incoming Webhookを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/96efeabd-052e-6e8a-a8a3-44af1daeb123.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/7f30810a-9e90-0665-26b7-4b6406df4daa.png)

名前を入力して作成をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/51c40669-dc01-5039-64ab-ce7cfac12cbf.png)

生成されたWebhookのURLをコピーします。この値はOMS上の設定で利用します。
その後、完了をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/172e5124-4f17-399a-bbae-08e7450c48c3.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/35e76415-0791-91bf-9898-25ff8ff519db.png)

#OMSアラートでのWebhookの設定
先程作成したURLをOMSのアラートルールの追加画面にてWebhookに入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/7ff1b268-4f47-09fe-0741-29842b68fd3d.png)

次に「カスタムJSONペイロードを含める」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/dce56eb6-1b61-0588-256e-8cee878cbb64.png)

まずテストとして、固定のテキストメッセージを送信してみます。
以下のようにJSONを記述します。単純にテキストとして「test」と送信するのみです。

>{
"text" : "test"
}

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

Teamsの該当チャンネルにメッセージが送信されたことが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/bce2f794-b012-4078-36f5-5f78be5c2be3.png)

Titleを指定することもできます。
ここでは以下のように「Resource Groupが作成されました」というタイトルにしてみましょう。
>{
"title" : "Resource Groupが作成されました",
"text" : "test"
}

そして、「webhookのテスト」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/a97f6082-61d1-3040-6532-49aff3f1470e.png)

Teamsにメッセージがタイトル付きで投稿されたことが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/7e748a2c-5571-8067-61d4-288e624fb78f.png)

次はテキストをリンクしたテキストにしてみましょう。
>{
"title" : "Resource Groupが作成されました",
"text" : "\[test](http://www.microsoft.com/)"
}

そして、「webhookのテスト」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/ea4931f6-8081-dbe4-d13e-5a01f52d275a.png)

Teams側でリンクされたテキストまで確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/94a78a98-dcaa-76a2-5c15-6442e307b65d.png)

さらに、OMSではカスタムJSONペイロード内に変数を埋め込むことができます。
今回はアラートルールの名前と、検索結果へのリンクを使ってみたいと思います。
アラートルール名は「#alertrulename」検索結果へのリンクは「#linktosearchresults」と記述すればそこが実際の値に変換されます。

実際のカスタムJSONペイロードとしては以下のようになります。
>{
"title":"#alertrulename",
"text":"\[検索結果](#linktosearchresults)"
}

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/a1412b21-72eb-8c24-1081-887c98d3020c.png)

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

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

これでアラートルールが作成されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/7def716d-e045-5797-e20a-693b265d9088.png)

作成したアラートルールは設定で確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/6587d9f1-c309-0bad-dad4-176d24321ee7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/a55075aa-3d27-4df2-cc99-17911e2aa61d.png)

正常に動作していることを確認するために、Azure管理ポータルでリソースグループを新規に作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/f61abf49-bc88-ede0-62b9-780ff9387e9a.png)

しばらくすると、Teamsにメッセージが投稿されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/3d5b0316-b41f-b3df-4375-4f13a909eb04.png)

検索結果をクリックすると、OMSの検索画面にて詳細を確認することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186993/6e1b1923-49cd-ca45-95f8-ba17e5b15de7.png)

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

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

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

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