#json #amazon-web-services #aws-codecommit
#json #amazon-web-services #aws-codecommit
Вопрос:
Я пытаюсь настроить пользовательское событие в AWS CloudWatch. Моя цель — запустить либо:
event:pullRequestMergeStatus
И isMerged:True
или
event:pullRequestStatusChanged
И isMerged:False
Я пробовал использовать логические операторы JSOM, такие как:
{"$and":[{"event":"pullRequestMergeStatus"}, {"isMerged":"True"}]}
Однако либо AWS не поддерживает это, либо синтаксис неверен. Я также пытался добавить массив в свою detail
часть строки JSON, но это заканчивается синтаксической ошибкой, а добавление 2 detail
записей s просто приводит к тому, что нижняя запись топает сверху.
Есть ли какие-либо сведения о том, как настроить логику в пользовательском событии AWS CloudWatch, чтобы разрешить несколько наборов событий, подобных этому?
Мое текущее, рабочее, но уродливое решение — иметь 2 отдельных события CloudWatch, по одному на event
/ isMerged
set. например
{
"source": [
"aws.codecommit"
],
"detail-type": [
"CodeCommit Repository State Change"
],
"detail": {
"event": [
"pullRequestStatusChanged"
],
"isMerged": [
"False"
]
}
}
Ответ №1:
Вы можете настроить таргетинг на лямбда-функцию с помощью исходного события CW, затем заставить лямбду принять решение (проверить несколько параметров в строках JSON), затем эта лямбда может отправить сообщение SNS в тему, у которой есть подписка на лямбда и т. Д. — Варианты бесконечны.
Пример кода для Lambda может быть следующим (Python) — его назначение другое, но вы поймете идею:
import json
import boto3
from pprint import pprint
from datetime import datetime
def datetime_handler(x, y):
if isinstance(y, datetime):
return y.isoformat()
raise TypeError("Unknown type")
def alarm_handler(event, context):
pprint("Received the message and start to check alarm state..........")
json.JSONEncoder.default = datetime_handler
cw = boto3.client('cloudwatch')
response = cw.describe_alarms(ChildrenOfAlarmName='cw-alarm')
length = len(response["MetricAlarms"])
count = 0
flag = 0
messagetobesent = ""
print("length is " str(length))
while (count < length):
check_msg = response["MetricAlarms"][count]
print("count is" str(count))
currentvalue = check_msg["StateValue"]
print ("Current Alarm value is " str(currentvalue))
if (currentvalue == 'ALARM'):
messagetobesent = messagetobesent response["MetricAlarms"][count]["AlarmName"] " ,"
flag = flag 1
count = count 1
#sendingdata = message["StateReason"]
pprint("Alarm reason is " messagetobesent)
pprint("Alarm state is " messagetobesent)
if (flag > 0):
sns = boto3.client('sns')
responseSNS = sns.publish(TopicArn='arn:aws:sns:aaaaaaaaa:sns',
Message=messagetobesent,
Subject='Notification from cw-alarm')
pprint("Send SNS notification!")
return("Alarm!")
else:
pprint("No alarm!")
return("No alarm!")