Package: awslambdaric
AWS Lambda Python Runtime Interface ClientWe have open-sourced a set of software packages, Runtime Interface Clients (RIC), that implement the LambdaRuntime API, allowing you to seamlessly extend your preferred
base images to be Lambda compatible.
The Lambda Runtime Interface Client is a lightweight interface that allows your runtime to receive requests from and send requests to the Lambda service.The Lambda Python Runtime Interface Client is vended throughpip.
You can include this package in your preferred base image to make that base image Lambda compatible.RequirementsThe Python Runtime Interface Client package currently supports Python versions:3.7.x up to and including 3.12.xUsageCreating a Docker Image for Lambda with the Runtime Interface ClientFirst step is to choose the base image to be used. The supported Linux OS distributions are:Amazon Linux 2AlpineCentOSDebianUbuntuThen, the Runtime Interface Client needs to be installed. We provide both wheel and source distribution.
If the OS/pip version used does not supportmanylinux2014wheels, you will also need to install the required build dependencies.
Also, your Lambda function code needs to be copied into the image.# Include global arg in this stage of the buildARGFUNCTION_DIR# Install aws-lambda-cpp build dependenciesRUNapt-getupdate&&\apt-getinstall-y\g++\make\cmake\unzip\libcurl4-openssl-dev# Copy function codeRUNmkdir-p${FUNCTION_DIR}COPYapp/*${FUNCTION_DIR}# Install the function's dependenciesRUNpipinstall\--target${FUNCTION_DIR}\awslambdaricThe next step would be to set theENTRYPOINTproperty of the Docker image to invoke the Runtime Interface Client and then set theCMDargument to specify the desired handler.Example Dockerfile (to keep the image light we use a multi-stage build):# Define custom function directoryARGFUNCTION_DIR="/function"FROMpublic.ecr.aws/docker/library/python:busterasbuild-image# Include global arg in this stage of the buildARGFUNCTION_DIR# Install aws-lambda-cpp build dependenciesRUNapt-getupdate&&\apt-getinstall-y\g++\make\cmake\unzip\libcurl4-openssl-dev# Copy function codeRUNmkdir-p${FUNCTION_DIR}COPYapp/*${FUNCTION_DIR}# Install the function's dependenciesRUNpipinstall\--target${FUNCTION_DIR}\awslambdaricFROMpublic.ecr.aws/docker/library/python:buster# Include global arg in this stage of the buildARGFUNCTION_DIR# Set working directory to function root directoryWORKDIR${FUNCTION_DIR}# Copy in the built dependenciesCOPY--from=build-image${FUNCTION_DIR}${FUNCTION_DIR}ENTRYPOINT["/usr/local/bin/python","-m","awslambdaric"]CMD["app.handler"]Example Python handlerapp.py:defhandler(event,context):return"Hello World!"Local TestingTo make it easy to locally test Lambda functions packaged as container images we open-sourced a lightweight web-server, Lambda Runtime Interface Emulator (RIE), which allows your function packaged as a container image to accept HTTP requests. You can install theAWS Lambda Runtime Interface Emulatoron your local machine to test your function. Then when you run the image function, you set the entrypoint to be the emulator.To install the emulator and test your Lambda functionFrom your project directory, run the following command to download the RIE from GitHub and install it on your local machine.mkdir-p~/.aws-lambda-rie&&\curl-Lo~/.aws-lambda-rie/aws-lambda-riehttps://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie&&\chmod+x~/.aws-lambda-rie/aws-lambda-rieRun your Lambda image function using the docker run command.dockerrun-d-v~/.aws-lambda-rie:/aws-lambda-p9000:8080\--entrypoint/aws-lambda/aws-lambda-rie\myfunction:latest\/usr/local/bin/python-mawslambdaricapp.handlerThis runs the image as a container and starts up an endpoint locally athttp://localhost:9000/2015-03-31/functions/function/invocations.Post an event to the following endpoint using a curl command:curl-XPOST"http://localhost:9000/2015-03-31/functions/function/invocations"-d'{}'This command invokes the function running in the container image and returns a response.Alternately, you can also include RIE as a part of your base image. See the AWS documentation on how toBuild RIE into your base image.DevelopmentBuilding the packageClone this repository and run:makeinit
makebuildRunning testsMake sure the project is built:makeinitbuildThen,to run unit tests:make testto run integration tests:make test-integto run smoke tests:make test-smokeTroubleshootingWhile running integration tests, you might encounter the Docker Hub rate limit error with the following body:You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limitsTo fix the above issue, consider authenticating to a Docker Hub account by setting the Docker Hub credentials as below CodeBuild environment variables.DOCKERHUB_USERNAME=<dockerhubusername>DOCKERHUB_PASSWORD=<dockerhubpassword>Recommended way is to set the Docker Hub credentials in CodeBuild job by retrieving them from AWS Secrets Manager.SecurityIf you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via ourvulnerability reporting page. Please donotcreate a public github issue.LicenseThis project is licensed under the Apache-2.0 License.