You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by al...@apache.org on 2021/08/16 15:27:36 UTC

[camel-quarkus-examples] 01/04: Added the module Deploying a Camel Route in AWS Lambda to the examples

This is an automated email from the ASF dual-hosted git repository.

aldettinger pushed a commit to branch camel-quarkus-main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus-examples.git

commit 6839e730e6c37b30506d314fc6d28bbfb9d8f893
Author: ravishankarhassain <ra...@gmail.com>
AuthorDate: Tue Aug 10 00:34:23 2021 +0100

    Added the module Deploying a Camel Route in AWS Lambda to the examples
---
 aws-lambda/README.md                               | 197 ++++++++++++++
 aws-lambda/payload.json                            |   3 +
 aws-lambda/pom.xml                                 | 287 +++++++++++++++++++++
 aws-lambda/results.png                             | Bin 0 -> 27634 bytes
 aws-lambda/src/main/docker/Dockerfile.jvm          |  55 ++++
 aws-lambda/src/main/docker/Dockerfile.native       |  27 ++
 .../src/main/docker/Dockerfile.native-distroless   |  23 ++
 .../camel/quarkus/examples/AWSLambdaHandler.java   |  39 +++
 .../apache/camel/quarkus/examples/CamelRoute.java  |  37 +++
 .../camel/quarkus/examples/GreetService.java       |  27 ++
 .../org/apache/camel/quarkus/examples/Person.java  |  36 +++
 .../quarkus/examples/AWSLambdaHandlerTest.java     |  45 ++++
 .../quarkus/examples/AWSLambdaHandlerTestIT.java   |  25 ++
 .../src/test/resources/application.properties      |  17 ++
 docs/modules/ROOT/attachments/examples.json        |   5 +
 15 files changed, 823 insertions(+)

diff --git a/aws-lambda/README.md b/aws-lambda/README.md
new file mode 100644
index 0000000..49673f7
--- /dev/null
+++ b/aws-lambda/README.md
@@ -0,0 +1,197 @@
+# Deploying a Camel Route in AWS Lambda : A Camel Quarkus example
+
+This example uses the following framework 
+
+ * **Quarkus** - *The Supersonic Subatomic Java Framework for building Cloud Native Applications*
+ * **Apache Camel** - *The Swiss Army Knife of Enterprise Application Integration for integrating heterogeneous systems*
+ * **AWS Lambda** - *Event-driven, serverless computing platform provided by Amazon as a part of Amazon Web Services*
+
+If you want to learn more about 
+
+* *Quarkus - please visit its website: https://quarkus.io/*
+* *Apache Camel - please visit its website: https://camel.apache.org/*
+* *AWS Lambda - please visit its website: https://aws.amazon.com/lambda/*
+
+## Provided Code
+
+### Quarkus Camel Amazon Lambda Integration example
+
+This example contains a sample Greeter service build using Quarkus & Camel framework implementing Dependency Injection design principle which can be deployed as functions into the Amazon Lambda.
+
+> :warning: **INCOMPATIBLE WITH DEV MODE**: Amazon Lambda Binding is not compatible with dev mode yet!
+
+
+#### Quarkus Extensions / Dependencies Used
+
+1. **[Apache Camel](https://quarkus.io/guides/camel)**
+    * [camel-quarkus-core](https://camel.apache.org/camel-quarkus/latest/reference/extensions/core.html)
+    * [camel-quarkus-direct](https://camel.apache.org/camel-quarkus/latest/reference/extensions/direct.html)
+    * [camel-quarkus-log](https://camel.apache.org/camel-quarkus/latest/reference/extensions/log.html)
+
+2. **Amazon Lambda**
+    * [quarkus-amazon-lambda](https://quarkus.io/guides/amazon-lambda)
+    
+3. **[Context Dependency Injection](https://quarkus.io/guides/cdi)**
+    * [quarkus-arc](https://quarkus.io/guides/cdi-reference)
+    
+4. **[Testing](https://quarkus.io/guides/getting-started-testing)**
+    * quarkus-junit5
+    * [quarkus-junit5-mockito](https://quarkus.io/blog/mocking/)
+    * quarkus-test-amazon-lambda
+
+## Running the application in dev mode
+
+You can run your application in dev mode that enables live coding using:
+```shell script
+mvn compile quarkus:dev
+```
+
+> **_NOTE:_**  Quarkus now ships with a Dev UI, which is available in dev mode only at http://localhost:8080/q/dev/.
+
+## Building and Packaging the Java code as Quarkus JVM application
+
+The application can be packaged using:
+```shell script
+mvn clean package
+```
+This will compile and package your code. 
+
+It produces the `quarkus-run.jar` file in the `target/quarkus-app/` directory.
+Be aware that it’s not an _uber-jar_ as the dependencies are copied into the `target/quarkus-app/lib/` directory.
+
+If you want to build an _uber-jar_, execute the following command:
+```shell script
+mvn package -Dquarkus.package.type=uber-jar
+```
+
+The application is now runnable using `java -jar target/quarkus-app/quarkus-run.jar`.
+
+It also generates a zip file `target/function.zip`. This zip file contains your java code along with the dependencies.
+
+<a name="native"> </a>
+
+## Building and Packaging the Java code as Quarkus Native executable
+
+If you want a lower memory footprint and faster initialization times for your lambda, you can compile your Java code to a native executable. Just make sure to rebuild your project with the -Pnative switch.
+> :warning: **Building Native Executables will take much longer time and depends on the underlying system**
+```shell script
+mvn package -Pnative
+```
+> :information_source: If you are building on a non-Linux system Or, if you don't have GraalVM installed, you can run the native executable build using docker container. You need to pass in a property instructing quarkus to use a docker build as Amazon Lambda requires linux binaries. 
+>You can do this by passing this property to your Maven build: `-Dquarkus.native.container-build=true`. However, This requires to have docker installed locally.
+
+```shell script
+mvn package -Pnative -Dquarkus.native.container-build=true
+```
+
+Either of these commands will compile and create a native executable image. 
+You can then execute your native executable with: `./target/code-with-quarkus-1.0.0-SNAPSHOT-runner`
+
+It also generates a zip file `target/function.zip`. This zip file contains your native executable image renamed to bootstrap. This is a requirement of the AWS Lambda Custom (Provided) Runtime.
+
+If you want to learn more about building native executables, please consult https://quarkus.io/guides/maven-tooling.html.
+
+## Extra Build Generated Files
+ **_NOTE:_** After you run the build, there are a few extra files generated by the quarkus-amazon-lambda extension. These files are in the build directory: `target/`
+
+* function.zip - lambda deployment file
+
+* manage.sh - wrapper around aws lambda cli calls
+
+* bootstrap-example.sh - example bootstrap script for native deployments
+
+* sam.jvm.yaml - (optional) for use with sam cli and local testing
+
+* sam.native.yaml - (optional) for use with sam cli and native local testing
+
+> :information_source: [Please click here to know more on how to use these scripts for automated deployment](https://quarkus.io/guides/amazon-lambda#extra-build-generated-files)
+
+## Deploying the Quarkus JVM application to AWS Lambda via AWS Web Console
+
+1. Go to AWS Web console and search for Lambda Service
+ 
+2. Click Create Function and select Author From Scratch 
+
+3. Give the name for your function which should be unique
+
+4. Select Java 11 (Corretto) as Runtime 
+
+5. Under Permission feel free to create / use existing role to give the required permission for your lambda function
+
+6. Once the function is created click the function name to upload the generated function.zip file and configure it. 
+
+7. Scroll down and select the Code tab. Click the upload from dropdown on right-hand side of the screen and select .zip or .jar file 
+
+8. Click upload and browse to the path where the generated zip file `target/function.zip` was created and select the function.zip file and click save
+
+9. Under the Code tab scroll down to the Runtime settings and click edit 
+
+10. For the Handler details please provide the Quarkus Handler 
+
+```shell script
+io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
+```
+
+### Testing the AWS Lamda Function
+
+1. Now select the Test tab for executing a quick test. Copy paste the below json payload and hit Test 
+
+    ```shell script
+    {
+     "name": "Ravishankar"
+    }
+    ```
+2. If everything goes fine you should get the below response along with the lambda execution logs & stats
+
+    ```shell script
+    Hello Ravishankar ! How are you? from GreetService
+    ```
+## Deploying the Quarkus Native executable to AWS Lambda via AWS Web Console
+
+**_NOTE:_** [Please ensure that you have built your Java code as Quarkus Native executable](#native)
+
+1. Go to AWS Web console and search for Lambda Service
+ 
+2. Click Create Function and select Author From Scratch 
+
+3. Give the name for your function which should be unique
+
+4. For Runtime please scroll down and Select Provide your own bootstrap on Amazon Linux 2 under Custom Runtime 
+
+5. Under Permission feel free to create / use existing role to give the required permission for your lambda function
+
+6. Once the function is created click the function name to upload the generated function.zip file and configure it. 
+
+7. Scroll down and select the Code tab. Click the upload from dropdown on right-hand side of the screen and select .zip or .jar file 
+
+8. Click upload and browse to the path where the generated zip file `target/function.zip` was created and select the function.zip file and click save
+
+9. Under the Code tab scroll down to the Runtime settings and click edit 
+
+10. For the Handler details please provide the below Handler 
+
+    ```shell script
+        not.used.in.provided.runtime
+    ```
+
+11. Then Select the Configuration tab and click Environment Variables 
+
+12. For Key enter `DISABLE_SIGNAL_HANDLERS`	& for Value enter `true`
+
+### Testing the AWS Lamda Function
+
+1. Now select the Test tab for executing a quick test. Copy paste the below json payload and hit Test 
+
+    ```shell script
+    {
+     "name": "Ravishankar"
+    }
+    ```
+2. If everything goes fine you should get the below response along with the lambda execution logs & stats
+
+    ```shell script
+    Hello Ravishankar ! How are you? from GreetService
+    ```
+
+## JVM vs Native : Results based on lambda execution logs & stats
+![JVM vs Native Results](results.png?raw=true "JVM vs Native Results")
\ No newline at end of file
diff --git a/aws-lambda/payload.json b/aws-lambda/payload.json
new file mode 100644
index 0000000..192c26b
--- /dev/null
+++ b/aws-lambda/payload.json
@@ -0,0 +1,3 @@
+{
+  "name": "Ravishankar"
+}
\ No newline at end of file
diff --git a/aws-lambda/pom.xml b/aws-lambda/pom.xml
new file mode 100644
index 0000000..25e7072
--- /dev/null
+++ b/aws-lambda/pom.xml
@@ -0,0 +1,287 @@
+<?xml version="1.0"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+         http://www.apache.org/licenses/LICENSE-2.0
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.camel.quarkus.examples</groupId>
+  <artifactId>camel-quarkus-examples-aws-lambda</artifactId>
+  <version>2.2.0-SNAPSHOT</version>
+
+  <name>Camel Quarkus :: Examples :: AWS Lambda</name>
+  <description>Camel Quarkus Example :: Deploying a Camel Route in AWS Lambda</description>
+
+  <properties>
+    <camel-quarkus.version>2.1.0</camel-quarkus.version>
+    <quarkus.version>2.1.0.Final</quarkus.version>
+
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <maven.compiler.target>11</maven.compiler.target>
+    <maven.compiler.source>11</maven.compiler.source>
+    <maven.compiler.testTarget>${maven.compiler.target}</maven.compiler.testTarget>
+    <maven.compiler.testSource>${maven.compiler.source}</maven.compiler.testSource>
+
+    <formatter-maven-plugin.version>2.11.0</formatter-maven-plugin.version>
+    <impsort-maven-plugin.version>1.3.2</impsort-maven-plugin.version>
+    <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
+    <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
+    <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version>
+    <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
+    <mycila-license.version>3.0</mycila-license.version>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-bom</artifactId>
+        <version>${camel-quarkus.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.camel.quarkus</groupId>
+      <artifactId>camel-quarkus-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel.quarkus</groupId>
+      <artifactId>camel-quarkus-direct</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel.quarkus</groupId>
+      <artifactId>camel-quarkus-log</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-amazon-lambda</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-arc</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-junit5</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-junit5-mockito</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-test-amazon-lambda</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>net.revelc.code.formatter</groupId>
+          <artifactId>formatter-maven-plugin</artifactId>
+          <version>${formatter-maven-plugin.version}</version>
+          <configuration>
+            <configFile>${maven.multiModuleProjectDirectory}/eclipse-formatter-config.xml</configFile>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>net.revelc.code</groupId>
+          <artifactId>impsort-maven-plugin</artifactId>
+          <version>${impsort-maven-plugin.version}</version>
+          <configuration>
+            <groups>java.,javax.,org.w3c.,org.xml.,junit.</groups>
+            <removeUnused>true</removeUnused>
+            <staticAfter>true</staticAfter>
+            <staticGroups>java.,javax.,org.w3c.,org.xml.,junit.</staticGroups>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>${maven-compiler-plugin.version}</version>
+          <configuration>
+            <parameters>true</parameters>
+            <showDeprecation>true</showDeprecation>
+            <showWarnings>true</showWarnings>
+            <compilerArgs>
+              <arg>-Xlint:unchecked</arg>
+            </compilerArgs>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>${maven-surefire-plugin.version}</version>
+          <configuration>
+            <failIfNoTests>false</failIfNoTests>
+            <systemProperties>
+              <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
+              <maven.home>${maven.home}</maven.home>
+            </systemProperties>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>io.quarkus</groupId>
+          <artifactId>quarkus-maven-plugin</artifactId>
+          <version>${quarkus.version}</version>
+          <extensions>true</extensions>
+          <executions>
+            <execution>
+              <goals>
+                <goal>build</goal>
+                <goal>generate-code</goal>
+                <goal>generate-code-tests</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-failsafe-plugin</artifactId>
+          <version>${maven-surefire-plugin.version}</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>${maven-jar-plugin.version}</version>
+        </plugin>
+
+        <plugin>
+          <groupId>com.mycila</groupId>
+          <artifactId>license-maven-plugin</artifactId>
+          <version>${mycila-license.version}</version>
+          <configuration>
+            <failIfUnknown>true</failIfUnknown>
+            <header>${maven.multiModuleProjectDirectory}/header.txt</header>
+            <excludes>
+              <exclude>**/*.adoc</exclude>
+              <exclude>**/*.txt</exclude>
+              <exclude>**/LICENSE.txt</exclude>
+              <exclude>**/LICENSE</exclude>
+              <exclude>**/NOTICE.txt</exclude>
+              <exclude>**/NOTICE</exclude>
+              <exclude>**/README</exclude>
+              <exclude>**/pom.xml.versionsBackup</exclude>
+            </excludes>
+            <mapping>
+              <java>SLASHSTAR_STYLE</java>
+              <properties>CAMEL_PROPERTIES_STYLE</properties>
+              <kt>SLASHSTAR_STYLE</kt>
+            </mapping>
+            <headerDefinitions>
+              <headerDefinition>${maven.multiModuleProjectDirectory}/license-properties-headerdefinition.xml</headerDefinition>
+            </headerDefinitions>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+
+    <plugins>
+      <plugin>
+        <groupId>io.quarkus</groupId>
+        <artifactId>quarkus-maven-plugin</artifactId>
+        <version>${quarkus.version}</version>
+        <extensions>true</extensions>
+        <executions>
+          <execution>
+            <goals>
+              <goal>build</goal>
+              <goal>generate-code</goal>
+              <goal>generate-code-tests</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>net.revelc.code.formatter</groupId>
+        <artifactId>formatter-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>format</id>
+            <goals>
+              <goal>format</goal>
+            </goals>
+            <phase>process-sources</phase>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>net.revelc.code</groupId>
+        <artifactId>impsort-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>sort-imports</id>
+            <goals>
+              <goal>sort</goal>
+            </goals>
+            <phase>process-sources</phase>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>native</id>
+      <activation>
+        <property>
+          <name>native</name>
+        </property>
+      </activation>
+      <properties>
+        <quarkus.package.type>native</quarkus.package.type>
+      </properties>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-failsafe-plugin</artifactId>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>integration-test</goal>
+                  <goal>verify</goal>
+                </goals>
+                <configuration>
+                  <systemPropertyVariables>
+                    <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
+                    <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
+                    <maven.home>${maven.home}</maven.home>
+                  </systemPropertyVariables>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+</project>
\ No newline at end of file
diff --git a/aws-lambda/results.png b/aws-lambda/results.png
new file mode 100644
index 0000000..a806e20
Binary files /dev/null and b/aws-lambda/results.png differ
diff --git a/aws-lambda/src/main/docker/Dockerfile.jvm b/aws-lambda/src/main/docker/Dockerfile.jvm
new file mode 100644
index 0000000..90bc63f
--- /dev/null
+++ b/aws-lambda/src/main/docker/Dockerfile.jvm
@@ -0,0 +1,55 @@
+####
+# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode
+#
+# Before building the container image run:
+#
+# mvn package
+#
+# Then, build the image with:
+#
+# docker build -f src/main/docker/Dockerfile.jvm -t  camel-quarkus-examples/aws-lambda-jvm .
+#
+# Then run the container using:
+#
+# docker run -i --rm -p 8080:8080 qcamel-quarkus-examples/aws-lambda-jvm
+#
+# If you want to include the debug port into your docker image
+# you will have to expose the debug port (default 5005) like this :  EXPOSE 8080 5005
+#
+# Then run the container using :
+#
+# docker run -i --rm -p 8080:8080 -p 5005:5005 -e JAVA_ENABLE_DEBUG="true" camel-quarkus-examples/aws-lambda-jvm
+#
+###
+FROM registry.access.redhat.com/ubi8/ubi-minimal:8.4 
+
+ARG JAVA_PACKAGE=java-11-openjdk-headless
+ARG RUN_JAVA_VERSION=1.3.8
+ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en'
+# Install java and the run-java script
+# Also set up permissions for user `1001`
+RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \
+    && microdnf update \
+    && microdnf clean all \
+    && mkdir /deployments \
+    && chown 1001 /deployments \
+    && chmod "g+rwX" /deployments \
+    && chown 1001:root /deployments \
+    && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \
+    && chown 1001 /deployments/run-java.sh \
+    && chmod 540 /deployments/run-java.sh \
+    && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/conf/security/java.security
+
+# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size.
+ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
+# We make four distinct layers so if there are application changes the library layers can be re-used
+COPY --chown=1001 target/quarkus-app/lib/ /deployments/lib/
+COPY --chown=1001 target/quarkus-app/*.jar /deployments/
+COPY --chown=1001 target/quarkus-app/app/ /deployments/app/
+COPY --chown=1001 target/quarkus-app/quarkus/ /deployments/quarkus/
+
+EXPOSE 8080
+USER 1001
+
+ENTRYPOINT [ "/deployments/run-java.sh" ]
+
diff --git a/aws-lambda/src/main/docker/Dockerfile.native b/aws-lambda/src/main/docker/Dockerfile.native
new file mode 100644
index 0000000..ab14aa2
--- /dev/null
+++ b/aws-lambda/src/main/docker/Dockerfile.native
@@ -0,0 +1,27 @@
+####
+# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode
+#
+# Before building the container image run:
+#
+# mvn package -Pnative
+#
+# Then, build the image with:
+#
+# docker build -f src/main/docker/Dockerfile.native -t camel-quarkus-examples/aws-lambda .
+#
+# Then run the container using:
+#
+# docker run -i --rm -p 8080:8080 camel-quarkus-examples/aws-lambda
+#
+###
+FROM registry.access.redhat.com/ubi8/ubi-minimal:8.4
+WORKDIR /work/
+RUN chown 1001 /work \
+    && chmod "g+rwX" /work \
+    && chown 1001:root /work
+COPY --chown=1001:root target/*-runner /work/application
+
+EXPOSE 8080
+USER 1001
+
+CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
diff --git a/aws-lambda/src/main/docker/Dockerfile.native-distroless b/aws-lambda/src/main/docker/Dockerfile.native-distroless
new file mode 100644
index 0000000..08f3de7
--- /dev/null
+++ b/aws-lambda/src/main/docker/Dockerfile.native-distroless
@@ -0,0 +1,23 @@
+####
+# This Dockerfile is used in order to build a distroless container that runs the Quarkus application in native (no JVM) mode
+#
+# Before building the container image run:
+#
+# mvn package -Pnative
+#
+# Then, build the image with:
+#
+# docker build -f src/main/docker/Dockerfile.native-distroless -t camel-quarkus-examples/aws-lambda .
+#
+# Then run the container using:
+#
+# docker run -i --rm -p 8080:8080 camel-quarkus-examples/aws-lambda
+#
+###
+FROM quay.io/quarkus/quarkus-distroless-image:1.0
+COPY target/*-runner /application
+
+EXPOSE 8080
+USER nonroot
+
+CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
diff --git a/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/AWSLambdaHandler.java b/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/AWSLambdaHandler.java
new file mode 100644
index 0000000..ce45e3a
--- /dev/null
+++ b/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/AWSLambdaHandler.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.examples;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.LambdaLogger;
+import com.amazonaws.services.lambda.runtime.RequestHandler;
+import org.apache.camel.ProducerTemplate;
+
+@Named("awsLambdaHandler")
+public class AWSLambdaHandler implements RequestHandler<Person, String> {
+
+    @Inject
+    ProducerTemplate template;
+
+    @Override
+    public String handleRequest(Person input, Context context) {
+        LambdaLogger logger = context.getLogger();
+        logger.log("Calling Camel Route :)");
+        return template.requestBody("direct:input", input, String.class);
+    }
+}
diff --git a/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/CamelRoute.java b/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/CamelRoute.java
new file mode 100644
index 0000000..b8c569f
--- /dev/null
+++ b/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/CamelRoute.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.examples;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+import org.apache.camel.builder.RouteBuilder;
+
+@ApplicationScoped
+public class CamelRoute extends RouteBuilder {
+
+    @Inject
+    GreetService greetService;
+
+    @Override
+    public void configure() throws Exception {
+        from("direct:input").routeId("Test")
+                .log("Inside Camel Route Received Payload ==> ${body}")
+                .setBody().body(Person.class, p -> greetService.greet(p.getName()))
+                .end();
+    }
+}
diff --git a/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/GreetService.java b/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/GreetService.java
new file mode 100644
index 0000000..0d46f67
--- /dev/null
+++ b/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/GreetService.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.examples;
+
+import javax.enterprise.context.ApplicationScoped;
+
+@ApplicationScoped
+public class GreetService {
+
+    public String greet(String name) {
+        return String.format("Hello %s ! How are you? from GreetService", name);
+    }
+}
diff --git a/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/Person.java b/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/Person.java
new file mode 100644
index 0000000..cd6553e
--- /dev/null
+++ b/aws-lambda/src/main/java/org/apache/camel/quarkus/examples/Person.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.examples;
+
+public class Person {
+
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public Person setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("Person[name= %s]", this.name);
+    }
+}
diff --git a/aws-lambda/src/test/java/org/apache/camel/quarkus/examples/AWSLambdaHandlerTest.java b/aws-lambda/src/test/java/org/apache/camel/quarkus/examples/AWSLambdaHandlerTest.java
new file mode 100644
index 0000000..4f3364f
--- /dev/null
+++ b/aws-lambda/src/test/java/org/apache/camel/quarkus/examples/AWSLambdaHandlerTest.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.examples;
+
+import io.quarkus.amazon.lambda.test.LambdaClient;
+import io.quarkus.test.junit.QuarkusMock;
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+@QuarkusTest
+public class AWSLambdaHandlerTest {
+
+    @BeforeAll
+    public static void setup() {
+
+        GreetService mock = Mockito.mock(GreetService.class);
+        Mockito.when(mock.greet("Stu")).thenReturn("Hello Stu ! How are you? from GreetService");
+        QuarkusMock.installMockForType(mock, GreetService.class);
+    }
+
+    @Test
+    public void testSimpleLambdaSuccess() throws Exception {
+        Person in = new Person();
+        in.setName("Stu");
+        String out = LambdaClient.invoke(String.class, in);
+        Assertions.assertEquals("Hello Stu ! How are you? from GreetService", out);
+    }
+}
diff --git a/aws-lambda/src/test/java/org/apache/camel/quarkus/examples/AWSLambdaHandlerTestIT.java b/aws-lambda/src/test/java/org/apache/camel/quarkus/examples/AWSLambdaHandlerTestIT.java
new file mode 100644
index 0000000..6debf16
--- /dev/null
+++ b/aws-lambda/src/test/java/org/apache/camel/quarkus/examples/AWSLambdaHandlerTestIT.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.examples;
+
+import io.quarkus.test.junit.NativeImageTest;
+
+@NativeImageTest
+public class AWSLambdaHandlerTestIT extends AWSLambdaHandlerTest {
+
+    // Execute the same tests but in native mode.
+}
diff --git a/aws-lambda/src/test/resources/application.properties b/aws-lambda/src/test/resources/application.properties
new file mode 100644
index 0000000..3db48e4
--- /dev/null
+++ b/aws-lambda/src/test/resources/application.properties
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+quarkus.lambda.enable-polling-jvm-mode=true
diff --git a/docs/modules/ROOT/attachments/examples.json b/docs/modules/ROOT/attachments/examples.json
index 6875aa8..56bb1ae 100644
--- a/docs/modules/ROOT/attachments/examples.json
+++ b/docs/modules/ROOT/attachments/examples.json
@@ -68,5 +68,10 @@
     "title": "XML Hello World",
     "description": "Shows how to define Camel routes using XML.",
     "link": "https://github.com/apache/camel-quarkus-examples/tree/main/timer-log-xml"
+  },
+  {
+    "title": "Deploying a Camel Route in AWS Lambda",
+    "description": "Demonstrates how to define Camel routes using CDI and deployed as functions into the Amazon Lambda",
+    "link": "https://github.com/apache/camel-quarkus-examples/tree/main/aws-lambda"
   }
 ]
\ No newline at end of file