【问题标题】:AWS Lambda python to get cloudwatch alarm info to trigger an alert to MS teamsAWS Lambda python 获取 cloudwatch 警报信息以触发 MS 团队的警报
【发布时间】:2020-08-30 07:46:15
【问题描述】:

我设置了几个云手表警报,当警报响起时,它会触发 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 回溯(最近一次通话最后): 文件“/var/task/lambda_function.py”,第 15 行,在 lambda_handler “文本”:事件['Records'][0]['Sns']['Message']['AlarmDescription'] TypeError: 字符串索引必须是整数

请帮忙

【问题讨论】:

    标签: python json amazon-web-services aws-lambda


    【解决方案1】:

    这是“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

    【讨论】:

      【解决方案2】:

      您的event['Records'][0]['Sns']['Message']json 字符串,而不是python 字典。您必须使用 json.loads 将其解析到字典中:

      import json # if not already present
      
      message = json.loads(event['Records'][0]['Sns']['Message'])
      
      alarm_name = message['AlarmName']
      

      【讨论】:

        【解决方案3】:

        message = event['Records'][0]['Sns']['Message'],您的消息是一个字符串,您需要将其转换为字典。每当你有这样的疑问时,你可以使用 print(type(variable_name))。您的 message 值可能有也可能没有那个特定的键,因此您可以使用 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}
           
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-30
          • 2021-10-03
          • 1970-01-01
          • 2021-03-24
          • 2015-09-28
          • 2021-05-25
          • 2019-07-14
          相关资源
          最近更新 更多