ServiceNow で webhook を使用して Azure サービス正常性アラートを構成する
この記事では、webhook を使用して Azure サービス正常性アラートを ServiceNow と統合する方法について説明します。 ServiceNow インスタンスと webhook の統合を設定すると、Azure サービスの問題で影響を受ける場合に、既存の通知インフラストラクチャを通じてアラートを受け取ることになります。 Azure サービス正常性アラートが発生するたびに、ServiceNow のスクリプト化された REST API を介して Webhook が呼び出されます。
ServiceNow でスクリプト化された REST API を作成する
ServiceNow アカウントをサインアップ済みであることを確認した後、サインインします。
ServiceNow の [System Web Services]\(システム Web サービス\) セクションに移動し、[Scripted REST APIs]\(スクリプト化された REST API\) を選択します。
[New]\(新規\) を選択して、スクリプト化された REST サービスを新しく作成します。
[Name]\(名前\) に REST API の名前を追加し、[API ID] を
azureservicehealth
に設定します。送信を選択します。
作成した REST API を選択し、[Resources]\(リソース\) タブで [New]\(新規\) を選択します。
新しいリソースの [Name]\(名前\) を
event
に設定し、[HTTP method]\(HTTP メソッド\) をPOST
に変更します。[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);
セキュリティのタブで [Requires authentication]\(認証が必要\) チェック ボックスをオフにして、[Submit]\(送信\) を選択します。 設定した
<secret>
が代わりにこの API を保護します。[Scripted REST APIs]\(スクリプト化された REST API\) セクションに戻って、新しい REST API の [Base API Path]\(ベース API パス\) を探します。
完全統合 URL は次のようになります。
https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret>
ServiceNow を使用して Azure Portal でアラートを作成する
新しいアクション グループの場合:
この記事の手順 1. ~ 8. に従って、新しいアクション グループでアラートを作成します。
[アクション] の一覧で以下を定義します。
a. アクションの種類: Webhook
b. 詳細: 先ほど保存した ServiceNow の統合 URL。
c. 名前: webhook の名前、別名、または識別子。
完了したら [保存] を選択して、アラートを作成します。
既存のアクション グループの場合:
Azure Portal で、[モニター] を選択します。
[設定] セクションで [アクション グループ] を選択します。
編集するアクション グループを見つけて選択します。
[アクション] の一覧に以下を追加します。
a. アクションの種類: Webhook
b. 詳細: 先ほど保存した ServiceNow の統合 URL。
c. 名前: webhook の名前、別名、または識別子。
完了したら [保存] を選択して、アクション グループを更新します。
HTTP POST 要求によって webhook 統合をテストする
送信するサービス正常性のペイロードを作成します。 サービス正常性 webhook ペイロードの例については、「Azure アクティビティ ログ アラートのための webhook」を参照してください。
次のような HTTP POST 要求を作成します。
POST https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret> HEADERS Content-Type: application/json BODY <service health payload>
"Incident created (インシデントが作成されました)" というメッセージと共に
200 OK
応答を受信します。ServiceNow に移動して、統合が正常に設定されたことを確認します。
次のステップ
- 既存の問題管理システム用の webhook 通知を構成する方法について学習します。
- アクティビティ ログ アラート webhook スキーマを確認します。
- サービス正常性の通知について学習します。
- アクション グループについて学習します。