Gestión de las armas con ServiceNow

En este tema se explica cómo archivar tickets ServiceNow automáticos cada vez que se activan alarmas.

En este escenario, siempre que el uso de CPU supere el umbral especificado por la alarma, se crea un ticket ServiceNow para el ingeniero de guardias.

No introduzca información confidencial al asignar descripciones, etiquetas ni nombres fáciles de recordar a los recursos de la nube mediante la consola, la API o la CLI de Oracle Cloud Infrastructure.

Este escenario implica escribir una función en los tickets ServiceNow (y crear un secreto para almacenar las credenciales ServiceNow), agregar esa función y el correo electrónico opcional como suscripciones a un tema y crear una alarma que envíe mensajes a ese tema cuando se supere el umbral de alarma. Los fans del mensaje se envían a las suscripciones del tema, que incluye una dirección de correo electrónico de grupo además de la función. Al recibir el mensaje, se llama a la función.

Todo menos la función se puede configurar en la consola. También puede utilizar la CLI o API de Oracle Cloud Infrastructure, que permite ejecutar las operaciones individuales.

En el siguiente diagrama se ilustra el flujo de proceso general:



servicenow-notifications-oracle.zip

Almacene sus credenciales ServiceNow en un secreto

Cree un secreto al que hará referencia más adelante al crear la función.

Cree un secreto mediante la consola (también puede crear un secreto mediante la interfaz de línea de comandos (CLI) o la interfaz de programación de aplicaciones (API)).

  1. Abra el menú de navegación, haga clic en Identidad y seguridad y, a continuación, en Almacén.
  2. En Ámbito de lista, en la lista Compartimento, haga clic en el nombre del compartimento en el que desee crear un secreto.
  3. En la lista de almacenes del compartimento, realice una de las siguientes acciones:
    • Haga clic en el nombre del almacén en el que desea crear un secreto.
    • Cree un nuevo almacén para el secreto y, a continuación, haga clic en el nombre del almacén.
  4. Cree el secreto de username:
    1. Haga clic en Secretos y, a continuación, en Crear secreto.
    2. En el cuadro de diálogo Crear secreto, seleccione un compartimento en la lista Crear en compartimento. Los secretos pueden existir fuera del compartimento en el que está el almacén).
    3. Haga clic en Nombre y, a continuación, introduzca un nombre para identificar la clave. Evite introducir información confidencial en este campo.
      Nombre de ejemplo: servicenow_username_plain_text
    4. Haga clic en Descripción y, a continuación, introduzca una breve descripción del secreto como ayuda para identificarlo. Evite introducir información confidencial en este campo.
      Descripción de ejemplo: servicenow_username_plain_text
    5. Seleccione la clave de cifrado maestra que desea utilizar para cifrar el contenido del secreto mientras se importa al almacén (la clave debe pertenecer al mismo almacén).
    6. Para Plantilla de tipo de secreto, seleccione Texto sin formato.
    7. Haga clic en Contenido secreto y, a continuación, introduzca el nombre de usuario ServiceNow:
      <your-servicenow-username>
    8. Haga clic en Crear secreto.
    9. Observe el OCID del secreto.

Creación de la función

Comience con el siguiente código de ejemplo para crear una función para archivar tickets de ServiceNow y, a continuación, autorice a la función a acceder a sus credenciales de ServiceNow en el secreto creado mediante el servicio Oracle Cloud Infrastructure Vault.

El ejemplo de código incluye variables SNOW_URL, SNOW_USER_ID_SEC y SNOW_USER_PWD_SEC que se utilizan en la función hipotética. Puede elegir leer estos valores directamente desde la función o transferir los valores como parámetros de configuración personalizados en su lugar.

#####################################################
# THIS SAMPLE CODE IS FOR DEMO PURPOSES ONLY
#*************************************************
# ******** DO NOT USE IN PRODUCTION *************
# ************************************************
#####################################################
import io
import sys
import oci
import json
import base64
import requests
from fdk import response
SNOW_URL = '<Provide Service Now URL here>'
SNOW_USER_ID_SEC = '<Provide the OCID of OCI Secret for Service Now User ID>'
SNOW_USER_PWD_SEC = '<Provide the OCID of OCI Secret for Service Now User Password>'
OCI_TO_SNOW_SEV_MAP =
{    'CRITICAL'  : '1',    'WARNING'   : '2',    'ERROR'     : '3',    'INFO'      : '4' }
def handler(ctx, data: io.BytesIO = None):
    try:
        funDataStr = data.read().decode('utf-8')
        funDataJSON =  json.loads(funDataStr)
        alarmData = {}
        alarmData['type'] = funDataJSON['type']
        alarmData['metaDataList'] = funDataJSON['alarmMetaData']
        alarmData['title'] = funDataJSON['title']
        alarmData['body'] = funDataJSON['body']
        alarmData['sev'] = OCI_TO_SNOW_SEV_MAP[funDataJSON['severity'].upper()]
        if alarmData['type'].upper() == 'OK_TO_FIRING':
            snowURL = SNOW_URL
            snowUsrIDSec = SNOW_USER_ID_SEC
            snowUsrPwdSec = SNOW_USER_PWD_SEC
            ociResPrncplSigner = oci.auth.signers.get_resource_principals_signer()
            ociSecSvc = oci.secrets.SecretsClient(config={}, signer=ociResPrncplSigner)
            snowUserID = readSecValueFromSecSvc(ociSecSvc, snowUsrIDSec)
            snowPswd = readSecValueFromSecSvc(ociSecSvc, snowUsrPwdSec)
            snowData = getSNOWData(alarmData)
            sendDataToSnow(snowURL, snowUserID, snowPswd, snowData)
    except Exception as e:
        sys.stderr.write("Exception : " + str(e))
        sys.stderr.write("Exception Class : " + str(e._class_))
    return response.Response(ctx, response_data="", headers={"Content-Type": "application/json"})
def sendDataToSnow(snowURL, uid, pwd, snowData):
    try:
{ 
snowHdrs =
      "Content-Type" : "application/json",
counter = 0
for sd in snowData:
"Accept" : "application/json"         }
        snowResp = requests.post(snowURL, auth=(uid, pwd), headers=snowHdrs, data=json.dumps(sd))
except Exception as e:
    sys.stderr.write("Exception : " + str(e))
    sys.stderr.write("Exception Class : " + str(e._class_))
   def getSNOWData(alarmData):
       snowData = []
       if alarmData['type'].upper() == 'OK_TO_FIRING':
           alrmMD = alarmData['metaDataList'][0]
           for d in alrmMD['dimensions']:
               snowDataElem = {}
               snowDataElem['node'] = d['resourceDisplayName']
               snowDataElem['source'] = 'OCI'
               snowDataElem['severity'] = alarmData['sev']
               snowDataElem['description'] = alarmData['body']
               snowDataElem['type'] = alarmData['title']
               snowData.append(snowDataElem)
       return snowData
   def readSecValueFromSecSvc(ociSecSvc, secID):
       secResp = ociSecSvc.get_secret_bundle(secID)
       secContent = secResp.data.secret_bundle_content.content
       secret_content = base64.b64decode(secContent).decode('utf-8')
       return secret_content

Utilice un grupo dinámico para otorgar a su función la capacidad de leer secretos. La función debe tener esta autorización para acceder a las credenciales ServiceNow, que se almacenan en los secretos que ha creado anteriormente.

  1. Busque y observe el OCID de función con el siguiente formato:
    ocid1.fnfunc.oc1.iad.<exampleuniqueID>

    Incluya la función en el grupo dinámico relevante especificando la siguiente regla:

    resource.id = '<function-ocid>'

    También puede crear un grupo dinámico que incluya todas las funciones:

    ALL{resource.type=’fnfunc’, resource.compartment.id=’<compartment_OCID>’}
  2. Otorgue acceso de grupo dinámico a los secretos agregando la siguiente política.
    allow dynamic-group <dynamic-group-name> to read secret-family in tenancy

    Para autorizar la función para que pueda acceder a otros recursos de Oracle Cloud Infrastructure, como instancias informáticas, incluya la función en un grupo dinámico y cree una política para otorgar acceso al grupo dinámico a esos recursos.

Crear el tema

Cree el tema que utilizará para las suscripciones y la alarma.

Un tema es un canal de comunicación para enviar mensajes a suscripciones. Cada nombre de tema es único en el arrendamiento. Puede crear el tema mediante la consola, la interfaz de línea de comandos (CLI) o la interfaz de programación de aplicaciones (API).

Debe desplegar la función antes de utilizarla con un tema.

  1. Para crear el tema mediante la consola:
    1. Abra el menú de navegación y haga clic en Servicios para desarrolladores. En Integración de aplicación, haga clic en Notificaciones.
    2. Haga clic en Crear tema en la parte superior de la lista de temas.
    3. En el cuadro de diálogo Crear tema, configure el tema:
      • Nombre: especifique un nombre fácil de recordar para el tema. Debe ser único en el arrendamiento; la validación es sensible a mayúsculas/minúsculas. Evite introducir información confidencial.
      • Descripción: también puede introducir una descripción para el tema. Evite introducir información confidencial.
    4. Haga clic en Crear.
  2. Para crear el tema mediante la CLI, abra un símbolo del sistema e introduzca un comando similar al siguiente:
    oci ons topic create
    --name "My Topic"
    --compartment-id "<compartment-ocid>"
  3. Para crear el tema mediante la API, utilice operaciones similares a las siguientes:
    POST /20181201/topics
    Host: notification.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "name": "My Topic",
      "compartmentId": "<compartment_OCID>"
    }
    

Crear las suscripciones

Cree la suscripción para el tema.

Una suscripción es un punto final de un tema. Los mensajes publicados se envían a cada suscripción para un tema.

Debe desplegar la función para poder utilizarla con una suscripción y debe tener el permiso FN_INVOCATION para que la función pueda agregar la función como suscripción a un tema.

  1. Para crear la suscripción de función mediante la consola:
    1. Abra el menú de navegación y haga clic en Servicios para desarrolladores. En Integración de aplicación, haga clic en Notificaciones. Haga clic en el nombre del tema al que desea agregar la suscripción.
    2. En la página de detalles del tema, haga clic en Crear suscripción.
    3. En el cuadro de diálogo Crear suscripción, configure la suscripción de función. La confirmación no es necesaria para las suscripciones de función.
      • Para el protocolo de suscripción, haga clic en Función.
      • Para el compartimento de funciones, haga clic en el compartimento que contiene la función.
      • para la aplicación de función, haga clic en la aplicación que contiene la función.
      • Para Función, haga clic en la función.
    4. Haga clic en Crear.
  2. Para crear una suscripción de correo electrónico opcional mediante la consola:
    1. Abra el menú de navegación y haga clic en Servicios para desarrolladores. En Integración de aplicación, haga clic en Notificaciones. Haga clic en el nombre del tema al que desea agregar la suscripción.
    2. En la página de detalles del tema, haga clic en Crear suscripción.
    3. En el cuadro de diálogo Crear suscripción, configure la suscripción de correo electrónico.
      • Para el protocolo de suscripción, haga clic en Correo electrónico.
      • Para Correo electrónico, especifique una dirección de correo electrónico.
    4. Haga clic en Crear.
      Se crea la suscripción de correo electrónico y se envía una URL de confirmación de suscripción a la dirección de correo electrónico especificada. La suscripción permanece en estado Pendiente hasta que se confirma. Para confirmar la nueva suscripción de correo electrónico, abra el correo electrónico y haga clic en la URL de confirmación.
  3. Para crear una suscripción mediante la CLI:
    1. Para crear una suscripción de función, abra un símbolo del sistema e introduzca un comando similar al siguiente:
      oci ons subscription create
      --compartment-id "<compartment-ocid>"
      --topic-id "<topic-ocid>" 
      --protocol "ORACLE_FUNCTIONS"
      --subscription-endpoint "<function-ocid>"
    2. Para crear una suscripción de correo electrónico, abra un símbolo del sistema e introduzca un comando similar al siguiente:
      oci ons subscription create
      --compartment-id "<compartment-ocid>"
      --topic-id "<topic-ocid>" 
      --protocol "EMAIL"
      --subscription-endpoint "team@example.com"
  4. Para crear una suscripción mediante la API:
    1. Para crear una suscripción de función mediante la API, utilice operaciones similares a las siguientes:
      POST /20181201/subscriptions
      Host: notification.us-phoenix-1.oraclecloud.com
      <authorization and other headers>
      {
        "topicId": "<topic_OCID>",
        "compartmentId": "<compartment_OCID>",
        "protocol": "ORACLE_FUNCTIONS",
        "endpoint": "<function_OCID>"
      } 
    2. Para crear una suscripción de correo electrónico mediante la API, utilice operaciones similares a las siguientes:
      POST /20181201/subscriptions
      Host: notification.us-phoenix-1.oraclecloud.com
      <authorization and other headers>
      {
        "topicId": "<topic_OCID>",
        "compartmentId": "<compartment_OCID>",  
        "protocol": "EMAIL",
        "endpoint": "team@example.com"
      
      } 

Crear la alarma

Cree la alarma que envía un mensaje al tema siempre que se supere el umbral de alarma. A continuación, el servicio de notificaciones entrega el mensaje a las suscripciones activas en ese tema.

  1. Para crear la alarma mediante la consola:
    1. Abra el menú de navegación y haga clic en Observación y gestión. En Supervisión, haga clic en Definiciones de alarma.
    2. Haga clic en Crear alarma.
    3. En la página Crear alarma, en Definir alarma, configure el umbral:
      En la descripción de la métrica:
      • Compartimento: seleccione el compartimento que contiene las instancias informáticas de interés.
      • Espacio de nombres de métrica: oci_computeagent
      • Nombre de métrica: CpuUtilization
      • Intervalo: 1 m
      • Estadística: recuento
      En la regla de disparador:
      • Operador: mayor que
      • Valor: 90
      • Minutos de retraso del disparador: 1
    4. Para definir notificaciones de alarma, agregue el tema que creó anteriormente como destino.
      En Destino:
      • Servicio de destino: Notificaciones
      • Compartimento: (Seleccione el compartimento que contenga el tema)
      • Tema: (seleccione su tema)
    5. Haga clic en Guardar alarma.
  2. Para crear la alarma mediante la CLI, abra un símbolo del sistema e introduzca un comando similar al siguiente:
    oci monitoring alarm create
    --display-name "My Alarm"
    --compartment-id "<compartment-ocid>" 
    --metric-compartment-id "<compartment-ocid>" 
    --namespace "oci_computeagent" 
    --query-text "CPUUtilization[1m].count() > 90"
    --severity "CRITICAL"
    --destinations "<topic-ocid>"
    --is-enabled true
  3. Para crear la alarma mediante la API, utilice operaciones similares a las siguientes:
    POST /20180401/alarms
    Host: telemetry.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "displayName": "My Alarm",
      "compartmentId": "<compartment_OCID>",
      "metricCompartmentId": "<compartment_OCID>",
      "namespace": "oci_computeagent",
      "query": "MemoryUtilization[1m].max() > 90",
      "severity": "CRITICAL",
      "destinations":
        [
          "<topic_OCID>"
        ],
      "isEnabled": true
    }