Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error: Unexpected server response: 502 on trying to connect to a lambda function through Amazon API gateway Websocket API

I have a simple Node.js 10.x Lambda function that works fine when tested on the Lambda function console:

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

I created a WebSocket API through their API Gateway console, that integrates to it through a LAMBDA_PROXY integration:

Websocket API on Amazon API Gateway web console

When I try to connect to it using wscat, I get an error:

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

How can I fix it?

Bonus question: how can we find the logs for the Websocket API connection errors?


Related links that didn't help me to fix it:

  • 502 internal server error response from API gateway from lambda function
  • AWS - Using @connections websocket call back url to send response from back-end(one-way) - API Gateway websocket protocol
  • AWS API Gateway error response generates 502 "Bad Gateway"
like image 976
Ricardo Avatar asked Aug 10 '19 02:08

Ricardo


1 Answers

I found the root cause on this answer. Basically, when using a Lambda Proxy Integration, the Lambda function response body value needs to be a string. We need to use JSON.stringify() or something similar:

exports.handler = async (event) => {
    var msg = 'connected';
    return { 
        statusCode: 200, 
        body: JSON.stringify({ msg: msg}) /*required on lambda proxy integration*/
    };
};

Digging into the docs, on the section Output Format of a Lambda Function for Proxy Integration:

In Lambda proxy integration, API Gateway requires the backend Lambda function to return output according to the following JSON format

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

[...]

The output body is marshalled to the frontend as the method response payload [...]

If the function output is of a different format, API Gateway returns a 502 Bad Gateway error response.


Answer to the bonus question:

After adding a new IAM Role AmazonAPIGatewayPushToCloudWatchLogs, getting its ARN on its summary page, we can follow these steps:

Set up API Logging Using the API Gateway Console

And see that the log message on the server is more descriptive:

Execution failed due to configuration error: Malformed Lambda proxy response

like image 161
Ricardo Avatar answered Sep 18 '22 16:09

Ricardo