部署在AWS的Websocket API调用现有路由无返回结果问题咨询
问题排查与解决方案
1. 核心问题原因
你当前使用的Lambda返回格式是HTTP API Lambda代理集成的标准返回格式,该格式不适用于Websocket API的消息回传逻辑:
Websocket API的业务路由默认不会把Lambda的返回值自动转发给客户端,只有错误场景下API Gateway的内置错误响应会直接返回,这就是你调用未配置的test路由能收到报错、调用配置好的sendMessage路由无返回的原因。
2. 正确实现方案
要实现路由调用后返回自定义消息给客户端,有两种可行配置方式,根据你的集成类型选择:
方案1:使用Lambda非代理集成
如果你当前用的是非代理集成,只需要在对应路由的集成响应配置中新增映射模板:
- 选择响应状态码为200
- 新增
application/json类型的模板,模板内容设置为$input.path('$.body')即可把Lambda返回的body内容直接转发给客户端。
方案2:使用Lambda代理集成(更常用)
如果是代理集成模式,需要你在Lambda代码中主动调用API Gateway的PostToConnection接口推送消息,示例代码如下:
import json import boto3 import os # 初始化apigatewaymanagementapi客户端,替换为你的API对应的参数 apigw_management = boto3.client( 'apigatewaymanagementapi', endpoint_url=f"https://{os.environ['API_ID']}.execute-api.{os.environ['REGION']}.amazonaws.com/{os.environ['STAGE']}" ) def lambda_handler(event, context): print(event) connection_id = event['requestContext']['connectionId'] # 自定义要返回的消息,可替换为数据库查询结果 response_msg = json.dumps({ "status": "success", "data": event }) # 主动推送消息给客户端 apigw_management.post_to_connection( ConnectionId=connection_id, Data=response_msg ) return { "statusCode": 200 }
额外配置注意事项:
- 需要给Lambda执行角色添加
execute-api:ManageConnections权限,允许调用PostToConnection接口 - 配置环境变量
API_ID、REGION、STAGE为你自己的Websocket API对应参数
3. $connect、$disconnect路由特殊说明
$connect路由可以用上述相同的逻辑推送连接成功通知给客户端$disconnect触发时客户端连接已经进入断开流程,此时调用PostToConnection大概率会失败,不建议在该路由中尝试推送消息
内容的提问来源于stack exchange,提问作者Tom3652
相关产品推荐
相关产品推荐

