AWS Lambda: Docker container support
One of the most outstanding features brought by AWS for lambda is an AWS Lambda — Container Image Support
Why is that?
Simply because it allows migrating a lot of applications to AWS Lambda.
Before this, packaging dependencies and programming language support was quite a pain for developers new to serverless. On top, running these apps outside the Lambda was hardly possible without some heavy lifting
So, can we use any docker image inside our Lambda workloads?
No, for now, there is still some work that needs to be done to prep those
This is because Lambda functions are being started and invoked in a very specific way, so all these docker images/containers need a special element called Lambda Runtime API in order to work
Multiple approaches to get started with docker container for Lambda :
- use base docker images provided by AWS and add your dependencies
- make your custom base image and add Lambda Runtime Interface Clients
Summary of constraints :
- Docker Registry: only ECR (Elastic Container Registry)
Other registries like DockerHub, GCR, ACR and etc are not yet supported at this time. - Container images size - 10 GB
(Well…more than enough for most modern apps) - Mandatory to use base images with built-in Lambda Runtime API or own customized docker images implementing Lambda Runtime Interface Clients
How to build a docker image for Lambda and use it in a function:
Here is the git repo with sample code
app.js — lambda handler code with simple Hello world response
Dockerfile with build steps for NodeJS using AWS provide a base image
package.json — sample file (no dependencies)
Building NodeJS Docker image for AWS Lambda :
Clone the repo and build the docker image :
git clone https://github.com/advissor/aws-lambda-container-support.git
cd aws-lambda-container-support
docker build -t aws-container-nodejs-hello .
Verify that code works :
Run a container with the image you build in the previous step
docker run -p 9000:8080 aws-container-nodejs-hello
Run a test curl request :
curl -XPOST “http://localhost:9000/2015-03-31/functions/function/invocations" -d ‘{}’
You should receive a JSON response back with Hello World text inside the body
Tagging and pushing docker image to ECR
Creating ECR repo :
aws ecr create-repository — repository-name aws-container-nodejs-hello — image-scanning-configuration scanOnPush=true
Re-tag local image with ECR repo name
docker tag aws-container — nodejs-hello:latest <aws_account_id>.dkr.ecr.<region>.amazonaws.com/aws-container-nodejs-hello:latest
Login to ECR
aws ecr get-login-password | docker login — username AWS — password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
Push image to ECR
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/aws-container-nodejs-hello:latest
After the image is in ECR we can select it during Lamda function creation
Creating a Lambda function
Selecting container Image
Testing via Sample event
Click on the button next to Actions > Configure test events
Adding a dummy test event :
- create a new test event
- type event name & leave dummy JSON (we are not using any parameters from this JSON, we are using this event to invoke a function manually for verification purposes. Kind of a simulation )
- Click on Create
You can invoke it via click “Test” button
After this, you should get a gree screen
Exposing externally/make public Lambda function via API gateway
Adding API Gateway endpoint in order to call Lambda function
You can find an url/endpoint in “API Endpoint” section of API Gateway Trigger :
If you browse to API endpoint URL, you should be able to see string “Response from NodeJS container"
Links :
https://aws.amazon.com/ru/blogs/aws/new-for-aws-lambda-container-image-support/
Github for this article :