AWS Lambda读取CloudWatch告警信息推送Teams遇JSON解析问题求助
解决Lambda读取CloudWatch告警SNS消息时无法获取AlarmName的问题
我一眼就看出问题所在了——你拿到的Sns['Message']其实是JSON格式的字符串,而不是已经解析好的Python字典!直接用字典的键访问方式去操作字符串,Python肯定会抛出TypeError: string indices must be integers的错误,因为字符串只认整数下标。
问题根源
你看你的报错信息里,尝试访问event['Records'][0]['Sns']['Message']['AlarmDescription'],但此时Message是个字符串,比如实际内容可能是这样的:
"{\"AlarmName\": \"你的告警名称\", \"AlarmDescription\": \"告警描述\", ...}"
它不是直接的字典对象,所以自然没法用键来取值。
修复方案
只需要多一步:把字符串格式的Message解析成Python字典。具体做法是导入Python内置的json模块,用json.loads()方法来完成解析。
修正后的代码示例:
import json def lambda_handler(event, context): # 先拿到SNS传递的消息字符串 message_str = event['Records'][0]['Sns']['Message'] # 将字符串解析为Python字典 message_dict = json.loads(message_str) # 现在可以正常获取告警名称和描述等字段了 alarm_name = message_dict['AlarmName'] alarm_desc = message_dict['AlarmDescription'] # 接下来就可以把这些内容推送到Microsoft Teams了 # ... 你的Teams推送逻辑代码 ...
验证小技巧
如果你不确定拿到的Message是什么类型,可以先加一行打印代码确认:
print(type(event['Records'][0]['Sns']['Message']))
执行后你会看到输出是<class 'str'>,解析之后再打印type(message_dict),就会变成<class 'dict'>,这时候就可以正常用键访问字段了。
内容的提问来源于stack exchange,提问作者Abhinay
相关产品推荐
相关产品推荐

