次の方法で共有


ServiceNow で webhook を使用して Azure サービス正常性アラートを構成する

この記事では、webhook を使用して Azure サービス正常性アラートを ServiceNow と統合する方法について説明します。 ServiceNow インスタンスと webhook の統合を設定すると、Azure サービスの問題で影響を受ける場合に、既存の通知インフラストラクチャを通じてアラートを受け取ることになります。 Azure サービス正常性アラートが発生するたびに、ServiceNow のスクリプト化された REST API を介して Webhook が呼び出されます。

ServiceNow でスクリプト化された REST API を作成する

  1. ServiceNow アカウントをサインアップ済みであることを確認した後、サインインします。

  2. ServiceNow の [System Web Services]\(システム Web サービス\) セクションに移動し、[Scripted REST APIs]\(スクリプト化された REST API\) を選択します。

    ServiceNow の [Scripted Web Service]\(スクリプト化された Web サービス\) セクション

  3. [New]\(新規\) を選択して、スクリプト化された REST サービスを新しく作成します。

    ServiceNow の

  4. [Name]\(名前\) に REST API の名前を追加し、[API ID]azureservicehealth に設定します。

  5. 送信を選択します。

    ServiceNow の

  6. 作成した REST API を選択し、[Resources]\(リソース\) タブで [New]\(新規\) を選択します。

    ServiceNow の

  7. 新しいリソースの [Name]\(名前\)event に設定し、[HTTP method]\(HTTP メソッド\)POST に変更します。

  8. [Script]\(スクリプト\) セクションで、次の JavaScript コードを追加します。

    Note

    以下のスクリプトで、<secret><group><email> の値を更新する必要があります。

    • <secret> は、GUID のようなランダムな文字列にします。
    • <group> は、インシデントを割り当てる ServiceNow グループです。
    • <email> は、インシデントを割り当てる特定のユーザーです (省略可能)。
    (function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
        var apiKey = request.queryParams['apiKey'];
        var secret = '<secret>';
        if (apiKey == secret) {
            var event = request.body.data;
            var responseBody = {};
            if (event.data.context.activityLog.operationName == 'Microsoft.ServiceHealth/incident/action') {
                var inc = new GlideRecord('incident');
                var incidentExists = false;
                inc.addQuery('number', event.data.context.activityLog.properties.trackingId);
                inc.query();
                if (inc.hasNext()) {
                    incidentExists = true;
                    inc.next();
                } else {
                    inc.initialize();
                }
                var short_description = "Azure Service Health";
                if (event.data.context.activityLog.properties.incidentType == "Incident") {
                    short_description += " - Service Issue - ";
                } else if (event.data.context.activityLog.properties.incidentType == "Maintenance") {
                    short_description += " - Planned Maintenance - ";
                } else if (event.data.context.activityLog.properties.incidentType == "Informational" || event.data.context.activityLog.properties.incidentType == "ActionRequired") {
                    short_description += " - Health Advisory - ";
                }
                short_description += event.data.context.activityLog.properties.title;
                inc.short_description = short_description;
                inc.description = event.data.context.activityLog.properties.communication;
                inc.work_notes = "Impacted subscription: " + event.data.context.activityLog.subscriptionId;
                if (incidentExists) {
                    if (event.data.context.activityLog.properties.stage == 'Active') {
                        inc.state = 2;
                    } else if (event.data.context.activityLog.properties.stage == 'Resolved') {
                        inc.state = 6;
                    } else if (event.data.context.activityLog.properties.stage == 'Closed') {
                        inc.state = 7;
                    }
                    inc.update();
                    responseBody.message = "Incident updated.";
                } else {
                    inc.number = event.data.context.activityLog.properties.trackingId;
                    inc.state = 1;
                    inc.impact = 2;
                    inc.urgency = 2;
                    inc.priority = 2;
                    inc.assigned_to = '<email>';
                    inc.assignment_group.setDisplayValue('<group>');
                    var subscriptionId = event.data.context.activityLog.subscriptionId;
                    var comments = "Azure portal Link: https://app.azure.com/h";
                    comments += "/" + event.data.context.activityLog.properties.trackingId;
                    comments += "/" + subscriptionId.substring(0, 3) + subscriptionId.slice(-3);
                    var impactedServices = JSON.parse(event.data.context.activityLog.properties.impactedServices);
                    var impactedServicesFormatted = "";
                    for (var i = 0; i < impactedServices.length; i++) {
                        impactedServicesFormatted += impactedServices[i].ServiceName + ": ";
                        for (var j = 0; j < impactedServices[i].ImpactedRegions.length; j++) {
                            if (j != 0) {
                                impactedServicesFormatted += ", ";
                            }
                            impactedServicesFormatted += impactedServices[i].ImpactedRegions[j].RegionName;
                        }
    
                        impactedServicesFormatted += "\n";
    
                    }
                    comments += "\n\nImpacted Services:\n" + impactedServicesFormatted;
                    inc.comments = comments;
                    inc.insert();
                    responseBody.message = "Incident created.";
                }
            } else {
                responseBody.message = "Hello from the other side!";
            }
            response.setBody(responseBody);
        } else {
            var unauthorized = new sn_ws_err.ServiceError();
            unauthorized.setStatus(401);
            unauthorized.setMessage('Invalid apiKey');
            response.setError(unauthorized);
        }
    })(request, response);
    
  9. セキュリティのタブで [Requires authentication]\(認証が必要\) チェック ボックスをオフにして、[Submit]\(送信\) を選択します。 設定した <secret> が代わりにこの API を保護します。

    ServiceNow の [Requires authentication]\(認証が必要\) チェック ボックス

  10. [Scripted REST APIs]\(スクリプト化された REST API\) セクションに戻って、新しい REST API の [Base API Path]\(ベース API パス\) を探します。

    ServiceNow の [Base API Path]\(ベース API パス\)

  11. 完全統合 URL は次のようになります。

    https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret>
    

ServiceNow を使用して Azure Portal でアラートを作成する

新しいアクション グループの場合:

  1. この記事の手順 1. ~ 8. に従って、新しいアクション グループでアラートを作成します。

  2. [アクション] の一覧で以下を定義します。

    a. アクションの種類: Webhook

    b. 詳細: 先ほど保存した ServiceNow の統合 URL

    c. 名前: webhook の名前、別名、または識別子。

  3. 完了したら [保存] を選択して、アラートを作成します。

既存のアクション グループの場合:

  1. Azure Portal で、[モニター] を選択します。

  2. [設定] セクションで [アクション グループ] を選択します。

  3. 編集するアクション グループを見つけて選択します。

  4. [アクション] の一覧に以下を追加します。

    a. アクションの種類: Webhook

    b. 詳細: 先ほど保存した ServiceNow の統合 URL

    c. 名前: webhook の名前、別名、または識別子。

  5. 完了したら [保存] を選択して、アクション グループを更新します。

HTTP POST 要求によって webhook 統合をテストする

  1. 送信するサービス正常性のペイロードを作成します。 サービス正常性 webhook ペイロードの例については、「Azure アクティビティ ログ アラートのための webhook」を参照してください。

  2. 次のような HTTP POST 要求を作成します。

    POST        https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret>
    
    HEADERS     Content-Type: application/json
    
    BODY        <service health payload>
    
  3. "Incident created (インシデントが作成されました)" というメッセージと共に 200 OK 応答を受信します。

  4. ServiceNow に移動して、統合が正常に設定されたことを確認します。

次のステップ