使用 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) 建立主題。
您必須先部署函數,才能搭配主題使用。
