You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:37:56