https://github.com/pmlopes/aws-lambda-native-vertx
https://github.com/pmlopes/aws-lambda-native-vertx
Last synced: 9 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/pmlopes/aws-lambda-native-vertx
- Owner: pmlopes
- License: mit
- Created: 2019-03-05T11:22:53.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2020-10-13T18:05:05.000Z (over 5 years ago)
- Last Synced: 2025-07-06T17:04:48.070Z (12 months ago)
- Language: Java
- Size: 128 KB
- Stars: 29
- Watchers: 4
- Forks: 9
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# aws-lambda-vertx-native
### Custom Vert.x Native for AWS Lambda
*Disclaimer - This project should be considered a POC and has not been tested or verified for production use.
If you decided to run this on production systems you do so at your own risk.*
### Building this Runtime
#### Prerequisites
Make sure you have the following installed on your build machine before getting started.
* GraalVM
* AWS CLI
##### Compile the Runtime Classes
```
$ ./mvnw package
```
#### Create the Lambda Custom Runtime Entry Point
AWS Lambda Custom Runtimes require an executable file in the root directory named simply ```bootstrap```. This can be any executable file, for our case we're going to just use
a shell script to call our launcher that we created in the step above. This script will do nothing more than invoke our Java Runtime from the dist folder.
##### Create the bootstrap script
```
$ touch boostrap
```
##### Call our Java Runtime from Bash
Add the following commands to the ```bootstrap```
```$bash
#!/bin/sh
/opt/target/lambda
```
Note that the path we're using in our shell script is ```/opt```. When you create a Lambda Layer, as we'll do shortly, AWS Lambda copies all the runtime files to the ```/opt``` directory. This directory is effectively the home directory for our custom runtime.
##### Make bootstrap executable
```
$ chmod +x bootstrap
```
##### Create a deployment package
In the root of the folder containing our ```bootstrap``` and ```target/lambda``` files, create a zip archive containing the artifacts.
```
$ zip -r function.zip bootstrap target/lambda
```
### Deploying to AWS Lambda
#### Create a lambda role
```
aws iam create-role \
--role-name lambda-role \
--path "/service-role/" \
--assume-role-policy-document file:///tmp/trust-policy.json
```
Where the file `/tmp/trust-policy.json` contains:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
```
#### Publish a lambda layer
```
aws lambda publish-layer-version \
--layer-name vertx-native-example \
--zip-file fileb://function.zip
```
#### Create a function
```
aws lambda delete-function --function-name vertxNativeTester
aws lambda create-function --function-name vertxNativeTester \
--zip-file fileb://function.zip --handler lambda.EchoLambda --runtime provided \
--role arn:aws:iam::985727241951:role/service-role/lambda-role
```
#### Link the layer to the function
```
aws lambda update-function-configuration --function-name vertxNativeTester --layers arn:aws:lambda:eu-central-1:985727241951:layer:vertx-native-example:8
```
#### Test it
```
aws lambda invoke --function-name vertxNativeTester --payload '{"message":"Hello World"}' --log-type Tail response.txt | grep "LogResult"| awk -F'"' '{print $4}' | base64 --decode
```