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

本地Python脚本传JSON至Lambda遇内部错误,求API Gateway配置方法

解决API Gateway接收JSON请求并转发到Lambda的奇偶判断问题

看起来你已经搞定了核心的Lambda逻辑,卡在了API Gateway的配置上——这很常见,毕竟API Gateway和Lambda的交互细节容易踩坑。我来一步步帮你把配置捋顺,解决那个内部服务器错误。

两种配置方案:Lambda代理集成(推荐新手)

这种方式最省心,API Gateway会把整个请求原封不动传给Lambda,你只需要在Lambda里解析请求体就行。

步骤1:配置API Gateway的POST方法

  1. 登录AWS控制台,打开API Gateway,找到你创建的API(如果没创建就先新建一个REST API)。
  2. 在资源树里选中根资源(/),点击创建方法,选择POST,点击勾号确认。
  3. 集成类型选择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方法(不启用代理集成)

  1. 创建POST方法时,集成类型选Lambda函数,不要勾选代理集成,选择你的Lambda函数。
  2. 进入方法请求,在请求体中添加application/json,确保它被标记为允许。

步骤2:配置映射模板

  1. 进入集成请求,找到映射模板部分,点击添加映射模板。
  2. 内容类型输入application/json,点击勾号,然后选择生成模板(或者直接手动输入)。
  3. 输入以下映射模板,它会把请求体里的inputNum提取出来,传给Lambda:
{
  "inputNum": $input.json('$.inputNum')
}
  1. 保存配置。

步骤3:部署API并测试

同样要部署API,然后用之前的本地脚本测试,这时你的原有Lambda代码不需要修改就能正常工作。


排查内部错误的关键技巧

如果还是出现500错误,去CloudWatch看Lambda的执行日志:

  1. 打开Lambda控制台,找到你的函数,点击监控标签,然后点击查看CloudWatch日志。
  2. 查看最近的日志条目,通常能找到具体的错误原因(比如KeyError: 'inputNum',说明Lambda没拿到正确的参数)。

常见坑点:

  • 忘记部署API Gateway的配置变更
  • 本地请求用data=payload而不是json=payload,导致请求体不是JSON格式
  • 映射模板写错了(比如语法错误,或者路径不对)

内容的提问来源于stack exchange,提问作者zdavidmm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:07:09