【问题标题】:error: Unexpected server response: 502 on trying to connect to a lambda function through Amazon API gateway Websocket API错误:意外的服务器响应:尝试通过 Amazon API 网关 Websocket API 连接到 lambda 函数时出现 502
【发布时间】:2019-12-17 17:01:03
【问题描述】:

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

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

我通过他们的API Gateway console 创建了一个WebSocket API,并通过LAMBDA_PROXY 集成与其集成:

当我尝试使用wscat 连接到它时,我收到一个错误:

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

我该如何解决?

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


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

【问题讨论】:

    标签: amazon-web-services websocket aws-lambda aws-api-gateway


    【解决方案1】:

    我在this answer 上找到了根本原因。基本上,使用 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*/
        };
    };
    

    深入研究文档,位于Output Format of a Lambda Function for Proxy Integration 部分:

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

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

    [...]

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

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


    回答问题:

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

    Set up API Logging Using the API Gateway Console

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

    Execution failed due to configuration error: Malformed Lambda proxy response

    【讨论】:

    • 我遇到了同样的问题并找到了同样的解决方案(甚至是奖金问题:D)但是,我无法获得 $connect 响应客户端?你如何检索你的味精?
    • 您是否使用wscat 作为客户端工具?此链接描述了如何使用它来连接到 WS API。
    • 是的,我也使用 wscat;实际上我发现了我的问题:我的 IAM 角色缺少 executeApi 权限。还是谢谢!
    • 我也被这个刺痛了,因为我的 $connect lambda 返回 void 而不是 {statusCode:200},所以我的逻辑在服务器端运行,但在客户端,我会得到一个“无法连接”错误。很好的发现!
    【解决方案2】:

    正如你上面所说的,你必须对你的 websocket 的所有消息进行字符串化以发送回你的客户。

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

    callback(null, {
        statusCode: 200,
    });
    

    【讨论】:

    • 这对我有用。正如 Pablo 提到的,确保使用回调而不是返回。
    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2020-03-08
    • 2018-06-15
    • 2017-08-27
    • 2021-03-01
    • 2020-09-26
    相关资源
    最近更新 更多