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']中的请求数据。
解决步骤:
- 适配两种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) } - 检查API Gateway集成设置:确保API Gateway和Lambda的集成是Lambda代理集成(默认推荐方式),这种模式下Lambda返回的
statusCode和body会被自动转换成HTTP响应。如果使用非代理集成,需要手动配置映射模板,将Lambda的返回值映射为HTTP响应格式。 - 测试时检查请求体格式:确保API Gateway测试时传入的请求体是合法JSON,没有语法错误(你提供的请求体是合法的,这一步可以跳过,但后续测试要注意)。
内容的提问来源于stack exchange,提问作者John Wick
相关产品推荐
相关产品推荐

