AWS API Gateway与Lambda代理集成调用外部API返回502错误排查
核心问题
日志里的KeyError: 'response'直接说明:你调用外部API后得到的json_response字典中不存在'response'这个键。这和本地测试时的外部API响应结构不一致,根源大概率是通过API Gateway传递的请求参数(即event['body'])和本地测试用的参数格式/内容不匹配,导致外部API返回了非预期的响应结构(比如错误信息、简化版响应)。
具体排查与修复步骤
第一步:确认外部API的实际响应
在Lambda代码中添加打印语句,把外部API的完整响应输出到CloudWatch日志:# 调用外部API后,打印完整响应内容 print("外部API响应详情:", json_response)通过API Gateway发起请求后,去CloudWatch日志里查看实际响应结构,确认是否真的没有
response字段,以及外部API返回的具体内容。第二步:正确解析API Gateway的请求体
API Gateway传递给Lambda的event['body']是JSON字符串格式,如果直接把这个字符串传给外部API,外部API可能无法正确解析参数,进而返回错误响应。你需要先将其解析为字典:import json def lambda_handler(event, context): # 解析API Gateway传来的body字符串为字典 request_body = json.loads(event['body']) # 用解析后的字典调用外部API json_response = call_external_api(request_body) # 后续处理逻辑...第三步:确保Lambda返回符合代理集成要求的响应格式
API Gateway的Lambda代理集成要求返回固定格式的响应,哪怕外部API出错,也不能抛出未处理的异常,否则会触发502错误。正确的响应格式必须包含statusCode、headers和body:return { 'statusCode': 200, # 根据实际业务场景修改状态码 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' # 有跨域需求时添加 }, 'body': json.dumps(json_obj) # body必须是JSON字符串格式 }第四步:添加异常处理,避免未捕获错误
针对外部API响应不符合预期的情况,添加异常捕获逻辑,返回明确的错误响应,防止Lambda崩溃导致502:try: json_obj = json_response['response'] except KeyError: return { 'statusCode': 400, 'headers': {'Content-Type': 'application/json'}, 'body': json.dumps({'error': '外部API响应格式异常,未找到预期的response字段'}) }
内容的提问来源于stack exchange,提问作者Dani-Bholenath

