Как я могу использовать логику JSON в пользовательском событии AWS Cloudwatch?

#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!")