Share via


Inviare avvisi di integrità dei servizi di Azure con ServiceNow usando webhook

Questo articolo illustra come integrare gli avvisi di integrità dei servizi di Azure con ServiceNow usando un webhook. Dopo avere configurato l'integrazione webhook con l'istanza di ServiceNow, si ottengono avvisi tramite l'infrastruttura di notifica esistente in caso di problemi relativi al servizio Azure. Ogni volta che viene generato un avviso di Integrità dei servizi di Azure, chiama un webhook tramite l'API REST con script di ServiceNow.

Creazione di un'API REST con script in ServiceNow

  1. Assicurarsi di avere eseguito la registrazione e l'accesso all'account ServiceNow.

  2. Passare alla sezione System Web Services (Servizi Web di sistema) in ServiceNow e selezionare Scripted REST APIs (API REST con script).

    The

  3. Selezionare New (Nuova) per creare un nuovo servizio REST con script.

    The

  4. Aggiungere un nome all'API REST e impostare l'ID API su azureservicehealth.

  5. Seleziona Invia.

    The

  6. Selezionare l'API REST che è stata creata e nella scheda Resources (Risorse) selezionare New (Nuova).

    The

  7. Denominare la nuova risorsa event e cambiare il metodo HTTP in POST.

  8. Nella sezione Script aggiungere il codice JavaScript seguente:

    Nota

    È necessario aggiornare il valore <secret>,<group> e <email> nello script seguente.

    • <secret> deve essere una stringa casuale, ad esempio un GUID
    • <group> deve essere il gruppo ServiceNow a cui si vuole assegnare l'evento imprevisto
    • <email> deve essere l'utente specifico a cui si vuole assegnare l'evento imprevisto (facoltativo)
    (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. Nella scheda relativa alla sicurezza deselezionare Requires authentication (Richiede autenticazione) e selezionare Submit (Invia). Il valore <secret> impostato protegge invece questa API.

    The

  10. Nella sezione Scripted REST APIs (API REST con script) è presente Base API Path (Percorso API base) per la nuova API REST:

    The

  11. L'URL di integrazione completo è simile al seguente:

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

Creare un avviso usando ServiceNow nel portale di Azure

Per un nuovo gruppo di azioni:

  1. Seguire i passaggi da 1 a 8 in questo articolo per creare un avviso con un nuovo gruppo di azioni.

  2. Definire l'elenco di azioni:

    a. Tipo di azione:Webhook

    b. Dettagli: l'URL di integrazione di ServiceNow salvato in precedenza.

    c. Nome: nome, alias o identificatore del webhook.

  3. Al termine fare clic su Salva per creare l'avviso.

Per un gruppo di azioni esistente:

  1. Nel portale di Azure selezionare Monitoraggio.

  2. Nella sezione Impostazioni selezionare Gruppi di azioni.

  3. Individuare e selezionare il gruppo di azioni da modificare.

  4. Aggiungere all'elenco di azioni:

    a. Tipo di azione:Webhook

    b. Dettagli: l'URL di integrazione di ServiceNow salvato in precedenza.

    c. Nome: nome, alias o identificatore del webhook.

  5. Al termine fare clic su Salva per aggiornare il gruppo di azioni.

Test dell'integrazione del webhook tramite una richiesta HTTP POST

  1. Creare il payload di integrità del servizio che si vuole inviare. È possibile trovare un payload di esempio del webhook di integrità del servizio in Webhook per gli avvisi del log attività di Azure.

  2. Creare una richiesta HTTP POST nel modo seguente:

    POST        https://<yourInstanceName>.service-now.com/<baseApiPath>?apiKey=<secret>
    
    HEADERS     Content-Type: application/json
    
    BODY        <service health payload>
    
  3. Verrà visualizzata una risposta 200 OK con un messaggio indicante la creazione di un evento imprevisto.

  4. Passare a ServiceNow per confermare che l'integrazione è stata configurata correttamente.

Passaggi successivi