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

AWS Python Lambda函数报错及API Gateway测试问题求助

问题1:UnboundLocalError: local variable 'event_body' referenced before assignment

这个错误的核心原因是变量event_body仅在部分代码分支中被赋值,存在代码路径未对其初始化就直接引用的情况。比如常见的错误写法:

def lambda_handler(event, context):
    if 'body' in event:
        event_body = json.loads(event['body'])
    # 直接引用event_body,未考虑if条件不成立的情况
    data = event_body['data']

解决办法:

  • 提前给event_body设置默认值,确保所有代码路径下变量都已初始化:
    def lambda_handler(event, context):
        event_body = {}  # 初始化默认值
        if 'body' in event:
            event_body = json.loads(event['body'])
        else:
            event_body = event  # 适配直接Lambda测试的event格式
        data = event_body['data']
        # 后续业务逻辑...
    
  • 或者通过条件判断确保引用变量前已完成赋值,比如增加else分支处理所有可能的情况。

问题2:API Gateway测试返回完整event对象而非预期结果

当通过API Gateway调用Lambda时,传入的event格式和直接在Lambda控制台测试的格式完全不同:

  • 直接Lambda测试:event是你传入的原始JSON(包含data字段)
  • API Gateway调用:event是包含body、httpMethod等元数据的结构,请求体以字符串形式存放在event['body']中

你的Lambda函数能在直接测试时正常返回结果,但API Gateway调用时返回完整event,大概率是函数未适配API Gateway的event格式,导致逻辑出错后直接返回了event对象,或者未正确解析event['body']中的请求数据。

解决步骤:

  1. 适配两种event格式:在函数中加入判断,区分直接测试和API Gateway调用的场景,正确解析请求数据:
    import json
    
    def lambda_handler(event, context):
        # 解析请求数据
        if 'body' in event:
            # API Gateway调用:解析body字符串为JSON
            try:
                request_data = json.loads(event['body'])
            except json.JSONDecodeError:
                return {
                    "statusCode": 400,
                    "body": json.dumps({"error": "Invalid request body"})
                }
        else:
            # 直接Lambda测试:使用原始event
            request_data = event
    
        # 业务逻辑处理(示例)
        input_data = request_data['data']
        result = {"data": [[input_data[0][0], [82.920013]]]}
    
        # 返回符合API Gateway要求的格式
        return {
            "statusCode": 200,
            "body": json.dumps(result)
        }
    
  2. 检查API Gateway集成设置:确保API Gateway和Lambda的集成是Lambda代理集成(默认推荐方式),这种模式下Lambda返回的statusCode和body会被自动转换成HTTP响应。如果使用非代理集成,需要手动配置映射模板,将Lambda的返回值映射为HTTP响应格式。
  3. 测试时检查请求体格式:确保API Gateway测试时传入的请求体是合法JSON,没有语法错误(你提供的请求体是合法的,这一步可以跳过,但后续测试要注意)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:45:00