Python 3.x 在AWS Lambda Python函数中解析CloudWatch警报

Python 3.x 在AWS Lambda Python函数中解析CloudWatch警报,python-3.x,amazon-web-services,aws-lambda,Python 3.x,Amazon Web Services,Aws Lambda,我正在开发Lambda函数,该函数将根据CloudWatch警报执行多个操作 警报的JSON格式为: { 'SignatureVersion': '1', 'Timestamp': '2018-03-08T16: 06: 27.163Z', 'MessageId': 'df82d564-1651-5dc6-a37a-867f779226ec', 'Message': '{ "AlarmName": "awsec2-i-08c38bb8af79627

我正在开发Lambda函数,该函数将根据CloudWatch警报执行多个操作

警报的JSON格式为:

{
    'SignatureVersion': '1',
    'Timestamp': '2018-03-08T16: 06: 27.163Z',
    'MessageId': 'df82d564-1651-5dc6-a37a-867f779226ec',
    'Message': '{
        "AlarmName": "awsec2-i-08c38bb8af7962797-CPU-Utilization",
        "AlarmDescription": "Created from EC2 Console",
        "AWSAccountId": "111111111111",
        "NewStateValue": "ALARM",
        "NewStateReason": "Threshold Crossed: 1 datapoint [1.49999999999939 (08/03/18 16:04:00)] was greater than or equal to the threshold (1.0).",
        "StateChangeTime": "2018-03-08T16:06:27.124+0000",
        "Region": "EU (Ireland)",
        "OldStateValue": "OK",
        "Trigger": {
            "MetricName": "CPUUtilization",
            "Namespace": "AWS/EC2",
            "StatisticType": "Statistic",
            "Statistic": "AVERAGE",
            "Unit": null,
            "Dimensions": [
                {
                    "name": "InstanceId",
                    "value": "i-08c38bb8af7962797"
                }
            ],
            "Period": 60,
            "EvaluationPeriods": 1,
            "ComparisonOperator": "GreaterThanOrEqualToThreshold",
            "Threshold": 1.0,
            "TreatMissingData": "",
            "EvaluateLowSampleCountPercentile": ""
        }
    }',
    'Type': 'Notification',
    'TopicArn': 'arn:aws:sns:eu-west-1: 11111111111:test',
    'Subject': 'ALARM: "awsec2-i-08c38bb8af7962797-CPU-Utilization" in EU (Ireland)'
}
我需要了解的是如何告诉我的函数仅提取InstanceId值,并将其用作函数其余部分的变量。

消息是以字符串形式提供的JSON。要访问字符串的内容,需要使用json.loads函数:

import json

alert = ... (from CloudWatch)

message = json.loads(alert['Message'])

[msg['value'] for msg in message['Trigger']['Dimensions'] if msg['name']=='InstanceId']
但是,请注意,这将仅输出作为报警维度提供的InstanceId。并不是说这起事件引起了警报,但事实确实如此

例如,您可以基于一组EC2实例创建报警。如果平均CPU超过阈值,则会触发警报。但是,维度将与组相关,而不是特定实例

可以将其视为实例i-xxx的过滤器已触发报警,而不是实例i-xxx触发报警

只要您的报警始终基于单个实例,那么维度将是您所期望的