ServiceNowを使用したアラームの管理
このトピックでは、アラームが発生するたびに自動ServiceNowチケットを登録する方法について説明します。
このシナリオでは、CPU使用率がアラームで指定されたしきい値を超えると、オンコール・エンジニアに対してServiceNowチケットが作成されます。
Oracle Cloud Infrastructure Console、APIまたはCLIを使用してクラウド・リソースに説明、タグまたはフレンドリ名を割り当てる場合、機密情報を入力しないでください。
このシナリオでは、ServiceNowチケットをファイルするためのファンクションの書込み(およびServiceNow資格証明を格納するシークレットの作成)、そのファンクションおよびオプションの電子メールをサブスクリプションとしてトピックに追加し、アラームしきい値を超えた場合にそのトピックにメッセージを送信するアラームを作成します。メッセージはトピックのサブスクリプションにファン・アウトされ、機能に加えてグループEメール・アドレスも含まれます。メッセージの受信時にファンクションが呼び出されます。
ファンクション以外はすべてコンソールで設定できます。または、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)を使用します。
トピックで使用する前に、ファンクションをデプロイする必要があります。
サブスクリプションの作成
トピックのサブスクリプションを作成します。
サブスクリプションは、トピックのエンドポイントです。パブリッシュされたメッセージは、トピックの各サブスクリプションに送信されます。
サブスクリプションで使用する前にファンクションをデプロイする必要があり、そのファンクションをトピックのサブスクリプションとして追加するには、そのファンクションに対してFN_INVOCATION
権限を持っている必要があります。
- コンソールを使用してファンクション・サブスクリプションを作成するには:
- コンソールを使用してオプションの電子メール・サブスクリプションを作成するには:
- CLIを使用してサブスクリプションを作成するには:
- APIを使用してサブスクリプションを作成するには: