AWS API Gateway问题:Lambda可读取嵌套事件变量,网关中无法读取
解决API Gateway调用Lambda返回异常的问题
问题核心
你遇到的问题是Lambda Proxy集成模式下,API Gateway传递给Lambda的事件格式和本地测试的自定义事件不匹配:
- 本地测试用的是自定义结构
{"params": {...}},代码直接读取event["params"]正常。 - 开启
Use Lambda Proxy integration后,API Gateway会把请求封装成标准Proxy事件,你的请求体实际存放在event["body"]字段(字符串格式),直接取event["params"]会触发KeyError。
两种解决方案
方案1:关闭Lambda Proxy集成,使用映射模板
适合想保留现有Lambda代码的场景:
- 进入API Gateway的POST方法配置,取消勾选
Use Lambda Proxy integration。 - 切换到Integration Request标签,找到Mapping Templates:
- 添加
application/json的模板类型,勾选When there are no templates defined (recommended)。 - 输入映射模板内容:
$input.json('$'),这个模板会把请求的JSON原封不动传递给Lambda。
- 添加
- 部署API后,用原请求体调用即可,现有代码无需修改。
方案2:修改Lambda代码适配Proxy集成格式
适合需要利用Proxy集成特性(获取请求头、路径参数等)的场景:
修改代码解析Proxy事件的请求体,并返回符合要求的响应格式:
import json def lambda_handler(event, context): # 解析Proxy事件中的请求体字符串 request_body = json.loads(event["body"]) # 读取color参数 color_name = request_body["params"].get("color") # 这里写你的业务处理逻辑 processed_result = f"处理完成:颜色为{color_name}" # 返回符合API Gateway Proxy要求的响应结构 return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": json.dumps({"result": processed_result}) }
注意:Proxy集成要求Lambda返回包含
statusCode、headers、body的字典,body必须是字符串格式,所以需要用json.dumps()序列化返回内容。
测试验证
- 方案1:直接发送原请求体
{"params": {"color": "Red (Crimson)"}},API会返回Lambda处理后的结果。 - 方案2:确保请求的
Content-Type设为application/json,发送相同请求体,即可得到正确响应。
内容的提问来源于stack exchange,提问作者Drummermean
相关产品推荐
相关产品推荐

