DEV Community

Cover image for Deploy Python Lambda Functions With Container Image
πŸš€  Vu Dao πŸš€
πŸš€ Vu Dao πŸš€

Posted on • Updated on

Deploy Python Lambda Functions With Container Image

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)

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