DEV Community

loading...
Cover image for Deploy Python Lambda Functions With Container Image

Deploy Python Lambda Functions With Container Image

vumdao profile image Vu Dao ・Updated on ・4 min read

Deploy Python Lambda functions with container images

You can deploy your Lambda function code as a container image. AWS provides the following resources to help you build a container image for your Python function:

  • AWS base images for Lambda

    • These base images are preloaded with a language runtime and other components that are required to run the image on Lambda. AWS provides a Dockerfile for each of the base images to help with building your container image.
  • Open-source runtime interface clients

    • If you use a community or private enterprise base image, add a runtime interface client to the base image to make it compatible with Lambda.

What’s In This Document

πŸš€ Create Docker image container

Create an image from AWS base image

Dockerfile.aws

FROM amazon/aws-lambda-python:3.8

COPY app.py ./

CMD ["app.handler"]
Enter fullscreen mode Exit fullscreen mode

πŸš€ Create app.py as lambda handler

import sys


def handler(event, context):
    return 'Hello from AWS Lambda using Python' + sys.version + '!'
Enter fullscreen mode Exit fullscreen mode

πŸš€ Build and push the image to ECR

aws ecr get-login-password --region ap-southeast-1 | docker login --username AWS --password-stdin 111111111111.dkr.ecr.ap-southeast-1.amazonaws.com
docker build -t pythonlambda .
docker tag pythonlambda:latest 111111111111.dkr.ecr.ap-southeast-1.amazonaws.com/pythonlambda:latest
docker push 111111111111.dkr.ecr.ap-southeast-1.amazonaws.com/pythonlambda:latest
Enter fullscreen mode Exit fullscreen mode

πŸš€ Create Lambda container image

Alt Text

πŸš€ Test the lambda function

1. Invoke lambda function

  • Start container
docker rm -f lambdaimagetest
docker run -d --name lambdaimagetest -it pythonlambda:latest bash
docker exec -it lambdaimagetest bash
Enter fullscreen mode Exit fullscreen mode
  • Invoke lambda function
⚑ $ aws lambda invoke --function-name python-lambda-image --region ap-southeast-1 outfile                                                                                                                          
{
    "StatusCode": 200,
    "ExecutedVersion": $LATEST"
}
⚑ $ cat outfile                                                                                                                                                                                                    
"Hello from AWS Lambda using Python3.8.5 (default, Aug  5 2020, 08:22:02) \n[GCC 8.3.0]!"
Enter fullscreen mode Exit fullscreen mode

2. Call lambda API from local container

  • This should be performed from AWS image base
  • Run container
⚑ $ docker run -d --name testapi -p 9000:8080 pythonlambda:latest
Enter fullscreen mode Exit fullscreen mode
  • Call API
⚑ $ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
"Hello from AWS Lambda using Python3.8.6 (default, Dec 16 2020, 01:05:15) \n[GCC 7.3.1 20180712 (Red Hat 7.3.1-11)]!"
Enter fullscreen mode Exit fullscreen mode
  • Deploy new image Alt Text
  • Invoke lambda function
⚑ $ aws lambda invoke --function-name python-lambda-image --region ap-southeast-1 outfile                                                                                                                          
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
⚑ $ cat outfile
"Hello from AWS Lambda using Python3.8.6 (default, Dec 16 2020, 01:05:15) \n[GCC 7.3.1 20180712 (Red Hat 7.3.1-11)]!"
Enter fullscreen mode Exit fullscreen mode

Mirror:

Read More

🌠 Blog · Web · Linkedin · Group · Page · Twitter 🌠

Discussion (2)

pic
Editor guide
Collapse
jason_yuen_5481b9088043d7 profile image
Jason Yuen

I am trying to follow step 1 but getting this os.environ error. Any help would be greatly appreciated.

File "/usr/local/lib/python3.8/runpy.py", line 194, in run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/local/lib/python3.8/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/usr/local/lib/python3.8/site-packages/awslambdaric/
main.py", line 21, in
main(sys.argv)
File "/usr/local/lib/python3.8/site-packages/awslambdaric/
main.py", line 14, in main
lambda_runtime_api_addr = os.environ["AWS_LAMBDA_RUNTIME_API"]
File "/usr/local/lib/python3.8/os.py", line 675, in __getitem
_
raise KeyError(key) from None
KeyError: 'AWS_LAMBDA_RUNTIME_API'

Collapse
vumdao profile image
Vu Dao Author

Hi Jason,

I guess you're trying to build lambda image from alternative base image but I recommend to use image base from AWS such as public.ecr.aws/lambda/python:3.8 or amazon/aws-lambda-python:3.8

For your issue, you're missing setting ENV AWS_LAMBDA_RUNTIME_API=, this variable env must be defined but you will still get following error after that

  File "/function/awslambdaric/lambda_runtime_client.py", line 76, in wait_next_invocation
    response_body, headers = runtime_client.next()
RuntimeError: Failed to get next
Enter fullscreen mode Exit fullscreen mode