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

Ric*_*rdo 8 amazon-web-services websocket aws-lambda aws-api-gateway

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

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

我通过他们的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
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

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


没有帮助我修复它的相关链接:

Ric*_*rdo 17

我找到了这个答案的根本原因。基本上,当使用 Lambda 代理集成时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*/
    };
};
Run Code Online (Sandbox Code Playgroud)

深入研究文档,在用于代理集成的 Lambda 函数的输出格式部分:

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

    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..." } 
Run Code Online (Sandbox Code Playgroud)

[...]

输出主体作为方法响应有效负载编组到前端 [...]

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


回答奖金问题:

添加新的IAM角色并AmazonAPIGatewayPushToCloudWatchLogs在其摘要页面上获取其 ARN 后,我们可以按照以下步骤操作:

使用 API Gateway 控制台设置 API 日志记录

并看到服务器上的日志消息更具描述性:

Execution failed due to configuration error: Malformed Lambda proxy response


Pab*_*pes 5

正如您上面所说,您必须对 Websocket 的所有消息进行字符串化才能发送回您的客户。

除此之外,在 websocket connect 方法上你不能return,因为你需要保持连接打开才能接收消息。您应该像这样调用在connect 方法上收到的回调

callback(null, {
    statusCode: 200,
});
Run Code Online (Sandbox Code Playgroud)