AWS Lambda调用外部API返回正确信息却报执行失败问题排查
嘿,从你描述的情况来看,API确实返回了预期的提示'Not latest version of file, update not performed',但Lambda却报错执行失败——看错误信息里的响应是被双重转义的字符串,这基本可以确定是Lambda函数处理API响应的逻辑出了问题,和API本身无关。下面是具体的排查方向和解决办法:
1. 检查响应处理代码是否重复序列化
最常见的坑就是:你把API返回的响应(已经是可直接使用的内容)又做了一次JSON序列化,导致字符串被转义。举个Python的例子,比如你不小心写了这样的代码:
import requests import json def lambda_handler(event, context): api_url = "https://serverName/api/SyncPersonnelViaAwsApi/SapEaiCall" # 假设已完成XML转JSON的payload payload = {"your": "converted_data"} response = requests.post(api_url, json=payload) # 错误操作:把响应文本再序列化一次 return json.dumps({"response": response.text})
原本response.text是正常的提示字符串,经过json.dumps处理后,就变成了带转义的"{'response' : 'Not latest version of file, update not performed'}",而Lambda要求返回的是JSON对象,不是转义后的字符串,所以直接判定执行失败。
正确的做法是直接返回字典(或合法的JSON对象):
def lambda_handler(event, context): # 请求逻辑不变 response = requests.post(api_url, json=payload) # 正确方式1:直接返回字典 return {"response": response.text} # 如果API返回的是JSON格式响应,先解析再返回 # return {"response": response.json()}
2. 确认Lambda的返回格式要求
AWS Lambda对返回值有明确要求:必须是可序列化为JSON的对象(比如Python的dict、Node.js的object)。如果返回的是纯字符串,Lambda会正常处理,但要是你把字符串包装成了转义后的JSON字符串,就会触发格式错误,导致执行失败。
3. 核对API响应的内容类型
虽然API返回了正确提示,但要确认它的Content-Type:
- 如果是
text/plain(纯文本),直接把文本内容放到返回字典里就行,不用额外处理; - 如果是
application/json,记得用对应语言的方法解析(比如Python的response.json(),Node.js的await response.json()),再返回解析后的对象。
4. 查看CloudWatch的详细错误栈
去CloudWatch日志里找更完整的错误信息,比如有没有抛出JSONSerializationError这类异常,这能帮你精准定位是哪一步的序列化出了问题。比如在Python中,如果返回的对象无法被JSON序列化,Lambda会直接抛出异常,导致执行失败。
总的来说,核心问题就是响应内容被重复序列化,返回了不符合Lambda要求的格式,调整代码里的响应处理逻辑,确保返回的是合法的JSON对象而不是转义后的字符串,应该就能解决这个问题。
内容的提问来源于stack exchange,提问作者John

