Based on https://github.com/serverless/examples/tree/master/aws-java-simple-http-endpoint and https://aboullaite.me/generate-qrcode-with-logo-image-using-zxing/
Notes
- See serverless setup below.
- The endpoint accepts a
content
request parameter that contains the base64 encoded QR code. - The image returned is of
Content-Type: image/png
. However, the binary media types in the API Gateway needs to be*/*
, doesn't work withimage/*
./gradlew build && serverless deploy
E.g. https://some-id.execute-api.ap-south-1.amazonaws.com/dev/qr.png?content=aHR0cHM6Ly9pY2FuaGFzLmNoZWV6YnVyZ2VyLmNvbS8=
serverless remove
- Sometimes you get a
Serverless: Service files not changed. Skipping deployment...
and your changes don't get deployed. If you're certain that you have built your code before deploy (trust me, you haven't), just add a--force
flag to the deploy command and you should be fine.
Duration: 1214.45 ms Billed Duration: 1215 ms
Memory Size: 1024 MB Max Memory Used: 107 MB
Init Duration: 457.28 ms
Duration: 136.53 ms Billed Duration: 137 ms
Memory Size: 1024 MB Max Memory Used: 108 MB
Higher memory usually means faster startup and execution times, not much difference in cost (for my use case).
~4-12 kb based on my test strings (ymmv)
This example demonstrates how to setup a simple HTTP GET endpoint using Java. Once you ping it, it will reply with the current time.
Jackson is used to serialize objects to JSON.
- Wrapping an existing internal or external endpoint/service
It is required to build prior to deploying. You can build the deployment artifact using Gradle or Maven.
In order to build using Gradle simply run
gradle wrapper # to build the gradle wrapper jar
./gradlew build # to build the application jar
The expected result should be similar to:
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details
:compileJava
:processResources
:classes
:jar
:assemble
:buildZip
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
Total time: 8.195 secs
In order to build using Maven simply run
mvn package
Note: you can install Maven with
- sdkman using
sdk install maven
(yes, use as default) sudo apt-get install mvn
brew install maven
If you use Maven to build, then in serverless.yml
you have to replace
package:
artifact: build/distributions/aws-java-simple-http-endpoint.zip
with
package:
artifact: target/aws-java-simple-http-endpoint.jar
before deploying.
After having built the deployment artifact using Gradle or Maven as described above you can deploy by simply running
serverless deploy
The expected result should be similar to:
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
..............................
Serverless: Stack update finished...
Service Information
service: aws-java-simple-http-endpoint
stage: dev
region: us-east-1
api keys:
None
endpoints:
GET - https://XXXXXXX.execute-api.us-east-1.amazonaws.com/dev/ping
functions:
aws-java-simple-http-endpoint-dev-currentTime: arn:aws:lambda:us-east-1:XXXXXXX:function:aws-java-simple-http-endpoint-dev-currentTime
You can now invoke the Lambda function directly and even see the resulting log via
serverless invoke --function currentTime --log
The expected result should be similar to:
{
"statusCode": 200,
"body": "{\"message\":\"Hello, the current time is Wed Jan 04 23:44:37 UTC 2017\"}",
"headers": {
"X-Powered-By": "AWS Lambda & Serverless",
"Content-Type": "application/json"
},
"isBase64Encoded": false
}
--------------------------------------------------------------------
START RequestId: XXXXXXX Version: $LATEST
2004 23:44:37 <XXXXXXX> INFO com.serverless.Handler:18 - received: {}
END RequestId: XXXXXXX
REPORT RequestId: XXXXXXX Duration: 0.51 ms Billed Duration: 100 ms Memory Size: 1024 MB Max Memory Used: 53 MB
Finally you can send an HTTP request directly to the endpoint using a tool like curl
curl https://XXXXXXX.execute-api.us-east-1.amazonaws.com/dev/ping
The expected result should be similar to:
{"message": "Hello, the current time is Wed Jan 04 23:44:37 UTC 2017"}%
By default, AWS Lambda limits the total concurrent executions across all functions within a given region to 100. The default limit is a safety limit that protects you from costs due to potential runaway or recursive functions during initial development and testing. To increase this limit above the default, follow the steps in To request a limit increase for concurrent executions.