ServiceNow로 알람 관리
이 항목에서는 알람이 실행될 때마다 자동 ServiceNow 티켓을 제출하는 방법에 대해 설명합니다.
이 시나리오에서는 CPU 사용량이 알람으로 지정된 임계값을 초과할 때마다 호출 중인 엔지니어를 위해 ServiceNow 티켓이 생성됩니다.
Oracle Cloud Infrastructure 콘솔, API 또는 CLI를 통해 클라우드 리소스에 설명, 태그 또는 친화적인 이름을 지정할 때 기밀 정보를 입력하지 마십시오.
이 시나리오에서는 ServiceNow 티켓을 제출(및 ServiceNow 자격 증명을 저장할 암호 만들기), 해당 기능 및 선택적 전자 메일을 토픽에 구독으로 추가하고, 알람 임계값이 초과될 때 해당 토픽으로 메시지를 전송하는 알람을 만드는 작업이 포함됩니다. 메시지는 해당 기능과 함께 그룹 전자메일 주소를 포함하는 토픽의 구독으로 팬아웃됩니다. 메시지 수신 시 함수가 호출됩니다.
기능을 제외한 모든 항목을 콘솔에서 설정할 수 있습니다. 또는 Oracle Cloud Infrastructure CLI 또는 API를 사용하여 개별 작업을 직접 실행할 수도 있습니다.
다음 다이어그램은 일반 프로세스 플로우를 보여줍니다.
암호에 ServiceNow 인증서 저장
나중에 함수를 생성할 때 참조할 암호를 생성합니다.
콘솔을 사용하여 암호를 만듭니다. CLI(명령줄 인터페이스) 또는 API(응용 프로그램 프로그래밍 인터페이스)를 사용하여 암호를 만들 수도 있습니다.
함수 생성
아래 샘플 코드로 시작하여 ServiceNow 티켓을 제출하는 함수를 생성한 다음 Oracle Cloud Infrastructure Vault 서비스를 사용하여 생성된 암호에서 ServiceNow 인증서에 액세스할 수 있는 권한을 부여합니다.
코드 예제에는 가상 함수에 사용되는 SNOW_URL, SNOW_USER_ID_SEC 및 SNOW_USER_PWD_SEC 변수가 포함됩니다. 대신 함수에서 직접 이러한 값을 읽거나 값을 사용자 정의 구성 매개변수로 전달하도록 선택할 수 있습니다.
#####################################################
# 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
동적 그룹을 사용하여 암호 읽기 기능을 함수에 부여합니다. 이전에 생성한 암호에 저장된 ServiceNow 인증서에 액세스하려면 함수에 이 권한 부여가 있어야 합니다.
항목 생성
구독 및 알람에 사용할 토픽을 생성합니다.
토픽은 구독에 메시지를 전송하는 데 사용되는 통신 채널입니다. 각 토픽 이름은 테넌시에서 고유합니다. 콘솔, CLI(명령줄 인터페이스) 또는 API(응용 프로그램 프로그래밍 인터페이스)를 사용하여 항목을 만들 수 있습니다.
기능을 토픽과 함께 사용하려면 먼저 배포해야 합니다.