AzureのNoCodeツールを活用して、Slackへのサービス正常性アラート通知を構築

#はじめに

`Azure Logic Apps` と `Azure Monitor` をうまく活用すると、コードを1行も書かずにSlackへのサービス正常性アラートを構築することが可能です。
サービス正常性アラートはFaaSで構築するのがトレンドですが、Azureはツールが充実しており、NoCodeツールを組み合わせるだけで構築可能です。
本エントリでは構築手順を3ステップで纏めています。

# 方針

こちらの公式リファレンスを参考に、

https://docs.microsoft.com/ja-jp/azure/azure-monitor/alerts/action-groups-logic-app#create-a-service-health-alert

・サービス正常性アラート(Service Health Alert)でAzureリソースのヘルスチェックを行う
・アラートを検知した場合、`Logic Apps` 経由でSlackへ通知する

の方針で構築していきます。

ざっくりですが、下記イメージです。
![構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/2c393442-b08e-6da0-4984-6e20bb570a91.jpeg)


`Logic Apps` を経由するには一つ理由があります。
サービス正常性アラートをそのままSlackへ通知すると、下記の状態となり非常に読みづらいです。
そのため、`Logic Apps` でアラート確認に必要な情報に絞り込んでからSlackへ通知します。

![未加工のAlert.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/aaeeacf6-aa85-2cfb-6ffe-7a9b5687b281.jpeg)


# 構築

下記3ステップで構築していきます。

・`Logic Apps`構築
・サービス正常性アラートを作成
・アラートへ`Logic Apps`定義を組み込む

## 1. Logic Apps 構築

https://docs.microsoft.com/ja-jp/azure/azure-monitor/alerts/action-groups-logic-app#create-a-service-health-alert

の手順通り実施。
※2021年7月20日時点の記述にて

手順 7 以降は `Microsoft Teams` への連携手順なのでスキップし、下記手順を実行ください。

ロジックアプリデザイナー上で変更が必要なのは
・JSONの解析
・メッセージの投稿
の2箇所です。

![ロジックアプリデザイナー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/bac854f6-e682-a342-9652-610744c5ed21.jpeg)

### JSONの解析を編集

まず、`JSONの解析` にて、サービス正常性アラートのJSON加工設定を追加します。

```
{
    "properties": {
        "data": {
            "properties": {
                "context": {
                    "properties": {
                        "condition": {
                            "properties": {
                                "allOf": {
                                    "items": {
                                        "properties": {
                                            "dimensions": {
                                                "type": "array"
                                            },
                                            "metricName": {
                                                "type": "string"
                                            },
                                            "metricNamespace": {
                                                "type": "string"
                                            },
                                            "metricValue": {
                                                "type": "integer"
                                            },
                                            "operator": {
                                                "type": "string"
                                            },
                                            "threshold": {
                                                "type": "string"
                                            },
                                            "timeAggregation": {
                                                "type": "string"
                                            },
                                            "webTestName": {}
                                        },
                                        "required": [
                                            "metricName",
                                            "metricNamespace",
                                            "operator",
                                            "threshold",
                                            "timeAggregation",
                                            "dimensions",
                                            "metricValue",
                                            "webTestName"
                                        ],
                                        "type": "object"
                                    },
                                    "type": "array"
                                },
                                "windowSize": {
                                    "type": "string"
                                }
                            },
                            "type": "object"
                        },
                        "conditionType": {
                            "type": "string"
                        },
                        "description": {
                            "type": "string"
                        },
                        "id": {
                            "type": "string"
                        },
                        "name": {
                            "type": "string"
                        },
                        "portalLink": {
                            "type": "string"
                        },
                        "resourceGroupName": {
                            "type": "string"
                        },
                        "resourceId": {
                            "type": "string"
                        },
                        "resourceName": {
                            "type": "string"
                        },
                        "resourceType": {
                            "type": "string"
                        },
                        "severity": {
                            "type": "string"
                        },
                        "subscriptionId": {
                            "type": "string"
                        },
                        "timestamp": {
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "properties": {},
                "status": {
                    "type": "string"
                },
                "version": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        "schemaId": {
            "type": "string"
        }
    },
    "type": "object"
}
```

### メッセージの投稿を追加・編集

`Logic Apps`上でSlackへのメッセージ通知定義を作成します。


下記内容で、`Logic Apps`からSlackへのメッセージ通知設定を構築してください。

![メッセージの投稿.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/0bf5af01-2ef0-e704-e9b9-0d63f441c214.jpeg)

![Slackへのメッセージ通知設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/110161a9-7880-c1e0-b31e-5ddce79443b2.jpeg)


初回の連携のみ、`Logic Apps`とSlackの連携設定が必要です。
ダイアログの手順に従って連携を行ってください。
正常に連携できるとSlackBotより下記通知が届きます。
![SlackとLogicAppsの連携.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/59677e45-a0de-25a0-3c5a-19961d172439.png)

## 2. サービス正常性アラートを作成

下記手順でAzure Portal上でサービス正常性アラートを構築していきます。

* Azure Portalの上部の検索窓からから、`サービス正常性` を検索、選択
* 左のメニューの一番下、 アラート > `正常性アラート` を選択
* `サービス正常性アラートの追加` を選択
* 対象のサブスクリプションとサービス、リージョン、通知対象のイベントを選択
* アクション > アクション グループの選択 から、先程作成したアクショングループを選択
* アラートルールの詳細 から、ルール名、説明、リソースグループを選択
* `アラート ルールの作成` をクリック


## 3.アラートルールへLogic Apps定義を組み込む

最後に、ステップ2で構築したサービス正常性アラートへ`Logic Apps`の定義を組み込んでいきます。

### アクショングループへ`Logic Apps`を設定

![アラートルールへLogicApp組み込み.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/45e305fd-ebb9-5db5-1c76-be97ac661da1.jpeg)

アラートルールの設定例です。
![アラートルール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/1d259162-f1d0-3241-af17-6ea11640719a.jpeg)


### 動作確認

加工されたアラート通知がSlackへ届けばOKです！

![動作確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/5204d0e6-f318-96bd-5577-f27872bebe2b.jpeg)


#最後に

以上、`Azure Logic Apps` と `Azure Monitor` を活用して3ステップでSlackへのサービス正常性アラートを構築する手順でした。
NoCodeツールだけでここまでできるのは便利ですよね！


私が所属している株式会社クアンドではエンジニア募集中です。
地域産業のアップデートをミッションに、製造業や建設業など「現場」の課題を解決するためのアプリケーションを開発しています！
私もフルフレックス＆フルリモートで働いています。
興味のある方はWantedlyの募集ページをご覧ください！

https://www.wantedly.com/companies/quando