

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Conectando ServiceNow
<a name="connecting-to-ticketing-and-chat-connecting-servicenow"></a>

En este tutorial, se explica cómo conectar una ServiceNow instancia con el AWS DevOps agente para que pueda iniciar automáticamente investigaciones de respuesta a incidentes cuando se crea un ticket y publicar sus principales hallazgos en el ticket de origen. También contiene ejemplos sobre cómo configurar la ServiceNow instancia para enviar solo tickets específicos a un espacio de DevOps agente y cómo organizar el enrutamiento de los tickets entre varios espacios de DevOps agente.

## Configuración inicial
<a name="initial-setup"></a>

El primer paso es crear ServiceNow un cliente de OAuth aplicación que AWS DevOps puedas usar para acceder a tu ServiceNow instancia.

### Cree un cliente ServiceNow OAuth de aplicación
<a name="create-a-servicenow-oauth-application-client"></a>

1. Habilite la propiedad del sistema de credenciales de cliente de su instancia

   1. Busca `sys_properties.list` en el cuadro de búsqueda del filtro y, a continuación, pulsa enter (no mostrará la opción, pero pulsar enter funciona)

   1. Elige Nuevo

   1. Añada el nombre como `glide.oauth.inbound.client.credential.grant_type.enabled` y el valor a true y escriba true \$1 false

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/09ed6d5ff911.png)


1. Vaya a Sistema OAuth > Registro de aplicaciones desde el cuadro de búsqueda del filtro

1. Seleccione «Nueva» > «Nueva experiencia de integración entrante» > «Nueva integración» > «OAuth - Concesión de credenciales de cliente»

1. Elija un nombre y establezca el usuario de la OAuth aplicación como «Administrador de problemas» y haga clic en «Guardar»

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/aeff4c127f7c.png)


### Conecta a tu ServiceNow OAuth cliente con el AWS DevOps agente
<a name="connect-your-servicenow-oauth-client-to-aws-devops-agent"></a>

1. Puede iniciar este proceso en dos lugares. En primer lugar, vaya a la página de **proveedores de capacidades** y busque en **Comunicación** y, **ServiceNow**a continuación, haga clic en **Registrar**. También puede seleccionar cualquier espacio de DevOps agente que haya creado y navegar hasta Capacidades → Comunicaciones → Añadir → ServiceNow y hacer clic en Registrar.

1. A continuación, autorice al DevOps agente a acceder a su ServiceNow instancia mediante el cliente de OAuth aplicación que acaba de crear.

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/3db5a9aafc5f.png)

+ Siga los pasos siguientes y guarde la información resultante sobre el webhook 

**importante**  
No volverás a ver esta información

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/80d0a319f87e.png)


### Configure su regla ServiceNow de negocio
<a name="configure-your-servicenow-business-rule"></a>

Una vez que haya establecido la conectividad, tendrá que configurar una regla empresarial ServiceNow para enviar los tickets a sus espacios de DevOps agente.

1. Vaya a Suscripciones de actividades → Administración → Reglas empresariales y haga clic en Nuevo.

1. Defina el campo «Tabla» como «Incidente [incidente]», marque la casilla «Avanzado» y configure la regla para que se ejecute después de Insertar, Actualizar y Eliminar.

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/6f2a7370e2c0.png)


1. Ve a la pestaña «Avanzado» y añade el siguiente script de webhook, inserta el secreto y la URL del webhook donde se indica y pulsa Enviar.

```
(function executeRule(current, previous /*null when async*/ ) {

    var WEBHOOK_CONFIG = {
        webhookSecret: GlideStringUtil.base64Encode('<<< INSERT WEBHOOK SECRET HERE >>>'),
        webhookUrl: '<<< INSERT WEBHOOK URL HERE >>>'
    };

    function generateHMACSignature(payloadString, secret) {
        try {
            var mac = new GlideCertificateEncryption();
            var signature = mac.generateMac(secret, "HmacSHA256", payloadString);
            return signature;
        } catch (e) {
            gs.error('HMAC generation failed: ' + e);
            return null;
        }
    }

    function callWebhook(payload, config) {
        try {
            var timestamp = new Date().toISOString();
            var payloadString = JSON.stringify(payload);
            var payloadWithTimestamp =`${timestamp}:${payloadString}`;

            var signature = generateHMACSignature(payloadWithTimestamp, config.webhookSecret);

            if (!signature) {
                gs.error('Failed to generate signature');
                return false;
            }

            gs.info('Generated signature: ' + signature);

            var request = new sn_ws.RESTMessageV2();
            request.setEndpoint(config.webhookUrl);
            request.setHttpMethod('POST');

            request.setRequestHeader('Content-Type', 'application/json');
            request.setRequestHeader('x-amzn-event-signature', signature);
            request.setRequestHeader('x-amzn-event-timestamp', timestamp);

            request.setRequestBody(payloadString);

            var response = request.execute();
            var httpStatus = response.getStatusCode();
            var responseBody = response.getBody();

            if (httpStatus >= 200 && httpStatus < 300) {
                gs.info('Webhook sent successfully. Status: ' + httpStatus);
                return true;
            } else {
                gs.error('Webhook failed. Status: ' + httpStatus + ', Response: ' + responseBody);
                return false;
            }

        } catch (ex) {
            gs.error('Error sending webhook: ' + ex.getMessage());
            return false;
        }
    }

    function createReference(field) {
        if (!field || field.nil()) {
            return null;
        }

        return {
            link: field.getLink(true),
            value: field.toString()
        };
    }

    function getStringValue(field) {
        if (!field || field.nil()) {
            return null;
        }
        return field.toString();
    }

    function getIntValue(field) {
        if (!field || field.nil()) {
            return null;
        }
        var val = parseInt(field.toString());
        return isNaN(val) ? null : val;
    }

    var eventType = (current.operation() == 'insert') ? "create" : "update";

    var incidentEvent = {
        eventType: eventType.toString(),
        sysId: current.sys_id.toString(),
        priority: getStringValue(current.priority),
        impact: getStringValue(current.impact),
        active: getStringValue(current.active),
        urgency: getStringValue(current.urgency),
        description: getStringValue(current.description),
        shortDescription: getStringValue(current.short_description),
        parent: getStringValue(current.parent),
        incidentState: getStringValue(current.incident_state),
        severity: getStringValue(current.severity),
        problem: createReference(current.problem),
        additionalContext: {}
    };

    incidentEvent.additionalContext = {
        number: current.number.toString(),
        opened_at: getStringValue(current.opened_at),
        opened_by: current.opened_by.nil() ? null : current.opened_by.getDisplayValue(),
        assigned_to: current.assigned_to.nil() ? null : current.assigned_to.getDisplayValue(),
        category: getStringValue(current.category),
        subcategory: getStringValue(current.subcategory),
        knowledge: getStringValue(current.knowledge),
        made_sla: getStringValue(current.made_sla),
        major_incident: getStringValue(current.major_incident)
    };

    for (var key in incidentEvent.additionalContext) {
        if (incidentEvent.additionalContext[key] === null) {
            delete incidentEvent.additionalContext[key];
        }
    }

    gs.info(JSON.stringify(incidentEvent, null, 2)); // Pretty print for logging only

    if (WEBHOOK_CONFIG.webhookUrl && WEBHOOK_CONFIG.webhookSecret) {
        callWebhook(incidentEvent, WEBHOOK_CONFIG);
    } else {
        gs.info('Webhook not configured.');
    }

})(current, previous);
```

Si ha decidido registrar su ServiceNow conexión desde la página de **proveedores de capacidades**, ahora tiene que ir al espacio de DevOps agentes en el que desea investigar las denuncias de ServiceNow incidentes, seleccionar Capacidades → Comunicaciones y, a continuación, registrar la ServiceNow instancia que registró en la página de proveedores de capacidades. Ahora, todo está listo y todos los incidentes en los que la persona que llama tenga el nombre de «administrador de problemas» (para imitar los permisos que usted otorgó al AWS DevOps OAuth cliente) darán lugar a una investigación de respuesta al incidente en el espacio de DevOps agente configurado. Para comprobarlo, crea un nuevo incidente ServiceNow y configura el campo de llamada del incidente como «Administrador de problemas». 

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/4c7d24a85f88.png)


### ServiceNow actualizaciones de tickets
<a name="servicenow-ticket-updates"></a>

Durante todas las investigaciones de respuesta a incidentes que se inicien, su DevOps agente actualizará sus principales hallazgos, sus análisis de las causas fundamentales y los planes de mitigación en la solicitud de origen. Las conclusiones del agente se publican junto con los comentarios de un incidente y, por el momento, solo publicaremos los registros de los agentes relacionados con las actualizaciones del tipo `finding` `cause``investigation_summary`,`mitigation_summary`, y del estado de la investigación (p. ej.`AWS DevOps Agent started/finished its investigation`).

## Ejemplos de enrutamiento y organización de tickets
<a name="ticket-routing-and-orchestration-examples"></a>

### Escenario: filtrar qué incidentes se envían a un espacio de DevOps agentes
<a name="scenario-filtering-which-incidents-are-sent-to-a-devops-agent-space"></a>

Se trata de un escenario sencillo, pero requiere cierta configuración ServiceNow para crear un campo ServiceNow que permita rastrear el origen del incidente. Para este ejemplo, cree un nuevo campo Source (u\$1source) con el generador de formularios SNOW. Esto permitirá rastrear la fuente del incidente y usarla para enrutar las solicitudes de una fuente en particular a un espacio de DevOps agente. El enrutamiento se logra creando una regla de negocio de Service Now y, en la pestaña Cuándo ejecutar, configurando «Cuándo» se activan y «Condiciones de filtrado». En este ejemplo, las condiciones del filtro se establecen de la siguiente manera: 

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/fac7a186beee.png)


### Escenario: enrutar los incidentes a través de varios espacios de DevOps agentes
<a name="scenario-routing-incidents-across-multiple-devops-agent-spaces"></a>

En este ejemplo, se muestra cómo iniciar una investigación en el espacio de DevOps agentes B cuando la urgencia es`1`, la categoría o el servicio`AWS`, y cómo iniciar una investigación en el espacio de DevOps agentes A cuando el servicio lo es `AWS` y la fuente es`Dynatrace`. `Software`

Este escenario se puede llevar a cabo de dos maneras. El propio script del webhook se puede actualizar para incluir esta lógica empresarial. En este escenario, mostraremos cómo lograrlo con una regla de ServiceNow negocio, para aumentar la transparencia y simplificar la depuración. El enrutamiento se logra mediante la creación de dos reglas comerciales de Service Now.
+ Cree una regla de negocio ServiceNow para el espacio de DevOps agentes A y cree una condición utilizando el generador de condiciones para enviar únicamente los eventos en función de nuestra condición especificada.

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/bca2f3928bf0.png)

+ A continuación, cree otra regla de negocio ServiceNow para AgentSpace B, cuya regla de negocio solo se active cuando el servicio sea AWS y la fuente sea Dynatrace.

![\[alt text not found\]](http://docs.aws.amazon.com/es_es/devopsagent/latest/userguide/images/bc29e4db1a76.png)


Ahora, cuando cree un nuevo incidente que cumpla con la condición especificada, se iniciará una investigación en el Agent Space A o DevOps en el DevOps Agent Space B, lo que le proporcionará un control pormenorizado sobre la distribución de los incidentes.