KeyError: 'Host' - 如何在AWS Lambda中获取请求的JSON body数据
问题原因
- 当Lambda通过API Gateway触发时,客户端提交的POST请求体不会直接挂载到
event对象的根节点,而是会被封装为字符串类型存储在event['body']字段中,你直接从event中取Host字段自然不存在,触发KeyError。 - 你提供的CloudWatch日志也验证了这个逻辑:请求数据里
body才是存储你提交的JSON的字段,且是序列化后的字符串格式,必须先反序列化才能读取内部字段。
解决方法
修改AlertMetricSender.py代码,先读取body字段并反序列化为Python字典,再提取对应字段即可,修正后的代码如下:
from modules.ZabbixSender import ZabbixSender import json def lambda_handler(event, context): # 读取body字段并反序列化为字典 request_body = json.loads(event['body']) Host = request_body['Host'] Key = request_body['Key'] Value = request_body['Value'] sender = ZabbixSender("10.10.10.10", 10051) sender.add(Host, Key, Value) sender.send()
可选兼容优化
如果你需要同时兼容直接触发Lambda(不是从API Gateway触发,无body字段)的测试场景,可以加一层判断:
from modules.ZabbixSender import ZabbixSender import json def lambda_handler(event, context): # 优先从body取数据,没有就直接从event取 if 'body' in event and event['body']: request_body = json.loads(event['body']) else: request_body = event Host = request_body['Host'] Key = request_body['Key'] Value = request_body['Value'] sender = ZabbixSender("10.10.10.10", 10051) sender.add(Host, Key, Value) sender.send()
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

