In this tutorial we will demonstrate how to run local aws lambda functions with the help of docker and running it locally on a container.

Dockerfile

In our Dockerfile:

FROM public.ecr.aws/lambda/python:3.8
COPY lambda_function.py ${LAMBDA_TASK_ROOT}/
COPY requirements.txt /opt/requirements.txt
RUN pip install -r /opt/requirements.txt -t ${LAMBDA_TASK_ROOT}/
CMD [ "lambda_function.handler" ]

Lambda Function

Our application code, residing in our lambda_function.py:

import json
import requests

def handler(event, context):
    body = {
        "message": "this is a message",
        "input": event
    }
    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }
    print(response)
    return response

Build and Test

Build our docker container:

$ docker build -f Dockerfile -t my-local-lambda:v1 .

Run the container from our image and expose port 8080:

$ docker run -it -p 8080:8080 my-local-lambda:v1

Invoke the function from another terminal:

$ curl -XPOST "http://localhost:8080/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
{"statusCode": 200, "body": "{\"message\": \"this is a message\", \"input\": {\"payload\": \"hello world!\"}}"}

We can also view our logs from docker stdout:

START RequestId: cc056596-e18a-4bb5-bb72-9f133a9dd397 Version: $LATEST
{'statusCode': 200, 'body': '{"message": "this is a message", "input": {"payload": "hello world!"}}'}
END RequestId: cc056596-e18a-4bb5-bb72-9f133a9dd397
REPORT RequestId: cc056596-e18a-4bb5-bb72-9f133a9dd397	Init Duration: 0.31 ms	Duration: 155.98 ms	Billed Duration: 200 ms	Memory Size: 3008 MB	Max Memory Used: 3008 MB

Resources