AWS Lambda Python对接AWS Lex的正确输出格式咨询及报错排查求助
解决AWS Lambda与Lex对接的Invalid Response问题
看起来你遇到的核心问题可能有两个:API请求失败导致Lambda抛出未处理异常,以及Lex版本与响应格式不匹配。我们一步步来排查:
1. 先排查Lambda函数的运行错误(最可能的原因)
你看到的Invalid Lambda Response: Unhandled通常意味着Lambda函数在执行时抛出了异常,没有返回有效的JSON响应。你需要查看CloudWatch日志来确认具体错误:
- 打开AWS控制台,进入Lambda服务,找到你的函数,切换到「监控」标签,点击「查看日志中的CloudWatch」。
- 查看最近的执行日志,大概率会发现类似
KeyError: 'main'的错误,这是因为你的OpenWeatherMap API请求有问题:
你的API URL拼接错误,正确的格式应该包含&appid=前缀,比如:
你当前的代码里直接把api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid=YOUR_TOKEN"TOKEN拼在城市名后面,导致API返回的是错误信息(比如401未授权或者404城市不存在),而不是天气数据,所以json_data['main']就会抛出KeyError,让Lambda崩溃,无法返回预期的JSON给Lex。
另外,建议你给API请求加上异常处理,避免因为网络问题、城市名错误等导致函数崩溃:
try: json_data = requests.get(api).json() if 'main' not in json_data: # 处理API返回错误的情况,比如城市不存在 answer = f"Sorry, I couldn't find weather data for {city}." else: temp = int(json_data['main']['temp'] - 273.15) answer = f"Weather in {city} is {temp}°C" except Exception as e: # 捕获所有异常,返回友好提示 answer = "Oops, something went wrong while fetching weather data. Please try again later."
2. 匹配Lex Bot的版本选择正确的响应格式
Lex有V1和V2两个版本,它们的响应格式完全不兼容,你需要确认你的Bot是哪个版本,然后使用对应的格式:
如果是Lex V1
响应需要以dialogAction为核心,正确的Close类型响应格式如下:
message = { "sessionAttributes": {}, # 可选,用于存储会话数据 "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": answer } } }
注意:type设为Close表示结束会话,ConfirmIntent是用于确认用户意图的场景,不适合直接返回结果的情况。
如果是Lex V2
响应必须包含sessionState和messages字段,并且intent里需要包含name和slots(即使槽位已经填充),正确格式如下:
message = { "sessionState": { "dialogAction": { "type": "Close" }, "intent": { "name": "FindingWeather", # 必须和你的Lex意图名称完全一致 "slots": { "City": city # 把槽位值返回,可选但推荐 }, "state": "Fulfilled" } }, "messages": [ { "contentType": "PlainText", "content": answer } ] }
你之前的Variant3缺少了slots字段,这可能导致Lex无法识别响应。
3. 额外检查项
- 确认Lambda函数的执行角色有足够的权限:比如允许访问CloudWatch Logs(用于排查错误),以及允许出站请求到OpenWeatherMap的API(如果你的Lambda在VPC里,需要配置NAT网关)。
- 测试Lambda函数:在Lambda控制台的「测试」标签里,模拟Lex发送的事件(可以从Lex的测试控制台复制请求格式),直接运行函数,查看返回的JSON是否符合预期,同时检查日志是否有异常。
按照以上步骤排查,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者jarrett.rus26
相关产品推荐
相关产品推荐

