Use V lang for AWS Lambda functions. This template provides a setup to compile, test local and deploy to AWS with the serverless framework which provides easy creation of additional AWS Cloud resources.
create a project from the template
mkdir my-project && cd $_
git init
git pull --depth 1 https://github.com/aheissenberger/vlang-aws-lambda.gitVlanguage setup- Docker Desktop
Hint: This project uses the latest version of Docker Desktop. If your version does not provide
docker composereplace all mentioned commands withdocker-compose. - AWS credentials setup
add the code for your functions to src/bootstrap.v
docker compose run --rm buildstart the AWS Lambda Emulator as background process:
docker compose up -d lambda my-handlerinvoke your function with a AWS Event:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'Lambda Logs:
docker compose logs -f lambdashutdown background process:
docker compose downHint: you need to restart if you built new binaries!
This is the option you will use if you need to debug your V function with lldbor gdb.
build requires local golang development environment
git clone git@github.com:aws/aws-lambda-runtime-interface-emulator.git aws-lambda-rie
cd aws-lambda-rie
go build -ldflags "-s -w" -o aws-lambda-rie ./cmd/aws-lambda-rie
run
- compile V lang handler
v -prod -gc boehm_full_opt src/lambda_function.v -o build/bootstrap- run AWS Lambda Runtime Interface Emulation
./aws-lambda-rie/aws-lambda-rie --log-level debug ./build/bootstrap myhandler
- call the AWS Lambda Runtime Interface on port 8080 (different to docker image)
curl -XPOST "http://localhost:8080/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'- Modify configuration
check and adapt serverless.yml:
service: <project_name>should be short and will be part of the lambda function nameregion: eu-west-1adapt region to your locationstage: devfor more information check serverless framework documentation
-
Deploy
docker compose run --rm deployCheck the environment: and args: sections of the docker-compose.yml file for possible options.
Check the entrypoint: sections of the docker-compose.yml file for possible options.
by default this will do:
serverless deploy
you can add any valid serverless cli command to the command:
docker compose run deploy <serverless command>
remove the whole project from AWS Cloud:
docker compose run deploy remove --stage test
deploy to a different stage as defined in serverless.yml:
docker compose run deploy deploy --stage test
The bootstrap module will handle the communication to the AWS Runtime API. The only information which needs to be provided is a mapping of handler names to handler functions.
fn main() {
runtime := bootstrap.BootstrapConfig{
handlers: map{
'default': my_handler
}
}
runtime.process()
}
fn my_handler(event json2.Any, context bootstrap.Context) string {
return result
}If only one function is needed use the name 'default' which is allready used as a default for the local lambda test setup.
- Build pipeline to create AWS Linux 2 native binaries and bundle shared libraries
- Local Lambda Testenvironment
- Integrated AWS Cloud deployment with the serverless framework
- Encapsulate the V lang custome runtime in a v module
- Deploy all libraries in an extra layer
- Include example which uses the AWS C++ SDK
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.
- Fork the Project
- Create your Feature Branch (git checkout -b feature/AmazingFeature)
- Commit your Changes (git commit -m 'Add some AmazingFeature')
- Push to the Branch (git push origin feature/AmazingFeature)
- Open a Pull Request
These are resources which helped to land this project
- https://docs.aws.amazon.com/lambda/latest/dg/runtimes-walkthrough.html
- https://github.com/aws/aws-lambda-runtime-interface-emulator
- https://stackoverflow.com/questions/58548580/npm-package-pem-doesnt-seem-to-work-in-aws-lambda-nodejs-10-x-results-in-ope/60232433#60232433
- https://github.com/softprops/lambda-rust
- http://jamesmcm.github.io/blog/2020/10/24/lambda-runtime/
- https://github.com/awslabs/aws-lambda-cpp
- https://gallery.ecr.aws/lambda/provided
when extra tools from centos epel required:
RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && \
yum update -y && \
yum install -y inotify-tools
Distributed under the "bsd-2-clause" License. See LICENSE.txt for more information.