Serverless: AWS HTTP Gateway — 502 Bad Gateway
If you're running into 502 errors when making HTTP calls with Lambda, make sure you read the manual and are returning maps.
Join the DZone community and get the full member experience.
Join For FreeIn my continued work with serverless and AWS Lambda, I ran into a problem when trying to call an HTTP gateway.
My project looked like this:
serverless.yaml:
service: http-gateway
frameworkVersion: ">=1.2.0 <2.0.0"
provider:
name: aws
runtime: python3.6
timeout: 180
functions:
no-op:
name: NoOp
handler: handler.noop
events:
- http: POST noOp
handler.py:
def noop(event, context):
return "hello"
Let’s deploy to AWS:
$ serverless deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (179 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
..............
Serverless: Stack update finished...
Service Information
service: http-gateway
stage: dev
region: us-east-1
api keys:
None
endpoints:
POST - https://29nb5rmmd0.execute-api.us-east-1.amazonaws.com/dev/noOp
functions:
no-op: http-gateway-dev-no-op
And now we’ll try and call it using cURL:
$ curl -X POST https://29nb5rmmd0.execute-api.us-east-1.amazonaws.com/dev/noOp
{"message": "Internal server error"}
That didn’t work so well, what do the logs have to say?
$ serverless logs --function no-op
START RequestId: 64ab69b0-7d8f-11e7-9db5-13b228cd4cb6 Version: $LATEST
END RequestId: 64ab69b0-7d8f-11e7-9db5-13b228cd4cb6
REPORT RequestId: 64ab69b0-7d8f-11e7-9db5-13b228cd4cb6Duration: 0.27 msBilled Duration: 100 ms Memory Size: 1024 MBMax Memory Used: 21 MB
So the function is completely fine. It turns out I’m not very good at reading the manual and should have been returning a map instead of a string:
API Gateway expects to see a JSON map with keys “body”, “headers”, and “statusCode”.
Let’s update our handler function and re-deploy.
def noop(event, context):
return {
"body": "hello",
"headers": {},
"statusCode": 200
}
Now we’re ready to try the endpoint again:
$ curl -X POST https://29nb5rmmd0.execute-api.us-east-1.amazonaws.com/dev/noOp
hello
Much better!
Published at DZone with permission of Mark Needham, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments