roeland
roeland

Reputation: 6336

AWS Lambda in Go behing API Gateway: custom error message

I'm trying to handle an error in a Lambda function written in Go.
The Lambda is triggered by API Gateway.
When I respond with a 200, I get the correct response.
But when I respond with a 500 code, I always receive {"message": "Internal server error"}

Here is part of the code:

func newErrReponse(message string) (events.APIGatewayProxyResponse, error) {
    return events.APIGatewayProxyResponse{
        Body:       message,
        StatusCode: 500,
    }, errors.New(message)
}

func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    return newErrReponse("some error")
}

func main() {
    lambda.Start(handleRequest)
}

I was expecting "some error", but I always get the internal server error. I tried JSON in the body but that didn't help. The integration request is of type LAMBDA_PROXY. That was the default.

How can I control the error response?

Upvotes: 5

Views: 4264

Answers (1)

roeland
roeland

Reputation: 6336

The lambda handler can return 2 values. interface{} and error:
https://godoc.org/github.com/aws/aws-lambda-go/lambda

Because I use API Gateway, The interface is of type APIGatewayProxyResponse:
https://godoc.org/github.com/aws/aws-lambda-go/events#APIGatewayProxyResponse

If the Lambda succeeds, the API Gateway will return the values from APIGatewayProxyResponse.

But if the Lambda don't succeeds, then you will get an internal server error.

If you return an error other then nil, then the Lambda failed.

When there is a panic() or os.Exit() then the Lambda also failed. This means a log.Fatal also fails a Lambda.

Here is more information about errors:
https://docs.aws.amazon.com/lambda/latest/dg/go-programming-model-errors.html

Lambda logs a panic (and other output) in CloudWatch

Upvotes: 7

Related Questions