如何通过CloudFormation配置API Gateway WebSocket $connect路由返回连接ID
问题根因
- 你当前配置报500错误的直接原因是MOCK集成缺少完整的响应链路配置:你只定义了集成的请求模板,没有配置
AWS::ApiGatewayV2::IntegrationResponse和AWS::ApiGatewayV2::RouteResponse资源,API Gateway无法完成响应映射,因此返回内部错误。 - 即便修复500错误,你也无法仅通过
$connect路由的MOCK集成在连接建立时收到包含connectionId的消息,这是API Gateway WebSocket的固有设计限制:$connect路由对应的是WebSocket握手阶段,该阶段返回的内容仅用于控制握手是否成功(返回200则握手成功,返回非200则握手失败),响应内容不会作为WebSocket消息帧推送给客户端。
修复500错误的CloudFormation配置补充
你需要在现有配置基础上添加以下两个资源:
# 集成响应:将MOCK集成的输出映射为可返回的响应 wsConnectIntegrationResponse: Type: AWS::ApiGatewayV2::IntegrationResponse Properties: ApiId: !Ref wsApiGateway IntegrationId: !Ref wsConnectIntegration IntegrationResponseKey: /200/ ResponseTemplates: application/json: '{"message": "Connected", "connectionId": "$context.connectionId"}' # 路由响应:允许路由将集成响应返回给调用方 wsConnectRouteResponse: Type: AWS::ApiGatewayV2::RouteResponse Properties: ApiId: !Ref wsApiGateway RouteId: !Ref wsConnectRoute RouteResponseKey: $default
部署以上配置后你不会再收到500错误,可以正常建立WebSocket连接,但还是收不到连接时的推送消息,就是上面提到的设计限制导致的。
实现连接建立时推送connectionId的可行方案
你需要将$connect路由的集成类型从MOCK换成Lambda集成,Lambda的处理逻辑如下:
- 接收$connect事件,从事件上下文里拿到
connectionId - 初始化ApiGatewayManagementApi客户端,端点为你的WebSocket API端点
- 调用
post_to_connection接口,向该connectionId发送你要的包含connectionId的消息 - 返回200状态码完成握手
这个方案不需要额外的其他路由,就能实现你要的连接建立时立刻收到connectionId的需求。
内容的提问来源于stack exchange,提问作者diegosasw
相关产品推荐
相关产品推荐

