Как получить конкретное значение из CloudWatch Alarm с лямбда (python)? - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу контролировать EC2 с помощью CloudWatch-SNS-lambda (python) -SNS-Email.

Когда я тестирую свой код на Python, я обнаруживаю, что CW-сообщение "Message" содержит обработку escape, которую яне могу получить конкретное значение из «Сообщения».

Я проверяю формат аварийного сигнала с помощью приведенного ниже кода.

from __future__ import print_function
import json
import boto3

def lambda_handler(event, context):
    subject = 'subject'
    Messagebody = event['Records'][0]['Sns']['Message']
    MY_SNS_TOPIC_ARN = 'XXXXXXXXXXXXXXXXXXXXXXXX'
    sns_client = boto3.client('sns')
    sns_client.publish(
        TopicArn = MY_SNS_TOPIC_ARN,
        Subject = subject,
        Message = Messagebody
   )

, в котором выясняется, что «Сообщение» содержит escape-обработку.

"Sns": {
        "Type": "Notification",
        "MessageId": "94be4651-8f2e-5039-9a4b-129fff80f9e8",
        "TopicArn": "XXXXXXXXXXXXXXXXXXXXXXX",
        "Subject": "ALARM: \"CPU_\" in Asia Pacific (Tokyo)",
        "Message": "{\"AlarmName\":\"TEST\",\"AlarmDescription\":\"TEST\",\"AWSAccountId\":\"XXXXXXXXXXX\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 datapoint [64.633879781421 (01/02/19 15:56:00)] was greater than or equal to the threshold (40.0).\",\"StateChangeTime\":\"2019-02-01T16:06:06.908+0000\",\"Region\":\"Asia Pacific (Tokyo)\",\"OldStateValue\":\"OK\",\"Trigger\":{\"MetricName\":\"CPUUtilization\",\"Namespace\":\"AWS/EC2\",\"StatisticType\":\"Statistic\",\"Statistic\":\"AVERAGE\",\"Unit\":null,\"Dimensions\":[{\"value\":\"i-039c724383acd1a67\",\"name\":\"InstanceId\"}],\"Period\":300,\"EvaluationPeriods\":1,\"ComparisonOperator\":\"GreaterThanOrEqualToThreshold\",\"Threshold\":40.0,\"TreatMissingData\":\"\",\"EvaluateLowSampleCountPercentile\":\"\"}}",
        "Timestamp": "2019-02-01T16:06:06.945Z",
        "SignatureVersion": "1",

Я хочу получить значение, используя что-то вроде

MetricName = event['Records'][0]['Sns']['Message']["MetricName"]
Как я могу добиться этого с помощью Python?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Чтобы удалить escape-обработку, вы должны сделать следующее:

MessageBody = event ['Records'] [0] ['Sns'] ['Message']

MessageBody = json.loads (MessageBody)

Затем, чтобы получить доступ к имени метрики, вы можете сделать:

MetricName = event ['Records'] [0]['Sns'] ['Message'] ['Trigger'] ['MetricName']

0 голосов
/ 01 февраля 2019

Message является строкой JSON.Вы должны сначала преобразовать его в словарь Python.Затем вы можете легко получить доступ к его свойствам.

Messagebody = event['Records'][0]['Sns']['Message']
message_dict = json.loads(Messagebody)
metric_name = message_dict['Trigger']['MetricName']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...