本地Python脚本传JSON至Lambda遇内部错误,求API Gateway配置方法
解决API Gateway接收JSON请求并转发到Lambda的奇偶判断问题
看起来你已经搞定了核心的Lambda逻辑,卡在了API Gateway的配置上——这很常见,毕竟API Gateway和Lambda的交互细节容易踩坑。我来一步步帮你把配置捋顺,解决那个内部服务器错误。
两种配置方案:Lambda代理集成(推荐新手)
这种方式最省心,API Gateway会把整个请求原封不动传给Lambda,你只需要在Lambda里解析请求体就行。
步骤1:配置API Gateway的POST方法
- 登录AWS控制台,打开API Gateway,找到你创建的API(如果没创建就先新建一个REST API)。
- 在资源树里选中根资源(
/),点击创建方法,选择POST,点击勾号确认。 - 集成类型选择Lambda函数,勾选使用Lambda代理集成,然后选择你已经写好的Lambda函数,点击保存,确认权限提示。
步骤2:调整Lambda代码适配代理集成
API Gateway通过代理集成传给Lambda的事件结构不是直接的{'inputNum':8},而是包含body、headers等字段的对象,比如:
{ "body": "{\"inputNum\":8}", "requestContext": {...}, "headers": {...} }
所以你需要先解析body里的JSON内容。修改你的Lambda代码如下:
import json def lambda_handler(event, context): try: # 解析请求体的JSON字符串 request_body = json.loads(event['body']) input_num = request_body['inputNum'] # 奇偶判断逻辑(你的原有逻辑) result = "偶数" if input_num % 2 == 0 else "奇数" # 返回符合API Gateway要求的响应格式 return { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": json.dumps({"result": result}) } except KeyError: return { "statusCode": 400, "headers": {"Content-Type": "application/json"}, "body": json.dumps({"error": "缺少inputNum参数"}) } except ValueError: return { "statusCode": 400, "headers": {"Content-Type": "application/json"}, "body": json.dumps({"error": "inputNum必须是数字"}) } except Exception as e: return { "statusCode": 500, "headers": {"Content-Type": "application/json"}, "body": json.dumps({"error": str(e)}) }
步骤3:部署API Gateway
这一步绝对不能忘!配置完后,点击API Gateway控制台顶部的部署API,选择一个阶段(比如prod),点击部署。只有部署后,你的配置才会生效。
步骤4:测试本地Python脚本
用requests发送请求时,记得用json参数自动序列化JSON,而不是data参数:
import requests api_url = "https://你的API_ID.execute-api.区域.amazonaws.com/prod" # 替换成你的API部署URL payload = {"inputNum": 8} response = requests.post(api_url, json=payload) print(response.json())
备选方案:使用映射模板(不修改Lambda代码)
如果你不想改Lambda代码,希望API Gateway直接把{'inputNum':8}传给Lambda,可以用映射模板来转换请求格式:
步骤1:配置POST方法(不启用代理集成)
- 创建POST方法时,集成类型选Lambda函数,不要勾选代理集成,选择你的Lambda函数。
- 进入方法请求,在请求体中添加
application/json,确保它被标记为允许。
步骤2:配置映射模板
- 进入集成请求,找到映射模板部分,点击添加映射模板。
- 内容类型输入
application/json,点击勾号,然后选择生成模板(或者直接手动输入)。 - 输入以下映射模板,它会把请求体里的
inputNum提取出来,传给Lambda:
{ "inputNum": $input.json('$.inputNum') }
- 保存配置。
步骤3:部署API并测试
同样要部署API,然后用之前的本地脚本测试,这时你的原有Lambda代码不需要修改就能正常工作。
排查内部错误的关键技巧
如果还是出现500错误,去CloudWatch看Lambda的执行日志:
- 打开Lambda控制台,找到你的函数,点击监控标签,然后点击查看CloudWatch日志。
- 查看最近的日志条目,通常能找到具体的错误原因(比如
KeyError: 'inputNum',说明Lambda没拿到正确的参数)。
常见坑点:
- 忘记部署API Gateway的配置变更
- 本地请求用
data=payload而不是json=payload,导致请求体不是JSON格式 - 映射模板写错了(比如语法错误,或者路径不对)
内容的提问来源于stack exchange,提问作者zdavidmm
相关产品推荐
相关产品推荐

