Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWS Lambda python获取cloudwatch报警信息,以触发对MS团队的警报_Python_Json_Amazon Web Services_Aws Lambda - Fatal编程技术网

AWS Lambda python获取cloudwatch报警信息,以触发对MS团队的警报

AWS Lambda python获取cloudwatch报警信息,以触发对MS团队的警报,python,json,amazon-web-services,aws-lambda,Python,Json,Amazon Web Services,Aws Lambda,我已经设置了一些cloud watch警报,当警报关闭时,它会触发一个lambda函数。在lambda中,我试图读取json并将其通知给MS团队。但我无法从基于json的数据库中获取报警名称 下面是json { 'Records': [ { 'EventSource': 'aws:sns', 'EventVersion': '1.0', 'EventSubscriptionArn': 'arn:aws:sns:ap-southeast-1:123:

我已经设置了一些cloud watch警报,当警报关闭时,它会触发一个lambda函数。在lambda中,我试图读取json并将其通知给MS团队。但我无法从基于json的数据库中获取报警名称

下面是json

{
  'Records': [
    {
      'EventSource': 'aws:sns',
      'EventVersion': '1.0',
      'EventSubscriptionArn': 'arn:aws:sns:ap-southeast-1:123:-teams-lambda-trigger:123-971d-4f70-927e-123',
      'Sns': {
        'Type': 'Notification',
        'MessageId': '12-d0b8-5a86-8b33-123',
        'TopicArn': 'arn:aws:sns:ap-southeast-1:123:vip-prestogo-teams-lambda-trigger',
        'Subject': 'ALARM: "AuthenticationFailedException-was101" in Asia Pacific (Singapore)',
        'Message': '{"AlarmName":"AuthenticationFailedException-was101","AlarmDescription":"Found \\"AuthenticationFailedException\\" in 123","AWSAccountId":"123","NewStateValue":"ALARM","NewStateReason":"Threshold Crossed: 1 out of the last 1 datapoints [1.0 (30/08/20 07:38:00)] was greater than or equal to the threshold (-1.0) (minimum 1 datapoint for OK -> ALARM transition).","StateChangeTime":"2020-08-30T07:39:22.330+0000","Region":"Asia Pacific (Singapore)","AlarmArn":"arn:aws:cloudwatch:ap-southeast-1:123:alarm:AuthenticationFailedException-was101","OldStateValue":"OK","Trigger":{"MetricName":"AuthenticationFailedException-was101","Namespace":"AuthenticationFailedException-was101","StatisticType":"Statistic","Statistic":"AVERAGE","Unit":null,"Dimensions":[],"Period":60,"EvaluationPeriods":1,"ComparisonOperator":"GreaterThanOrEqualToThreshold","Threshold":-1.0,"TreatMissingData":"- TreatMissingData:                    notBreaching","EvaluateLowSampleCountPercentile":""}}',
        'Timestamp': '2020-08-30T07:39:22.372Z',
        'SignatureVersion': '1',
        'Signature': '123/WJa6/3saRvSsz+eDW10LZaAlR7jMhnU4jE73UM/+123/123/123/123/123+j+pjE0nldGG+123/xouonYXLkBrfRQPtr1sv/RzrIJ/kTYr3EwSkGL032HNrOeWmdGZ9D4gIJ4ir/mbnbSZV7w==',
        'SigningCertUrl': 'https://sns.ap-southeast-1.amazonaws.com/SimpleNotificationService.pem',
        'UnsubscribeUrl': 'https://sns.ap-southeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-southeast-1:123:-teams-lambda-trigger:46235663-971d-4f70-927e-0a420040a154',
        'MessageAttributes': {
          
        }
      }
    }
  ]
}
按以下方式尝试,但失败:

 message = event['Records'][0]['Sns']['Message']
alarm =message['AlarmName']
我得到的错误如下:

字符串索引必须是整数:TypeError 回溯(最近一次呼叫最后一次): lambda_处理程序中的文件“/var/task/lambda_function.py”,第15行 “文本”:事件['Records'][0]['Sns']['Message']['AlarmDescription'] TypeError:字符串索引必须是整数


请帮助您的
事件['Records'][0]['Sns']['Message']
json字符串,而不是python字典。您必须使用以下方法将其解析到字典中:


您的
事件['Records'][0]['Sns']['Message']
json字符串,而不是python字典。您必须使用以下方法将其解析到字典中:


这是“AlarmName”属性位于json字符串中的结果。您需要首先解析该属性,以便可以访问该属性

使用
json.parse
函数检索报警名称,如下面的示例Lambda函数

import boto3
import json


def lambda_handler(event, context):
    message = event['Records'][0]['Sns']['Message']
    message = json.loads(message)
    alarm_name = message["AlarmName"]
    print(alarm_name)
我在Lambda中使用下面的事件测试了这一点

{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:ap-southeast-1:123:-teams-lambda-trigger:123-971d-4f70-927e-123",
      "Sns": {
        "Type": "Notification",
        "MessageId": "12-d0b8-5a86-8b33-123",
        "TopicArn": "arn:aws:sns:ap-southeast-1:123:vip-prestogo-teams-lambda-trigger",
        "Subject": "ALARM: \"AuthenticationFailedException-was101\" in Asia Pacific (Singapore)",
        "Message": "{\"AlarmName\":\"AuthenticationFailedException-was101\",\"AlarmDescription\":\"Found \\\"AuthenticationFailedException\\\" in 123\",\"AWSAccountId\":\"123\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 out of the last 1 datapoints [1.0 (30/08/20 07:38:00)] was greater than or equal to the threshold (-1.0) (minimum 1 datapoint for OK -> ALARM transition).\",\"StateChangeTime\":\"2020-08-30T07:39:22.330+0000\",\"Region\":\"Asia Pacific (Singapore)\",\"AlarmArn\":\"arn:aws:cloudwatch:ap-southeast-1:123:alarm:AuthenticationFailedException-was101\",\"OldStateValue\":\"OK\",\"Trigger\":{\"MetricName\":\"AuthenticationFailedException-was101\",\"Namespace\":\"AuthenticationFailedException-was101\",\"StatisticType\":\"Statistic\",\"Statistic\":\"AVERAGE\",\"Unit\":null,\"Dimensions\":[],\"Period\":60,\"EvaluationPeriods\":1,\"ComparisonOperator\":\"GreaterThanOrEqualToThreshold\",\"Threshold\":-1.0,\"TreatMissingData\":\"- TreatMissingData:                    notBreaching\",\"EvaluateLowSampleCountPercentile\":\"\"}}",
        "Timestamp": "2020-08-30T07:39:22.372Z",
        "SignatureVersion": "1",
        "Signature": "123/WJa6/3saRvSsz+eDW10LZaAlR7jMhnU4jE73UM/+123/123/123/123/123+j+pjE0nldGG+123/xouonYXLkBrfRQPtr1sv/RzrIJ/kTYr3EwSkGL032HNrOeWmdGZ9D4gIJ4ir/mbnbSZV7w==",
        "SigningCertUrl": "https://sns.ap-southeast-1.amazonaws.com/SimpleNotificationService.pem",
        "UnsubscribeUrl": "https://sns.ap-southeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-southeast-1:123:-teams-lambda-trigger:46235663-971d-4f70-927e-0a420040a154",
        "MessageAttributes": {
          
        }
      }
    }
  ]
}

此Lambda函数输出字符串
AuthenticationFailedException-was101

这是“AlarmName”属性位于json字符串中的结果。您需要首先解析该属性,以便可以访问该属性

使用
json.parse
函数检索报警名称,如下面的示例Lambda函数

import boto3
import json


def lambda_handler(event, context):
    message = event['Records'][0]['Sns']['Message']
    message = json.loads(message)
    alarm_name = message["AlarmName"]
    print(alarm_name)
我在Lambda中使用下面的事件测试了这一点

{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:ap-southeast-1:123:-teams-lambda-trigger:123-971d-4f70-927e-123",
      "Sns": {
        "Type": "Notification",
        "MessageId": "12-d0b8-5a86-8b33-123",
        "TopicArn": "arn:aws:sns:ap-southeast-1:123:vip-prestogo-teams-lambda-trigger",
        "Subject": "ALARM: \"AuthenticationFailedException-was101\" in Asia Pacific (Singapore)",
        "Message": "{\"AlarmName\":\"AuthenticationFailedException-was101\",\"AlarmDescription\":\"Found \\\"AuthenticationFailedException\\\" in 123\",\"AWSAccountId\":\"123\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 out of the last 1 datapoints [1.0 (30/08/20 07:38:00)] was greater than or equal to the threshold (-1.0) (minimum 1 datapoint for OK -> ALARM transition).\",\"StateChangeTime\":\"2020-08-30T07:39:22.330+0000\",\"Region\":\"Asia Pacific (Singapore)\",\"AlarmArn\":\"arn:aws:cloudwatch:ap-southeast-1:123:alarm:AuthenticationFailedException-was101\",\"OldStateValue\":\"OK\",\"Trigger\":{\"MetricName\":\"AuthenticationFailedException-was101\",\"Namespace\":\"AuthenticationFailedException-was101\",\"StatisticType\":\"Statistic\",\"Statistic\":\"AVERAGE\",\"Unit\":null,\"Dimensions\":[],\"Period\":60,\"EvaluationPeriods\":1,\"ComparisonOperator\":\"GreaterThanOrEqualToThreshold\",\"Threshold\":-1.0,\"TreatMissingData\":\"- TreatMissingData:                    notBreaching\",\"EvaluateLowSampleCountPercentile\":\"\"}}",
        "Timestamp": "2020-08-30T07:39:22.372Z",
        "SignatureVersion": "1",
        "Signature": "123/WJa6/3saRvSsz+eDW10LZaAlR7jMhnU4jE73UM/+123/123/123/123/123+j+pjE0nldGG+123/xouonYXLkBrfRQPtr1sv/RzrIJ/kTYr3EwSkGL032HNrOeWmdGZ9D4gIJ4ir/mbnbSZV7w==",
        "SigningCertUrl": "https://sns.ap-southeast-1.amazonaws.com/SimpleNotificationService.pem",
        "UnsubscribeUrl": "https://sns.ap-southeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-southeast-1:123:-teams-lambda-trigger:46235663-971d-4f70-927e-0a420040a154",
        "MessageAttributes": {
          
        }
      }
    }
  ]
}

此Lambda函数输出字符串
AuthenticationFailedException-was101

message=event['Records'][0]['Sns']['message'],您的消息是一个字符串,需要将其转换为字典。如果您对此有疑问,可以使用print(type(variable_name))。消息的值可能有,也可能没有特定的键,因此可以使用get()函数检索该值

import json 
message = json.loads(event['Records'][0]['Sns']['Message'])
alarm_name = message.get('AlarmName', None)
if alarm_name not None:
   {your action}
else:
    {some default action when key not present}
   

message=event['Records'][0]['Sns']['message'],您的消息是一个字符串,您需要将其转换为字典。如果您对此有疑问,可以使用print(type(variable_name))。消息的值可能有,也可能没有特定的键,因此可以使用get()函数检索该值

import json 
message = json.loads(event['Records'][0]['Sns']['Message'])
alarm_name = message.get('AlarmName', None)
if alarm_name not None:
   {your action}
else:
    {some default action when key not present}