错误:尝试通过Amazon API网关Websocket API连接到lambda函数时,出现意外的服务器响应:502。

11

我有一个简单的Node.js 10.xLambda函数,在Lambda函数控制台上测试时正常工作:

exports.handler = async (event) => {
    var msg = 'connected';
    return { 
        statusCode: 200, 
        body: { msg: msg}
    };
};

我通过API Gateway控制台创建了一个WebSocket API,并通过LAMBDA_PROXY集成将其集成到其中:

Amazon API Gateway Web控制台上的Websocket API

当我尝试使用wscat连接时,会出现错误:

wscat -c "wss://awesomeid1.execute-api.us-west-2.amazonaws.com/dev"
error: Unexpected server response: 502

我该怎么修复它?

奖励问题:我们如何找到Websocket API连接错误的日志?


相关链接并没有帮助我解决它:

2个回答

25

我在这个答案中找到了根本原因。基本上,在使用Lambda Proxy集成时,Lambda函数响应的body值需要是一个string。我们需要使用JSON.stringify()或类似的方法:

exports.handler = async (event) => {
    var msg = 'connected';
    return { 
        statusCode: 200, 
        body: JSON.stringify({ msg: msg}) /*required on lambda proxy integration*/
    };
};
在研究文档时,关注Lambda函数代理集成的章节 Lambda函数代理集成的输出格式

在Lambda函数代理集成中,API Gateway要求后端Lambda函数按照以下JSON格式返回输出

    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..." } 

将输出主体序列化为方法响应负载,并作为前端数据返回。

如果函数的输出格式不同,API Gateway 将返回 502 错误

回答奖励问题:

添加新的 IAM 角色AmazonAPIGatewayPushToCloudWatchLogs,获取其 ARN(资源名称)并进行以下步骤:使用 API Gateway 控制台设置 API 日志记录。在服务器上查看日志消息会更加详细,显示:Execution failed due to configuration error: Malformed Lambda proxy response


我遇到了相同的问题,并找到了相同的解决方案(甚至包括奖励问题:D),但是我无法在客户端获取$connect响应?你如何检索你的消息? - Chris
你是否正在使用wscat作为客户端工具?该链接描述了如何使用它连接到WS API。 - Ricardo
是的,我也使用wscat;实际上我已经找到了我的问题:我的IAM角色缺少执行API权限。无论如何,还是谢谢! - Chris
我也遇到了这个问题,因为我的 $connect lambda 返回了 void 而不是 {statusCode:200},所以我的逻辑在服务器端运行,但在客户端上,我会得到一个“无法连接”的错误。很好的发现! - divillysausages

5
如您所述,您需要将WebSocket的所有消息转换为字符串,然后发送回客户端。
除此之外,在WebSocket连接方法中,您不能使用return,因为您需要保持连接以接收消息。您应该像这样调用您在connect method中收到的回调函数。
callback(null, {
    statusCode: 200,
});

这是对我有效的方法。正如Pablo所提到的,确保使用回调函数而不是返回(return)。 - developing2020
这对我也是解决方案。在我的情况下,没有要求在$connect上返回任何消息。 - Valera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接