はじめに
Azure Logic Apps と Azure Monitor をうまく活用すると、コードを1行も書かずにSlackへのサービス正常性アラートを構築することが可能です。
サービス正常性アラートはFaaSで構築するのがトレンドですが、Azureはツールが充実しており、NoCodeツールを組み合わせるだけで構築可能です。
本エントリでは構築手順を3ステップで纏めています。
方針
こちらの公式リファレンスを参考に、
・サービス正常性アラート(Service Health Alert)でAzureリソースのヘルスチェックを行う
・アラートを検知した場合、Logic Apps 経由でSlackへ通知する
の方針で構築していきます。
Logic Apps を経由するには一つ理由があります。
サービス正常性アラートをそのままSlackへ通知すると、下記の状態となり非常に読みづらいです。
そのため、Logic Apps でアラート確認に必要な情報に絞り込んでからSlackへ通知します。
構築
下記3ステップで構築していきます。
・Logic Apps構築
・サービス正常性アラートを作成
・アラートへLogic Apps定義を組み込む
1. Logic Apps 構築
の手順通り実施。
※2021年7月20日時点の記述にて
手順 7 以降は Microsoft Teams への連携手順なのでスキップし、下記手順を実行ください。
ロジックアプリデザイナー上で変更が必要なのは
・JSONの解析
・メッセージの投稿
の2箇所です。
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へのメッセージ通知設定を構築してください。
初回の連携のみ、Logic AppsとSlackの連携設定が必要です。
ダイアログの手順に従って連携を行ってください。
正常に連携できるとSlackBotより下記通知が届きます。

2. サービス正常性アラートを作成
下記手順でAzure Portal上でサービス正常性アラートを構築していきます。
- Azure Portalの上部の検索窓からから、サービス正常性を検索、選択
- 左のメニューの一番下、 アラート > 正常性アラートを選択
- 
サービス正常性アラートの追加を選択
- 対象のサブスクリプションとサービス、リージョン、通知対象のイベントを選択
- アクション > アクション グループの選択 から、先程作成したアクショングループを選択
- アラートルールの詳細 から、ルール名、説明、リソースグループを選択
- 
アラート ルールの作成をクリック
3.アラートルールへLogic Apps定義を組み込む
最後に、ステップ2で構築したサービス正常性アラートへLogic Appsの定義を組み込んでいきます。
アクショングループへLogic Appsを設定
動作確認
加工されたアラート通知がSlackへ届けばOKです!
最後に
以上、Azure Logic Apps と Azure Monitor を活用して3ステップでSlackへのサービス正常性アラートを構築する手順でした。
NoCodeツールだけでここまでできるのは便利ですよね!
私が所属している株式会社クアンドではエンジニア募集中です。
地域産業のアップデートをミッションに、製造業や建設業など「現場」の課題を解決するためのアプリケーションを開発しています!
私もフルフレックス&フルリモートで働いています。
興味のある方はWantedlyの募集ページをご覧ください!








