You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2020/02/20 12:39:39 UTC

[camel] 01/09: CAMEL-14556 - Create an AWS-Lambda component based on SDK v2

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

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 855c87596af80ed6a9e468482824e278512ca75c
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 20 12:58:18 2020 +0100

    CAMEL-14556 - Create an AWS-Lambda component based on SDK v2
---
 components/camel-aws2-lambda/pom.xml               |  86 +++
 .../aws2/lambda/Lambda2ComponentConfigurer.java    |  33 ++
 .../aws2/lambda/Lambda2EndpointConfigurer.java     |  42 ++
 .../services/org/apache/camel/component.properties |   7 +
 .../org/apache/camel/component/aws2-lambda         |   2 +
 .../apache/camel/configurer/aws2-lambda-component  |   2 +
 .../apache/camel/configurer/aws2-lambda-endpoint   |   2 +
 .../camel/component/aws2/lambda/aws2-lambda.json   |  43 ++
 .../src/main/docs/aws-lambda-component.adoc        | 229 ++++++++
 .../component/aws2/lambda/Lambda2Component.java    | 119 ++++
 .../lambda/Lambda2ComponentVerifierExtension.java  |  85 +++
 .../aws2/lambda/Lambda2Configuration.java          | 147 +++++
 .../component/aws2/lambda/Lambda2Constants.java    |  55 ++
 .../component/aws2/lambda/Lambda2Endpoint.java     | 136 +++++
 .../component/aws2/lambda/Lambda2Operations.java   |  39 ++
 .../component/aws2/lambda/Lambda2Producer.java     | 616 +++++++++++++++++++++
 .../aws2/lambda/AmazonLambdaClientMock.java        | 300 ++++++++++
 .../lambda/LambdaComponentClientRegistryTest.java  |  48 ++
 .../lambda/LambdaComponentConfigurationTest.java   | 116 ++++
 .../aws2/lambda/LambdaComponentSpringTest.java     | 337 +++++++++++
 .../LambdaComponentVerifierExtensionTest.java      |  73 +++
 .../aws2/lambda/LambdaOperationsTest.java          |  75 +++
 .../lambda/LambdaProducerDefaultFunctionTest.java  |  66 +++
 .../component/aws2/lambda/LambdaProducerTest.java  | 384 +++++++++++++
 .../LambdaComponentIntegrationTest.java            | 145 +++++
 .../src/test/resources/log4j2.properties           |  28 +
 .../lambda/LambdaComponentSpringTest-context.xml   | 115 ++++
 .../aws2/lambda/function/node/GetHelloWithName.js  |  21 +
 .../aws2/lambda/function/node/GetHelloWithName.zip | Bin 0 -> 320 bytes
 core/camel-allcomponents/pom.xml                   |   4 +
 .../component/ComponentsBuilderFactory.java        |  12 +
 .../dsl/Aws2LambdaComponentBuilderFactory.java     | 161 ++++++
 .../src/generated/resources/metadata.json          |  20 +
 33 files changed, 3548 insertions(+)

diff --git a/components/camel-aws2-lambda/pom.xml b/components/camel-aws2-lambda/pom.xml
new file mode 100644
index 0000000..5ed30f1
--- /dev/null
+++ b/components/camel-aws2-lambda/pom.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-aws2-lambda</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: AWS2 Lambda</name>
+    <description>A Camel Amazon Lambda We Service Component Version 2</description>
+
+    <properties>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>lambda</artifactId>
+            <version>${aws-java-sdk2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>apache-client</artifactId>
+            <version>${aws-java-sdk2-version}</version>
+        </dependency>
+
+        <!-- for testing -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-spring</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/components/camel-aws2-lambda/src/generated/java/org/apache/camel/component/aws2/lambda/Lambda2ComponentConfigurer.java b/components/camel-aws2-lambda/src/generated/java/org/apache/camel/component/aws2/lambda/Lambda2ComponentConfigurer.java
new file mode 100644
index 0000000..9097b50
--- /dev/null
+++ b/components/camel-aws2-lambda/src/generated/java/org/apache/camel/component/aws2/lambda/Lambda2ComponentConfigurer.java
@@ -0,0 +1,33 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws2.lambda;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class Lambda2ComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        Lambda2Component target = (Lambda2Component) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": target.setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "region": target.setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": target.setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.aws2.lambda.Lambda2Configuration.class, value)); return true;
+        default: return false;
+        }
+    }
+
+}
+
diff --git a/components/camel-aws2-lambda/src/generated/java/org/apache/camel/component/aws2/lambda/Lambda2EndpointConfigurer.java b/components/camel-aws2-lambda/src/generated/java/org/apache/camel/component/aws2/lambda/Lambda2EndpointConfigurer.java
new file mode 100644
index 0000000..0444d65
--- /dev/null
+++ b/components/camel-aws2-lambda/src/generated/java/org/apache/camel/component/aws2/lambda/Lambda2EndpointConfigurer.java
@@ -0,0 +1,42 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws2.lambda;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class Lambda2EndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        Lambda2Endpoint target = (Lambda2Endpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "operation": target.getConfiguration().setOperation(property(camelContext, org.apache.camel.component.aws2.lambda.Lambda2Operations.class, value)); return true;
+        case "region": target.getConfiguration().setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "awslambdaclient":
+        case "awsLambdaClient": target.getConfiguration().setAwsLambdaClient(property(camelContext, software.amazon.awssdk.services.lambda.LambdaClient.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        case "proxyhost":
+        case "proxyHost": target.getConfiguration().setProxyHost(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyport":
+        case "proxyPort": target.getConfiguration().setProxyPort(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "proxyprotocol":
+        case "proxyProtocol": target.getConfiguration().setProxyProtocol(property(camelContext, software.amazon.awssdk.core.Protocol.class, value)); return true;
+        case "accesskey":
+        case "accessKey": target.getConfiguration().setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": target.getConfiguration().setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+}
+
diff --git a/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 0000000..b0e3bec
--- /dev/null
+++ b/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=aws2-lambda
+groupId=org.apache.camel
+artifactId=camel-aws2-lambda
+version=3.1.0-SNAPSHOT
+projectName=Camel :: AWS2 Lambda
+projectDescription=A Camel Amazon Lambda We Service Component Version 2
diff --git a/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-lambda b/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-lambda
new file mode 100644
index 0000000..8c3ec40
--- /dev/null
+++ b/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-lambda
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.lambda.Lambda2Component
diff --git a/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-lambda-component b/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-lambda-component
new file mode 100644
index 0000000..e728d8d
--- /dev/null
+++ b/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-lambda-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.lambda.Lambda2ComponentConfigurer
diff --git a/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-lambda-endpoint b/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-lambda-endpoint
new file mode 100644
index 0000000..3b58638a
--- /dev/null
+++ b/components/camel-aws2-lambda/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-lambda-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.lambda.Lambda2EndpointConfigurer
diff --git a/components/camel-aws2-lambda/src/generated/resources/org/apache/camel/component/aws2/lambda/aws2-lambda.json b/components/camel-aws2-lambda/src/generated/resources/org/apache/camel/component/aws2/lambda/aws2-lambda.json
new file mode 100644
index 0000000..a616bac
--- /dev/null
+++ b/components/camel-aws2-lambda/src/generated/resources/org/apache/camel/component/aws2/lambda/aws2-lambda.json
@@ -0,0 +1,43 @@
+{
+  "component": {
+    "kind": "component",
+    "scheme": "aws2-lambda",
+    "extendsScheme": "",
+    "syntax": "aws2-lambda:function",
+    "title": "AWS Lambda",
+    "description": "The aws-lambda is used for managing and invoking functions from Amazon Lambda.",
+    "label": "cloud,computing,serverless",
+    "deprecated": false,
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.aws2.lambda.Lambda2Component",
+    "firstVersion": "3.2.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-lambda",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "componentProperties": {
+    "accessKey": { "kind": "property", "displayName": "Access Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Access Key" },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the r [...]
+    "region": { "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Region" },
+    "secretKey": { "kind": "property", "displayName": "Secret Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Secret Key" },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws2.lambda.Lambda2Configuration", "deprecated": false, "secret": false, "description": "The AWS Lambda default configuration" }
+  },
+  "properties": {
+    "function": { "kind": "path", "displayName": "Function", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "Name of the Lambda function." },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the  [...]
+    "operation": { "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws2.lambda.Lambda2Operations", "enum": [ "listFunctions", "getFunction", "createAlias", "deleteAlias", "getAlias", "listAliases", "createFunction", "deleteFunction", "invokeFunction", "updateFunction", "createEventSourceMapping", "deleteEventSourceMapping", "listEventSourceMapping", "listTags", "tagResource", " [...]
+    "region": { "kind": "parameter", "displayName": "Region", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.lambda.Lambda2Configuration", "configurationField": "configuration", "description": "Amazon AWS Region. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1) You'll [...]
+    "awsLambdaClient": { "kind": "parameter", "displayName": "Aws Lambda Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.lambda.LambdaClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.lambda.Lambda2Configuration", "configurationField": "configuration", "description": "To use a existing configured AwsLambdaClient as client" },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "proxyHost": { "kind": "parameter", "displayName": "Proxy Host", "group": "proxy", "label": "proxy", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.lambda.Lambda2Configuration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the Lambda client" },
+    "proxyPort": { "kind": "parameter", "displayName": "Proxy Port", "group": "proxy", "label": "proxy", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.lambda.Lambda2Configuration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the Lambda client" },
+    "proxyProtocol": { "kind": "parameter", "displayName": "Proxy Protocol", "group": "proxy", "label": "proxy", "required": false, "type": "object", "javaType": "software.amazon.awssdk.core.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws2.lambda.Lambda2Configuration", "configurationField": "configuration", "description": "To define a proxy protocol when instantiating the Lambda c [...]
+    "accessKey": { "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.lambda.Lambda2Configuration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.lambda.Lambda2Configuration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  }
+}
diff --git a/components/camel-aws2-lambda/src/main/docs/aws-lambda-component.adoc b/components/camel-aws2-lambda/src/main/docs/aws-lambda-component.adoc
new file mode 100644
index 0000000..8fe3cac
--- /dev/null
+++ b/components/camel-aws2-lambda/src/main/docs/aws-lambda-component.adoc
@@ -0,0 +1,229 @@
+[[aws-lambda-component]]
+= AWS Lambda Component
+
+*Since Camel 2.20*
+
+// HEADER START
+*Only producer is supported*
+// HEADER END
+
+The Lambda component supports create, get, list, delete and invoke
+https://aws.amazon.com/lambda/[AWS Lambda] functions.
+
+*Prerequisites*
+
+You must have a valid Amazon Web Services developer account, and be
+signed up to use Amazon Lambda. More information is available at
+https://aws.amazon.com/lambda/[AWS Lambda].
+
+When creating a Lambda function, you need to specify a IAM role which has at least the AWSLambdaBasicExecuteRole policy attached.
+
+*Warning*
+
+Lambda is regional service. Unlike S3 bucket, Lambda function created in a given region is not available on other regions.
+
+== URI Format
+
+[source,java]
+-------------------------
+aws-lambda://functionName[?options]
+-------------------------
+
+You can append query options to the URI in the following format,
+?options=value&option2=value&...
+
+== URI Options
+
+
+// component options: START
+The AWS Lambda component supports 6 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *accessKey* (producer) | Amazon AWS Access Key |  | String
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *region* (producer) | Amazon AWS Region |  | String
+| *secretKey* (producer) | Amazon AWS Secret Key |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *configuration* (advanced) | The AWS Lambda default configuration |  | LambdaConfiguration
+|===
+// component options: END
+
+
+
+
+// endpoint options: START
+The AWS Lambda endpoint is configured using URI syntax:
+
+----
+aws-lambda:function
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *function* | *Required* Name of the Lambda function. |  | String
+|===
+
+
+=== Query Parameters (11 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *operation* (producer) | The operation to perform. It can be listFunctions, getFunction, createFunction, deleteFunction or invokeFunction. The value can be one of: listFunctions, getFunction, createAlias, deleteAlias, getAlias, listAliases, createFunction, deleteFunction, invokeFunction, updateFunction, createEventSourceMapping, deleteEventSourceMapping, listEventSourceMapping, listTags, tagResource, untagResource, publishVersion, listVersions | invokeFunction | LambdaOperations
+| *region* (producer) | Amazon AWS Region. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1) You'll need to use the name Regions.EU_WEST_1.name() |  | String
+| *awsLambdaClient* (advanced) | To use a existing configured AwsLambdaClient as client |  | AWSLambda
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *proxyHost* (proxy) | To define a proxy host when instantiating the Lambda client |  | String
+| *proxyPort* (proxy) | To define a proxy port when instantiating the Lambda client |  | Integer
+| *proxyProtocol* (proxy) | To define a proxy protocol when instantiating the Lambda client. The value can be one of: HTTP, HTTPS | HTTPS | Protocol
+| *accessKey* (security) | Amazon AWS Access Key |  | String
+| *secretKey* (security) | Amazon AWS Secret Key |  | String
+|===
+// endpoint options: END
+
+
+
+
+Required Lambda component options
+
+You have to provide the awsLambdaClient in the
+Registry or your accessKey and secretKey to access
+the https://aws.amazon.com/lambda/[Amazon Lambda] service.
+
+== Usage
+
+=== Message headers evaluated by the Lambda producer
+
+[width="100%",cols="5%,5%,10%,75%,5%",options="header",]
+|=======================================================================
+|Operation |Header |Type |Description |Required
+
+|All |`CamelAwsLambdaOperation` |`String` |The operation we want to perform. Override operation passed as query parameter| Yes
+
+|createFunction |`CamelAwsLambdaS3Bucket` |`String` |Amazon S3 bucket name where the .zip file containing
+your deployment package is stored. This bucket must reside in the same AWS region where you are creating the Lambda function.| No
+
+|createFunction |`CamelAwsLambdaS3Key` |`String` |The Amazon S3 object (the deployment package) key name
+you want to upload.| No
+
+|createFunction |`CamelAwsLambdaS3ObjectVersion` |String |The Amazon S3 object (the deployment package) version
+you want to upload.| No
+
+|createFunction |`CamelAwsLambdaZipFile` |`String` |The local path of the zip file (the deployment package).
+ Content of zip file can also be put in Message body.| No
+
+|createFunction |`CamelAwsLambdaRole` |`String` |The Amazon Resource Name (ARN) of the IAM role that Lambda assumes
+ when it executes your function to access any other Amazon Web Services (AWS) resources. |Yes
+
+|createFunction |`CamelAwsLambdaRuntime` |String |The runtime environment for the Lambda function you are uploading.
+ (nodejs, nodejs4.3, nodejs6.10, java8, python2.7, python3.6, dotnetcore1.0, odejs4.3-edge) |Yes
+
+|createFunction |`CamelAwsLambdaHandler` |`String` |The function within your code that Lambda calls to begin execution.
+ For Node.js, it is the module-name.export value in your function.
+ For Java, it can be package.class-name::handler or package.class-name.|Yes
+
+|createFunction |`CamelAwsLambdaDescription` |`String` |The user-provided description.|No
+
+|createFunction |`CamelAwsLambdaTargetArn` |`String` |The parent object that contains the target ARN (Amazon Resource Name)
+of an Amazon SQS queue or Amazon SNS topic.|No
+
+|createFunction |`CamelAwsLambdaMemorySize` |`Integer` |The memory size, in MB, you configured for the function.
+Must be a multiple of 64 MB.|No
+
+|createFunction |`CamelAwsLambdaKMSKeyArn` |`String` |The Amazon Resource Name (ARN) of the KMS key used to encrypt your function's environment variables.
+If not provided, AWS Lambda will use a default service key.|No
+
+|createFunction |`CamelAwsLambdaPublish` |`Boolean` |This boolean parameter can be used to request AWS Lambda
+to create the Lambda function and publish a version as an atomic operation.|No
+
+|createFunction |`CamelAwsLambdaTimeout` |`Integer` |The function execution time at which Lambda should terminate the function.
+The default is 3 seconds.|No
+
+|createFunction |`CamelAwsLambdaTracingConfig` |`String` |Your function's tracing settings (Active or PassThrough).|No
+
+|createFunction |`CamelAwsLambdaEnvironmentVariables` |`Map<String, String>` |The key-value pairs that represent your environment's configuration settings.|No
+
+|createFunction |`CamelAwsLambdaEnvironmentTags` |`Map<String, String>` |The list of tags (key-value pairs) assigned to the new function.|No
+
+|createFunction |`CamelAwsLambdaSecurityGroupIds` |`List<String>` |If your Lambda function accesses resources in a VPC, a list of one or more security groups IDs in your VPC.|No
+
+|createFunction |`CamelAwsLambdaSubnetIds` |`List<String>` |If your Lambda function accesses resources in a VPC, a list of one or more subnet IDs in your VPC.|No
+
+|createAlias |`CamelAwsLambdaFunctionVersion` |`String` |The function version to set in the alias|Yes
+
+|createAlias |`CamelAwsLambdaAliasFunctionName` |`String` |The function name to set in the alias|Yes
+
+|createAlias |`CamelAwsLambdaAliasFunctionDescription` |`String` |The function description to set in the alias|No
+
+|deleteAlias |`CamelAwsLambdaAliasFunctionName` |`String` |The function name of the alias|Yes
+
+|getAlias |`CamelAwsLambdaAliasFunctionName` |`String` |The function name of the alias|Yes
+
+|listAliases |`CamelAwsLambdaFunctionVersion` |`String` |The function version to set in the alias|Yes
+
+|=======================================================================
+
+== List of Avalaible Operations
+
+- listFunctions
+- getFunction
+- createFunction
+- deleteFunction
+- invokeFunction
+- updateFunction
+- createEventSourceMapping
+- deleteEventSourceMapping
+- listEventSourceMapping
+- listTags
+- tagResource
+- untagResource
+- publishVersion
+- listVersions
+- createAlias
+- deleteAlias
+- getAlias
+- listAliases
+
+== Example
+
+To have a full understanding of how the component works, you may have a look at this https://github.com/apache/camel/blob/master/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/integration/LambdaComponentIntegrationTest.java[integration test]
+
+== Automatic detection of AmazonLambda client in registry
+
+The component is capable of detecting the presence of an AmazonLambda bean into the registry.
+If it's the only instance of that type it will be used as client and you won't have to define it as uri parameter.
+This may be really useful for smarter configuration of the endpoint.
+
+
+== Dependencies
+
+Maven users will need to add the following dependency to their pom.xml.
+
+*pom.xml*
+
+[source,xml]
+---------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-aws-lambda</artifactId>
+    <version>${camel-version}</version>
+</dependency>
+---------------------------------------
+
+where `$\{camel-version\}` must be replaced by the actual version of Camel.
+
+
+include::camel-spring-boot::page$aws-lambda-starter.adoc[]
diff --git a/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Component.java b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Component.java
new file mode 100644
index 0000000..07ac75f
--- /dev/null
+++ b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Component.java
@@ -0,0 +1,119 @@
+/*
+ * 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.component.aws2.lambda;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+
+import software.amazon.awssdk.services.lambda.LambdaClient;
+
+@Component("aws2-lambda")
+public class Lambda2Component extends DefaultComponent {
+
+    @Metadata
+    private String accessKey;
+    @Metadata
+    private String secretKey;
+    @Metadata
+    private String region;
+    @Metadata(label = "advanced")    
+    private Lambda2Configuration configuration;
+    
+    public Lambda2Component() {
+        this(null);
+    }
+
+    public Lambda2Component(CamelContext context) {
+        super(context);
+        
+        registerExtension(new Lambda2ComponentVerifierExtension());
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        Lambda2Configuration configuration = this.configuration != null ? this.configuration.copy() : new Lambda2Configuration();
+        Lambda2Endpoint endpoint = new Lambda2Endpoint(uri, this, configuration);
+        endpoint.getConfiguration().setAccessKey(accessKey);
+        endpoint.getConfiguration().setSecretKey(secretKey);
+        endpoint.getConfiguration().setRegion(region);
+        setProperties(endpoint, parameters);
+        endpoint.setFunction(remaining);
+        checkAndSetRegistryClient(configuration);
+        if (configuration.getAwsLambdaClient() == null && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
+            throw new IllegalArgumentException("accessKey/secretKey or awsLambdaClient must be specified");
+        }
+
+        return endpoint;
+    }
+    
+    public Lambda2Configuration getConfiguration() {
+        return configuration;
+    }
+
+    /**
+     * The AWS Lambda default configuration
+     */
+    public void setConfiguration(Lambda2Configuration configuration) {
+        this.configuration = configuration;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    /**
+     * Amazon AWS Region
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+    
+    private void checkAndSetRegistryClient(Lambda2Configuration configuration) {
+        Set<LambdaClient> clients = getCamelContext().getRegistry().findByType(LambdaClient.class);
+        if (clients.size() == 1) {
+            configuration.setAwsLambdaClient(clients.stream().findFirst().get());
+        }
+    }
+}
diff --git a/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ComponentVerifierExtension.java b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ComponentVerifierExtension.java
new file mode 100644
index 0000000..396f29a
--- /dev/null
+++ b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ComponentVerifierExtension.java
@@ -0,0 +1,85 @@
+/*
+ * 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.component.aws2.lambda;
+
+import java.util.Map;
+
+import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExtension;
+import org.apache.camel.component.extension.verifier.ResultBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorHelper;
+
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.core.exception.SdkClientException;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.lambda.LambdaClient;
+import software.amazon.awssdk.services.lambda.LambdaClientBuilder;
+
+public class Lambda2ComponentVerifierExtension extends DefaultComponentVerifierExtension {
+
+    public Lambda2ComponentVerifierExtension() {
+        this("aws2-lambda");
+    }
+
+    public Lambda2ComponentVerifierExtension(String scheme) {
+        super(scheme);
+    }
+
+    // *********************************
+    // Parameters validation
+    // *********************************
+
+    @Override
+    protected Result verifyParameters(Map<String, Object> parameters) {
+
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS).error(ResultErrorHelper.requiresOption("accessKey", parameters))
+            .error(ResultErrorHelper.requiresOption("secretKey", parameters)).error(ResultErrorHelper.requiresOption("region", parameters));
+
+        // Validate using the catalog
+
+        super.verifyParametersAgainstCatalog(builder, parameters);
+
+        return builder.build();
+    }
+
+    // *********************************
+    // Connectivity validation
+    // *********************************
+
+    @Override
+    protected Result verifyConnectivity(Map<String, Object> parameters) {
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY);
+
+        try {
+            Lambda2Configuration configuration = setProperties(new Lambda2Configuration(), parameters);
+            AwsBasicCredentials cred = AwsBasicCredentials.create(configuration.getAccessKey(), configuration.getSecretKey());
+            LambdaClientBuilder clientBuilder = LambdaClient.builder();
+            LambdaClient client = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred)).region(Region.of(configuration.getRegion())).build();
+            client.listFunctions();
+        } catch (SdkClientException e) {
+            ResultErrorBuilder errorBuilder = ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, e.getMessage())
+                .detail("aws_lambda_exception_message", e.getMessage()).detail(VerificationError.ExceptionAttribute.EXCEPTION_CLASS, e.getClass().getName())
+                .detail(VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE, e);
+
+            builder.error(errorBuilder.build());
+        } catch (Exception e) {
+            builder.error(ResultErrorBuilder.withException(e).build());
+        }
+        return builder.build();
+    }
+}
diff --git a/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Configuration.java b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Configuration.java
new file mode 100644
index 0000000..f3195a0
--- /dev/null
+++ b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Configuration.java
@@ -0,0 +1,147 @@
+/*
+ * 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.component.aws2.lambda;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.services.lambda.LambdaClient;
+
+@UriParams
+public class Lambda2Configuration implements Cloneable {
+
+    @UriParam(defaultValue = "invokeFunction")
+    private Lambda2Operations operation = Lambda2Operations.invokeFunction;
+    @UriParam(label = "security", secret = true)
+    private String accessKey;
+    @UriParam(label = "security", secret = true)
+    private String secretKey;
+    @UriParam(label = "producer")
+    private String region;
+    @UriParam(label = "proxy", enums = "HTTP,HTTPS", defaultValue = "HTTPS")
+    private Protocol proxyProtocol = Protocol.HTTPS;
+    @UriParam(label = "proxy")
+    private String proxyHost;
+    @UriParam(label = "proxy")
+    private Integer proxyPort;
+    @UriParam(label = "advanced")
+    private LambdaClient awsLambdaClient;
+
+    public LambdaClient getAwsLambdaClient() {
+        return awsLambdaClient;
+    }
+
+    /**
+     * To use a existing configured AwsLambdaClient as client
+     */
+    public void setAwsLambdaClient(LambdaClient awsLambdaClient) {
+        this.awsLambdaClient = awsLambdaClient;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    /**
+     * Amazon AWS Region. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1)
+     * You'll need to use the name Regions.EU_WEST_1.name()
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    public Lambda2Operations getOperation() {
+        return operation;
+    }
+
+    /**
+     * The operation to perform. It can be listFunctions, getFunction, createFunction, deleteFunction or invokeFunction
+     */
+    public void setOperation(Lambda2Operations operation) {
+        this.operation = operation;
+    }
+    
+    public Protocol getProxyProtocol() {
+        return proxyProtocol;
+    }
+
+    /**
+     * To define a proxy protocol when instantiating the Lambda client
+     */
+    public void setProxyProtocol(Protocol proxyProtocol) {
+        this.proxyProtocol = proxyProtocol;
+    }
+
+    public String getProxyHost() {
+        return proxyHost;
+    }
+
+    /**
+     * To define a proxy host when instantiating the Lambda client
+     */
+    public void setProxyHost(String proxyHost) {
+        this.proxyHost = proxyHost;
+    }
+
+    public Integer getProxyPort() {
+        return proxyPort;
+    }
+
+    /**
+     * To define a proxy port when instantiating the Lambda client
+     */
+    public void setProxyPort(Integer proxyPort) {
+        this.proxyPort = proxyPort;
+    }
+    
+    // *************************************************
+    //
+    // *************************************************
+
+    public Lambda2Configuration copy() {
+        try {
+            return (Lambda2Configuration)super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+
+}
diff --git a/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Constants.java b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Constants.java
new file mode 100644
index 0000000..6e90d78
--- /dev/null
+++ b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Constants.java
@@ -0,0 +1,55 @@
+/*
+ * 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.component.aws2.lambda;
+
+/**
+ * Constants used in Camel AWS Lambda module
+ */
+public interface Lambda2Constants {
+
+    String OPERATION = "CamelAwsLambdaOperation";
+
+    String S3_BUCKET = "CamelAwsLambdaS3Bucket";
+    String S3_KEY = "CamelAwsLambdaS3Key";
+    String S3_OBJECT_VERSION = "CamelAwsLambdaS3ObjectVersion";
+    String ZIP_FILE = "CamelAwsLambdaZipFile";
+    String DESCRIPTION = "CamelAwsLambdaDescription";
+    String ROLE = "CamelAwsLambdaRole";
+    String RUNTIME = "CamelAwsLambdaRuntime";
+    String HANDLER = "CamelAwsLambdaHandler";
+    String TARGET_ARN = "CamelAwsLambdaTargetArn";
+    String MEMORY_SIZE = "CamelAwsLambdaMemorySize";
+    String KMS_KEY_ARN = "CamelAwsLambdaKMSKeyArn";
+    String ENVIRONMENT_VARIABLES = "CamelAwsLambdaEnvironmentVariables";
+    String PUBLISH = "CamelAwsLambdaPublish";
+    String TIMEOUT = "CamelAwsLambdaTimeout";
+    String TAGS = "CamelAwsLambdaTags";
+    String TRACING_CONFIG = "CamelAwsLambdaTracingConfig";
+    String SECURITY_GROUP_IDS = "CamelAwsLambdaSecurityGroupIds";
+    String SUBNET_IDS = "CamelAwsLambdaSubnetIds";
+    String EVENT_SOURCE_ARN = "CamelAwsLambdaEventSourceArn";
+    String EVENT_SOURCE_BATCH_SIZE = "CamelAwsLambdaEventSourceBatchSize";
+    String EVENT_SOURCE_UUID = "CamelAwsLambdaEventSourceUuid";
+    String RESOURCE_ARN = "CamelAwsLambdaResourceArn";
+    String RESOURCE_TAGS = "CamelAwsLambdaResourceTags";
+    String RESOURCE_TAG_KEYS = "CamelAwsLambdaResourceTagKeys";
+    String VERSION_DESCRIPTION = "CamelAwsLambdaVersionDescription";
+    String VERSION_REVISION_ID = "CamelAwsLambdaVersionRevisionId";
+    String FUNCTION_VERSION = "CamelAwsLambdaFunctionVersion";
+    String FUNCTION_ALIAS_NAME = "CamelAwsLambdaAliasFunctionName";
+    String FUNCTION_ALIAS_DESCRIPTION = "CamelAwsLambdaAliasFunctionDescription";
+}
\ No newline at end of file
diff --git a/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Endpoint.java b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Endpoint.java
new file mode 100644
index 0000000..606ee35
--- /dev/null
+++ b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Endpoint.java
@@ -0,0 +1,136 @@
+/*
+ * 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.component.aws2.lambda;
+
+import java.net.URI;
+
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.util.ObjectHelper;
+
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.lambda.LambdaClient;
+import software.amazon.awssdk.services.lambda.LambdaClientBuilder;
+
+/**
+ * The aws-lambda is used for managing and invoking functions from Amazon Lambda.
+ */
+@UriEndpoint(firstVersion = "3.2.0", scheme = "aws2-lambda", title = "AWS Lambda",
+    syntax = "aws2-lambda:function", producerOnly = true, label = "cloud,computing,serverless")
+public class Lambda2Endpoint extends DefaultEndpoint {
+
+    private LambdaClient awsLambdaClient;
+
+    @UriPath
+    @Metadata(required = true)
+    private String function;
+    @UriParam
+    private Lambda2Configuration configuration;
+
+    public Lambda2Endpoint(String uri, Component component, Lambda2Configuration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("You cannot receive messages from this endpoint");
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new Lambda2Producer(this);
+    }
+
+    public String getFunction() {
+        return function;
+    }
+
+    /**
+     * Name of the Lambda function.
+     */
+    public void setFunction(String function) {
+        this.function = function;
+    }
+
+    @Override
+    public void doStart() throws Exception {
+        super.doStart();
+        awsLambdaClient = configuration.getAwsLambdaClient() != null ? configuration.getAwsLambdaClient() : createLambdaClient();
+    }
+    
+    @Override
+    public void doStop() throws Exception {
+        if (ObjectHelper.isEmpty(configuration.getAwsLambdaClient())) {
+            if (awsLambdaClient != null) {
+                awsLambdaClient.close();
+            }
+        }
+        super.doStop();
+    }
+
+    public Lambda2Configuration getConfiguration() {
+        return configuration;
+    }
+
+    public LambdaClient getAwsLambdaClient() {
+        return awsLambdaClient;
+    }
+
+    LambdaClient createLambdaClient() {
+    	LambdaClient client = null;
+    	LambdaClientBuilder clientBuilder = LambdaClient.builder();
+        ProxyConfiguration.Builder proxyConfig = null;
+        ApacheHttpClient.Builder httpClientBuilder = null;
+        boolean isClientConfigFound = false;
+        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
+            proxyConfig = ProxyConfiguration.builder();
+            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + configuration.getProxyHost() + configuration.getProxyPort());
+            proxyConfig.endpoint(proxyEndpoint);
+            httpClientBuilder = ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
+            isClientConfigFound = true;
+        }
+        if (configuration.getAccessKey() != null && configuration.getSecretKey() != null) {
+            AwsBasicCredentials cred = AwsBasicCredentials.create(configuration.getAccessKey(), configuration.getSecretKey());
+            if (isClientConfigFound) {
+                clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder).credentialsProvider(StaticCredentialsProvider.create(cred));
+            } else {
+                clientBuilder = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred));
+            }
+        } else {
+            if (!isClientConfigFound) {
+                clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder);
+            }
+        }
+        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
+            clientBuilder = clientBuilder.region(Region.of(configuration.getRegion()));
+        }
+        client = clientBuilder.build();
+        return client;
+    }
+}
diff --git a/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Operations.java b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Operations.java
new file mode 100644
index 0000000..8f61204
--- /dev/null
+++ b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Operations.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.component.aws2.lambda;
+
+public enum Lambda2Operations {
+
+    listFunctions,
+    getFunction,
+    createAlias,
+    deleteAlias,
+    getAlias,
+    listAliases,
+    createFunction,
+    deleteFunction,
+    invokeFunction,
+    updateFunction,
+    createEventSourceMapping,
+    deleteEventSourceMapping,
+    listEventSourceMapping,
+    listTags,
+    tagResource,
+    untagResource,
+    publishVersion,
+    listVersions
+}
diff --git a/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Producer.java b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Producer.java
new file mode 100644
index 0000000..97fc9c5
--- /dev/null
+++ b/components/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Producer.java
@@ -0,0 +1,616 @@
+/*
+ * 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.component.aws2.lambda;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.util.CastUtils;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import software.amazon.awssdk.awscore.exception.AwsServiceException;
+import software.amazon.awssdk.core.SdkBytes;
+import software.amazon.awssdk.services.lambda.LambdaClient;
+import software.amazon.awssdk.services.lambda.model.CreateAliasRequest;
+import software.amazon.awssdk.services.lambda.model.CreateAliasResponse;
+import software.amazon.awssdk.services.lambda.model.CreateEventSourceMappingRequest;
+import software.amazon.awssdk.services.lambda.model.CreateEventSourceMappingResponse;
+import software.amazon.awssdk.services.lambda.model.CreateFunctionRequest;
+import software.amazon.awssdk.services.lambda.model.CreateFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.DeadLetterConfig;
+import software.amazon.awssdk.services.lambda.model.DeleteAliasRequest;
+import software.amazon.awssdk.services.lambda.model.DeleteAliasResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteEventSourceMappingRequest;
+import software.amazon.awssdk.services.lambda.model.DeleteEventSourceMappingResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteFunctionRequest;
+import software.amazon.awssdk.services.lambda.model.DeleteFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.Environment;
+import software.amazon.awssdk.services.lambda.model.FunctionCode;
+import software.amazon.awssdk.services.lambda.model.GetAliasRequest;
+import software.amazon.awssdk.services.lambda.model.GetAliasResponse;
+import software.amazon.awssdk.services.lambda.model.GetFunctionRequest;
+import software.amazon.awssdk.services.lambda.model.GetFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.InvokeRequest;
+import software.amazon.awssdk.services.lambda.model.InvokeResponse;
+import software.amazon.awssdk.services.lambda.model.ListAliasesRequest;
+import software.amazon.awssdk.services.lambda.model.ListAliasesResponse;
+import software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsRequest;
+import software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsResponse;
+import software.amazon.awssdk.services.lambda.model.ListFunctionsResponse;
+import software.amazon.awssdk.services.lambda.model.ListTagsRequest;
+import software.amazon.awssdk.services.lambda.model.ListTagsResponse;
+import software.amazon.awssdk.services.lambda.model.ListVersionsByFunctionRequest;
+import software.amazon.awssdk.services.lambda.model.ListVersionsByFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.PublishVersionRequest;
+import software.amazon.awssdk.services.lambda.model.PublishVersionResponse;
+import software.amazon.awssdk.services.lambda.model.Runtime;
+import software.amazon.awssdk.services.lambda.model.TagResourceRequest;
+import software.amazon.awssdk.services.lambda.model.TagResourceResponse;
+import software.amazon.awssdk.services.lambda.model.TracingConfig;
+import software.amazon.awssdk.services.lambda.model.UntagResourceRequest;
+import software.amazon.awssdk.services.lambda.model.UntagResourceResponse;
+import software.amazon.awssdk.services.lambda.model.UpdateFunctionCodeRequest;
+import software.amazon.awssdk.services.lambda.model.UpdateFunctionCodeResponse;
+import software.amazon.awssdk.services.lambda.model.VpcConfig;
+
+/**
+ * A Producer which sends messages to the Amazon Web Service Lambda <a
+ * href="https://aws.amazon.com/lambda/">AWS Lambda</a>
+ */
+public class Lambda2Producer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Lambda2Producer.class);
+
+    public Lambda2Producer(final Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public void process(final Exchange exchange) throws Exception {
+        switch (determineOperation(exchange)) {
+            case getFunction:
+                getFunction(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case createFunction:
+                createFunction(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case deleteFunction:
+                deleteFunction(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case invokeFunction:
+                invokeFunction(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case listFunctions:
+                listFunctions(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case updateFunction:
+                updateFunction(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case createEventSourceMapping:
+                createEventSourceMapping(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case deleteEventSourceMapping:
+                deleteEventSourceMapping(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case listEventSourceMapping:
+                listEventSourceMapping(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case listTags:
+                listTags(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case tagResource:
+                tagResource(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case untagResource:
+                untagResource(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case publishVersion:
+                publishVersion(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case listVersions:
+                listVersions(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case createAlias:
+                createAlias(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case deleteAlias:
+                deleteAlias(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case getAlias:
+                getAlias(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            case listAliases:
+                listAliases(getEndpoint().getAwsLambdaClient(), exchange);
+                break;
+            default:
+                throw new IllegalArgumentException("Unsupported operation");
+        }
+    }
+
+    private void getFunction(LambdaClient lambdaClient, Exchange exchange) {
+        GetFunctionResponse result;
+        try {
+            result = lambdaClient.getFunction(GetFunctionRequest.builder().functionName(getEndpoint().getFunction()).build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("getFunction command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void deleteFunction(LambdaClient lambdaClient, Exchange exchange) {
+        DeleteFunctionResponse result;
+        try {
+            result = lambdaClient.deleteFunction(DeleteFunctionRequest.builder().functionName(getEndpoint().getFunction()).build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("deleteFunction command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void listFunctions(LambdaClient lambdaClient, Exchange exchange) {
+        ListFunctionsResponse result;
+        try {
+            result = lambdaClient.listFunctions();
+        } catch (AwsServiceException ase) {
+            LOG.trace("listFunctions command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void invokeFunction(LambdaClient lambdaClient, Exchange exchange) {
+        InvokeResponse result;
+        try {
+            InvokeRequest request = InvokeRequest.builder()
+                    .functionName(getEndpoint().getFunction())
+                    .payload(SdkBytes.fromString(exchange.getIn().getBody(String.class), Charset.defaultCharset())).build();
+            result = lambdaClient.invoke(request);
+        } catch (AwsServiceException ase) {
+            LOG.trace("invokeFunction command returned the error code {}",  ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result.payload().asUtf8String());
+    }
+
+    private void createFunction(LambdaClient lambdaClient, Exchange exchange) throws Exception {
+        CreateFunctionResponse result;
+
+        try {
+            CreateFunctionRequest.Builder request = CreateFunctionRequest.builder()
+                    .functionName(getEndpoint().getFunction());
+
+            FunctionCode.Builder functionCode = FunctionCode.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_BUCKET))) {
+                String s3Bucket = exchange.getIn().getHeader(Lambda2Constants.S3_BUCKET, String.class);
+                functionCode.s3Bucket(s3Bucket);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_KEY))) {
+                String s3Key = exchange.getIn().getHeader(Lambda2Constants.S3_KEY, String.class);
+                functionCode.s3Key(s3Key);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_OBJECT_VERSION))) {
+                String s3ObjectVersion = exchange.getIn().getHeader(Lambda2Constants.S3_OBJECT_VERSION, String.class);
+                functionCode.s3ObjectVersion(s3ObjectVersion);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.ZIP_FILE))) {
+                String zipFile = exchange.getIn().getHeader(Lambda2Constants.ZIP_FILE, String.class);
+                File fileLocalPath = new File(zipFile);
+                try (FileInputStream inputStream = new FileInputStream(fileLocalPath)) {
+                    functionCode.zipFile(SdkBytes.fromInputStream(inputStream));
+                }
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getBody())) {
+                functionCode.zipFile(SdkBytes.fromByteBuffer(exchange.getIn().getBody(ByteBuffer.class)));
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getBody())
+                    || (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_BUCKET)) && ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_KEY)))) {
+                request.code(functionCode.build());
+            } else {
+                throw new IllegalArgumentException("At least S3 bucket/S3 key or zip file must be specified");
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.ROLE))) {
+                request.role(exchange.getIn().getHeader(Lambda2Constants.ROLE, String.class));
+            } else {
+                throw new IllegalArgumentException("Role must be specified");
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.RUNTIME))) {
+                request.runtime(exchange.getIn().getHeader(Lambda2Constants.RUNTIME, String.class));
+            } else {
+                throw new IllegalArgumentException("Runtime must be specified");
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.HANDLER))) {
+                request.handler(exchange.getIn().getHeader(Lambda2Constants.HANDLER, String.class));
+            } else {
+                throw new IllegalArgumentException("Handler must be specified");
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.DESCRIPTION))) {
+                String description = exchange.getIn().getHeader(Lambda2Constants.DESCRIPTION, String.class);
+                request.description(description);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.TARGET_ARN))) {
+                String targetArn = exchange.getIn().getHeader(Lambda2Constants.TARGET_ARN, String.class);
+                request.deadLetterConfig(DeadLetterConfig.builder().targetArn(targetArn).build());
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.MEMORY_SIZE))) {
+                Integer memorySize = exchange.getIn().getHeader(Lambda2Constants.MEMORY_SIZE, Integer.class);
+                request.memorySize(memorySize);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.KMS_KEY_ARN))) {
+                String kmsKeyARN = exchange.getIn().getHeader(Lambda2Constants.KMS_KEY_ARN, String.class);
+                request.kmsKeyArn(kmsKeyARN);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.PUBLISH))) {
+                Boolean publish = exchange.getIn().getHeader(Lambda2Constants.PUBLISH, Boolean.class);
+                request.publish(publish);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.TIMEOUT))) {
+                Integer timeout = exchange.getIn().getHeader(Lambda2Constants.TIMEOUT, Integer.class);
+                request.timeout(timeout);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.TRACING_CONFIG))) {
+                String tracingConfigMode = exchange.getIn().getHeader(Lambda2Constants.TRACING_CONFIG, String.class);
+                request.tracingConfig(TracingConfig.builder().mode(tracingConfigMode).build());
+            }
+
+            Map<String, String> environmentVariables = CastUtils.cast(exchange.getIn().getHeader(Lambda2Constants.ENVIRONMENT_VARIABLES, Map.class));
+            if (environmentVariables != null) {
+                request.environment(Environment.builder().variables(environmentVariables).build());
+            }
+
+            Map<String, String> tags = CastUtils.cast(exchange.getIn().getHeader(Lambda2Constants.TAGS, Map.class));
+            if (tags != null) {
+                request.tags(tags);
+            }
+
+            List<String> securityGroupIds = CastUtils.cast(exchange.getIn().getHeader(Lambda2Constants.SECURITY_GROUP_IDS, (Class<List<String>>) (Object) List.class));
+            List<String> subnetIds = CastUtils.cast(exchange.getIn().getHeader(Lambda2Constants.SUBNET_IDS, (Class<List<String>>) (Object) List.class));
+            if (securityGroupIds != null || subnetIds != null) {
+                VpcConfig.Builder vpcConfig = VpcConfig.builder();
+                if (securityGroupIds != null) {
+                    vpcConfig.securityGroupIds(securityGroupIds);
+                }
+                if (subnetIds != null) {
+                    vpcConfig.subnetIds(subnetIds);
+                }
+                request.vpcConfig(vpcConfig.build());
+            }
+            result = lambdaClient.createFunction(request.build());
+
+        } catch (AwsServiceException ase) {
+            LOG.trace("createFunction command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void updateFunction(LambdaClient lambdaClient, Exchange exchange) throws Exception {
+        UpdateFunctionCodeResponse result;
+
+        try {
+            UpdateFunctionCodeRequest.Builder request = UpdateFunctionCodeRequest.builder()
+                    .functionName(getEndpoint().getFunction());
+
+
+            if (ObjectHelper.isEmpty(exchange.getIn().getBody())
+                    && (ObjectHelper.isEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_BUCKET)) && ObjectHelper.isEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_KEY)))) {
+                throw new IllegalArgumentException("At least S3 bucket/S3 key or zip file must be specified");
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.PUBLISH))) {
+                Boolean publish = exchange.getIn().getHeader(Lambda2Constants.PUBLISH, Boolean.class);
+                request.publish(publish);
+            }
+
+            result = lambdaClient.updateFunctionCode(request.build());
+
+        } catch (AwsServiceException ase) {
+            LOG.trace("updateFunction command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void createEventSourceMapping(LambdaClient lambdaClient, Exchange exchange) {
+        CreateEventSourceMappingResponse result;
+        try {
+            CreateEventSourceMappingRequest.Builder request = CreateEventSourceMappingRequest.builder().functionName(getEndpoint().getFunction());
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.EVENT_SOURCE_ARN))) {
+                request.eventSourceArn(exchange.getIn().getHeader(Lambda2Constants.EVENT_SOURCE_ARN, String.class));
+            } else {
+                throw new IllegalArgumentException("Event Source Arn must be specified");
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.EVENT_SOURCE_BATCH_SIZE))) {
+                Integer batchSize = exchange.getIn().getHeader(Lambda2Constants.EVENT_SOURCE_BATCH_SIZE, Integer.class);
+                request.batchSize(batchSize);
+            }
+            result = lambdaClient.createEventSourceMapping(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("createEventSourceMapping command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void deleteEventSourceMapping(LambdaClient lambdaClient, Exchange exchange) {
+        DeleteEventSourceMappingResponse result;
+        try {
+            DeleteEventSourceMappingRequest.Builder request = DeleteEventSourceMappingRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.EVENT_SOURCE_UUID))) {
+                request.uuid(exchange.getIn().getHeader(Lambda2Constants.EVENT_SOURCE_UUID, String.class));
+            } else {
+                throw new IllegalArgumentException("Event Source Arn must be specified");
+            }
+            result = lambdaClient.deleteEventSourceMapping(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("deleteEventSourceMapping command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void listEventSourceMapping(LambdaClient lambdaClient, Exchange exchange) {
+        ListEventSourceMappingsResponse result;
+        try {
+            ListEventSourceMappingsRequest.Builder request = ListEventSourceMappingsRequest.builder().functionName(getEndpoint().getFunction());
+            result = lambdaClient.listEventSourceMappings(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("listEventSourceMapping command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void listTags(LambdaClient lambdaClient, Exchange exchange) {
+        ListTagsResponse result;
+        try {
+            ListTagsRequest.Builder request = ListTagsRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.RESOURCE_ARN))) {
+                String resource = exchange.getIn().getHeader(Lambda2Constants.RESOURCE_ARN, String.class);
+                request.resource(resource);
+            } else {
+                throw new IllegalArgumentException("The resource ARN must be specified");
+            }
+            result = lambdaClient.listTags(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("listTags command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void tagResource(LambdaClient lambdaClient, Exchange exchange) {
+        TagResourceResponse result;
+        try {
+            TagResourceRequest.Builder request = TagResourceRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.RESOURCE_ARN))) {
+                String resource = exchange.getIn().getHeader(Lambda2Constants.RESOURCE_ARN, String.class);
+                request.resource(resource);
+            } else {
+                throw new IllegalArgumentException("The resource ARN must be specified");
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.RESOURCE_TAGS))) {
+                Map<String, String> tags = exchange.getIn().getHeader(Lambda2Constants.RESOURCE_TAGS, Map.class);
+                request.tags(tags);
+            } else {
+                throw new IllegalArgumentException("The tags must be specified");
+            }
+            result = lambdaClient.tagResource(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("listTags command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void untagResource(LambdaClient lambdaClient, Exchange exchange) {
+        UntagResourceResponse result;
+        try {
+            UntagResourceRequest.Builder request = UntagResourceRequest.builder();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.RESOURCE_ARN))) {
+                String resource = exchange.getIn().getHeader(Lambda2Constants.RESOURCE_ARN, String.class);
+                request.resource(resource);
+            } else {
+                throw new IllegalArgumentException("The resource ARN must be specified");
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.RESOURCE_TAG_KEYS))) {
+                List<String> tagKeys = exchange.getIn().getHeader(Lambda2Constants.RESOURCE_TAG_KEYS, List.class);
+                request.tagKeys(tagKeys);
+            } else {
+                throw new IllegalArgumentException("The tag keys must be specified");
+            }
+            result = lambdaClient.untagResource(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("untagResource command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void publishVersion(LambdaClient lambdaClient, Exchange exchange) {
+        PublishVersionResponse result;
+        try {
+            PublishVersionRequest.Builder request = PublishVersionRequest.builder().functionName(getEndpoint().getFunction());
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.VERSION_DESCRIPTION))) {
+                String description = exchange.getIn().getHeader(Lambda2Constants.VERSION_DESCRIPTION, String.class);
+                request.description(description);
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.VERSION_REVISION_ID))) {
+                String revisionId = exchange.getIn().getHeader(Lambda2Constants.VERSION_REVISION_ID, String.class);
+                request.revisionId(revisionId);
+            }
+            result = lambdaClient.publishVersion(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("publishVersion command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void listVersions(LambdaClient lambdaClient, Exchange exchange) {
+        ListVersionsByFunctionResponse result;
+        try {
+            ListVersionsByFunctionRequest request = ListVersionsByFunctionRequest.builder().functionName(getEndpoint().getFunction()).build();
+            result = lambdaClient.listVersionsByFunction(request);
+        } catch (AwsServiceException ase) {
+            LOG.trace("publishVersion command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void createAlias(LambdaClient lambdaClient, Exchange exchange) {
+        CreateAliasResponse result;
+        try {
+            CreateAliasRequest.Builder request = CreateAliasRequest.builder().functionName(getEndpoint().getFunction());
+            String version = exchange.getIn().getHeader(Lambda2Constants.FUNCTION_VERSION, String.class);
+            String aliasName = exchange.getIn().getHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, String.class);
+            if (ObjectHelper.isEmpty(version) || ObjectHelper.isEmpty(aliasName)) {
+                throw new IllegalArgumentException("Function Version and alias must be specified to create an alias");
+            }
+            request.functionVersion(version);
+            request.name(aliasName);
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.FUNCTION_ALIAS_DESCRIPTION))) {
+                String aliasDescription = exchange.getIn().getHeader(Lambda2Constants.FUNCTION_ALIAS_DESCRIPTION, String.class);
+                request.description(aliasDescription);
+            }
+            result = lambdaClient.createAlias(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("createAlias command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void deleteAlias(LambdaClient lambdaClient, Exchange exchange) {
+        DeleteAliasResponse result;
+        try {
+            DeleteAliasRequest.Builder request = DeleteAliasRequest.builder().functionName(getEndpoint().getFunction());
+            String aliasName = exchange.getIn().getHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, String.class);
+            if (ObjectHelper.isEmpty(aliasName)) {
+                throw new IllegalArgumentException("Function alias must be specified to delete an alias");
+            }
+            request.name(aliasName);
+            result = lambdaClient.deleteAlias(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("deleteAlias command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void getAlias(LambdaClient lambdaClient, Exchange exchange) {
+        GetAliasResponse result;
+        try {
+            GetAliasRequest.Builder request = GetAliasRequest.builder().functionName(getEndpoint().getFunction());
+            String aliasName = exchange.getIn().getHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, String.class);
+            if (ObjectHelper.isEmpty(aliasName)) {
+                throw new IllegalArgumentException("Function alias must be specified to get an alias");
+            }
+            request.name(aliasName);
+            result = lambdaClient.getAlias(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("getAlias command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private void listAliases(LambdaClient lambdaClient, Exchange exchange) {
+        ListAliasesResponse result;
+        try {
+            ListAliasesRequest.Builder request = ListAliasesRequest.builder().functionName(getEndpoint().getFunction());
+            String version = exchange.getIn().getHeader(Lambda2Constants.FUNCTION_VERSION, String.class);
+            if (ObjectHelper.isEmpty(version)) {
+                throw new IllegalArgumentException("Function Version must be specified to list aliases for a function");
+            }
+            request.functionVersion(version);
+            result = lambdaClient.listAliases(request.build());
+        } catch (AwsServiceException ase) {
+            LOG.trace("listAliases command returned the error code {}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+
+    private Lambda2Operations determineOperation(Exchange exchange) {
+        Lambda2Operations operation = exchange.getIn().getHeader(Lambda2Constants.OPERATION, Lambda2Operations.class);
+        if (operation == null) {
+            operation = getConfiguration().getOperation() == null ? Lambda2Operations.invokeFunction : getConfiguration().getOperation();
+        }
+        return operation;
+    }
+
+    protected Lambda2Configuration getConfiguration() {
+        return getEndpoint().getConfiguration();
+    }
+
+    @Override
+    public Lambda2Endpoint getEndpoint() {
+        return (Lambda2Endpoint) super.getEndpoint();
+    }
+
+    public static Message getMessageForResponse(final Exchange exchange) {
+        return exchange.getMessage();
+    }
+
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/AmazonLambdaClientMock.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/AmazonLambdaClientMock.java
new file mode 100644
index 0000000..a52b2e7
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/AmazonLambdaClientMock.java
@@ -0,0 +1,300 @@
+/*
+ * 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.component.aws2.lambda;
+
+import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import software.amazon.awssdk.core.SdkBytes;
+import software.amazon.awssdk.services.lambda.LambdaClient;
+import software.amazon.awssdk.services.lambda.model.AliasConfiguration;
+import software.amazon.awssdk.services.lambda.model.CreateAliasRequest;
+import software.amazon.awssdk.services.lambda.model.CreateAliasResponse;
+import software.amazon.awssdk.services.lambda.model.CreateEventSourceMappingRequest;
+import software.amazon.awssdk.services.lambda.model.CreateEventSourceMappingResponse;
+import software.amazon.awssdk.services.lambda.model.CreateFunctionRequest;
+import software.amazon.awssdk.services.lambda.model.CreateFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteAliasRequest;
+import software.amazon.awssdk.services.lambda.model.DeleteAliasResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteEventSourceMappingRequest;
+import software.amazon.awssdk.services.lambda.model.DeleteEventSourceMappingResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteFunctionRequest;
+import software.amazon.awssdk.services.lambda.model.DeleteFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.EventSourceMappingConfiguration;
+import software.amazon.awssdk.services.lambda.model.FunctionConfiguration;
+import software.amazon.awssdk.services.lambda.model.GetAliasRequest;
+import software.amazon.awssdk.services.lambda.model.GetAliasResponse;
+import software.amazon.awssdk.services.lambda.model.GetFunctionRequest;
+import software.amazon.awssdk.services.lambda.model.GetFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.InvokeRequest;
+import software.amazon.awssdk.services.lambda.model.InvokeResponse;
+import software.amazon.awssdk.services.lambda.model.ListAliasesRequest;
+import software.amazon.awssdk.services.lambda.model.ListAliasesResponse;
+import software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsRequest;
+import software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsResponse;
+import software.amazon.awssdk.services.lambda.model.ListFunctionsResponse;
+import software.amazon.awssdk.services.lambda.model.ListTagsRequest;
+import software.amazon.awssdk.services.lambda.model.ListTagsResponse;
+import software.amazon.awssdk.services.lambda.model.ListVersionsByFunctionRequest;
+import software.amazon.awssdk.services.lambda.model.ListVersionsByFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.PublishVersionRequest;
+import software.amazon.awssdk.services.lambda.model.PublishVersionResponse;
+import software.amazon.awssdk.services.lambda.model.TagResourceRequest;
+import software.amazon.awssdk.services.lambda.model.TagResourceResponse;
+import software.amazon.awssdk.services.lambda.model.TracingConfigResponse;
+import software.amazon.awssdk.services.lambda.model.TracingMode;
+import software.amazon.awssdk.services.lambda.model.UntagResourceRequest;
+import software.amazon.awssdk.services.lambda.model.UntagResourceResponse;
+import software.amazon.awssdk.services.lambda.model.UpdateFunctionCodeRequest;
+import software.amazon.awssdk.services.lambda.model.UpdateFunctionCodeResponse;
+
+public class AmazonLambdaClientMock implements LambdaClient {
+
+    public AmazonLambdaClientMock() {
+    }
+
+
+    @Override
+    public CreateAliasResponse createAlias(CreateAliasRequest createAliasRequest) {
+        CreateAliasResponse.Builder result = CreateAliasResponse.builder();
+        result.functionVersion("1");
+        result.name("alias");
+        result.description("an alias");
+        return result.build();
+    }
+
+    @Override
+    public CreateEventSourceMappingResponse createEventSourceMapping(CreateEventSourceMappingRequest createEventSourceMappingRequest) {
+    	CreateEventSourceMappingResponse.Builder result = CreateEventSourceMappingResponse.builder();
+        result.batchSize(100);
+        result.functionArn("arn:aws:lambda:eu-central-1:643534317684:function:" + createEventSourceMappingRequest.functionName());
+        result.state("Enabled");
+        result.eventSourceArn("arn:aws:sqs:eu-central-1:643534317684:testqueue");
+        return result.build();
+    }
+
+    @Override
+    public CreateFunctionResponse createFunction(CreateFunctionRequest createFunctionRequest) {
+
+    	CreateFunctionResponse.Builder result = CreateFunctionResponse.builder();
+
+        result.functionName(createFunctionRequest.functionName());
+        result.deadLetterConfig(createFunctionRequest.deadLetterConfig());
+        result.description(createFunctionRequest.description());
+        result.handler(createFunctionRequest.handler());
+        result.functionArn("arn:aws:lambda:eu-central-1:643534317684:function:" + createFunctionRequest.functionName());
+
+        result.role("arn:aws:iam::643534317684:role/" + createFunctionRequest.role());
+        result.codeSize(340L);
+        result.codeSha256("PKt5ygvZ6G8vWJASlWIypsBmKzAdmRrvTO");
+        result.memorySize(128);
+        result.timeout(3);
+        result.lastModified(Instant.now().toString());
+        result.version("$LATEST");
+        result.tracingConfig(TracingConfigResponse.builder().mode(TracingMode.PASS_THROUGH).build());
+        return result.build();
+    }
+
+    @Override
+    public DeleteAliasResponse deleteAlias(DeleteAliasRequest deleteAliasRequest) {
+        return DeleteAliasResponse.builder().build();
+    }
+
+    @Override
+    public DeleteEventSourceMappingResponse deleteEventSourceMapping(DeleteEventSourceMappingRequest deleteEventSourceMappingRequest) {
+    	return DeleteEventSourceMappingResponse.builder()
+        .uuid("a1239494949382882383")
+        .state("Deleting").build();
+    }
+
+    @Override
+    public DeleteFunctionResponse deleteFunction(DeleteFunctionRequest deleteFunctionRequest) {
+        return DeleteFunctionResponse.builder().build();
+    }
+
+    @Override
+    public GetAliasResponse getAlias(GetAliasRequest getAliasRequest) {
+    	return GetAliasResponse.builder()
+        .name("alias")
+        .description("an alias")
+        .functionVersion("1").build();
+    }
+
+    @Override
+    public GetFunctionResponse getFunction(GetFunctionRequest getFunctionRequest) {
+
+    	GetFunctionResponse.Builder result = GetFunctionResponse.builder();
+        FunctionConfiguration.Builder configuration = FunctionConfiguration.builder();
+        configuration.functionName(getFunctionRequest.functionName());
+        configuration.functionArn("arn:aws:lambda:eu-central-1:643534317684:function:" + getFunctionRequest.functionName());
+        configuration.runtime("nodejs6.10");
+        configuration.role("arn:aws:iam::643534317684:role/lambda-execution-role");
+        configuration.handler(getFunctionRequest.functionName() + ".handler");
+        configuration.codeSize(640L);
+        configuration.codeSha256("PKt5ygvZ6G8vWJASlWIypsBmKzAdmRrvTO/eBH06mBA=");
+        configuration.memorySize(128);
+        configuration.timeout(3);
+        configuration.lastModified(Instant.now().toString());
+        configuration.version("$LATEST");
+        configuration.tracingConfig(TracingConfigResponse.builder().mode(TracingMode.PASS_THROUGH).build());
+        result.configuration(configuration.build());
+        return result.build();
+    }
+
+    @Override
+    public InvokeResponse invoke(InvokeRequest invokeRequest) {
+    	InvokeResponse.Builder result = InvokeResponse.builder();
+
+        Map<String, String> payload = new HashMap<>();
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            payload = mapper.readValue(invokeRequest.payload().asUtf8String(), new TypeReference<Map<String, String>>() {
+            });
+        } catch (Exception e) {
+
+        }
+        String responsePayload = "{\"Hello\":\"" + payload.get("name") + "\"}";
+        result.payload(SdkBytes.fromByteArray(responsePayload.getBytes()));
+        return result.build();
+    }
+
+    @Override
+    public ListAliasesResponse listAliases(ListAliasesRequest listAliasesRequest) {
+    	ListAliasesResponse.Builder result = ListAliasesResponse.builder();
+        AliasConfiguration.Builder conf = AliasConfiguration.builder();
+        List<AliasConfiguration> list = new ArrayList<AliasConfiguration>();
+        conf.name("alias");
+        conf.description("an alias");
+        conf.functionVersion("1");
+        list.add(conf.build());
+        result.aliases(list);
+        return result.build();
+    }
+
+    @Override
+    public ListEventSourceMappingsResponse listEventSourceMappings(ListEventSourceMappingsRequest listEventSourceMappingsRequest) {
+    	ListEventSourceMappingsResponse.Builder result = ListEventSourceMappingsResponse.builder();
+        List<EventSourceMappingConfiguration> confList = new ArrayList<>();
+        EventSourceMappingConfiguration.Builder conf = EventSourceMappingConfiguration.builder();
+        conf.batchSize(100);
+        conf.functionArn("arn:aws:lambda:eu-central-1:643534317684:function:" + listEventSourceMappingsRequest.functionName());
+        conf.state("Enabled");
+        conf.eventSourceArn("arn:aws:sqs:eu-central-1:643534317684:testqueue");
+        confList.add(conf.build());
+        result.eventSourceMappings(confList);
+        return result.build();
+    }
+
+    @Override
+    public ListFunctionsResponse listFunctions() {
+
+    	ListFunctionsResponse.Builder result = ListFunctionsResponse.builder();
+        Collection<FunctionConfiguration> listFunctions = new ArrayList<>();
+        FunctionConfiguration.Builder configuration = FunctionConfiguration.builder();
+        configuration.functionName("GetHelloWithName");
+        configuration.functionArn("arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+        configuration.runtime("nodejs6.10");
+        configuration.role("arn:aws:iam::643534317684:role/lambda-execution-role");
+        configuration.handler("GetHelloWithName.handler");
+        configuration.codeSize(640L);
+        configuration.codeSha256("PKt5ygvZ6G8vWJASlWIypsBmKzAdmRrvTO/eBH06mBA=");
+        configuration.memorySize(128);
+        configuration.timeout(3);
+        configuration.lastModified(Instant.now().toString());
+        configuration.version("$LATEST");
+        configuration.tracingConfig(TracingConfigResponse.builder().mode(TracingMode.PASS_THROUGH).build());
+        listFunctions.add(configuration.build());
+        result.functions(listFunctions);
+        return result.build();
+    }
+
+    @Override
+    public ListTagsResponse listTags(ListTagsRequest listTagsRequest) {
+    	ListTagsResponse.Builder result = ListTagsResponse.builder();
+    	HashMap<String, String> map = new HashMap<String, String>();
+    	map.put("test", "lambda-tag");
+        result.tags(map);
+        return result.build();
+    }
+
+    @Override
+    public ListVersionsByFunctionResponse listVersionsByFunction(ListVersionsByFunctionRequest listVersionsByFunctionRequest) {
+    	ListVersionsByFunctionResponse.Builder res = ListVersionsByFunctionResponse.builder();
+        FunctionConfiguration.Builder conf = FunctionConfiguration.builder();
+        conf.version("1");
+        conf.functionName(listVersionsByFunctionRequest.functionName());
+        res.versions(Collections.singleton(conf.build()));
+        return res.build();
+    }
+
+    @Override
+    public PublishVersionResponse publishVersion(PublishVersionRequest publishVersionRequest) {
+    	PublishVersionResponse.Builder res = PublishVersionResponse.builder();
+        res.functionName(publishVersionRequest.functionName());
+        res.description(publishVersionRequest.description());
+        return res.build();
+    }
+
+    @Override
+    public TagResourceResponse tagResource(TagResourceRequest tagResourceRequest) {
+        return TagResourceResponse.builder().build();
+    }
+
+    @Override
+    public UntagResourceResponse untagResource(UntagResourceRequest untagResourceRequest) {
+        return UntagResourceResponse.builder().build();
+    }
+
+    @Override
+    public UpdateFunctionCodeResponse updateFunctionCode(UpdateFunctionCodeRequest updateFunctionCodeRequest) {
+    	UpdateFunctionCodeResponse.Builder result = UpdateFunctionCodeResponse.builder();
+
+        result.functionName(updateFunctionCodeRequest.functionName());
+        result.functionArn("arn:aws:lambda:eu-central-1:643534317684:function:" + updateFunctionCodeRequest.functionName());
+        result.codeSize(340L);
+        result.codeSha256("PKt5ygvZ6G8vWJASlWIypsBmKzAdmRrvTO");
+        result.memorySize(128);
+        result.timeout(3);
+        result.lastModified(Instant.now().toString());
+        result.version("$LATEST");
+        result.tracingConfig(TracingConfigResponse.builder().mode(TracingMode.PASS_THROUGH).build());
+        return result.build();
+    }
+
+
+	@Override
+	public String serviceName() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentClientRegistryTest.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentClientRegistryTest.java
new file mode 100644
index 0000000..e2a57c7
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentClientRegistryTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.component.aws2.lambda;
+
+import org.apache.camel.PropertyBindingException;
+import org.apache.camel.component.aws2.lambda.Lambda2Component;
+import org.apache.camel.component.aws2.lambda.Lambda2Endpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import software.amazon.awssdk.services.lambda.LambdaClient;
+
+public class LambdaComponentClientRegistryTest extends CamelTestSupport {
+
+    @Test
+    public void createEndpointWithMinimalKMSClientConfiguration() throws Exception {
+
+        LambdaClient awsLambdaClient = new AmazonLambdaClientMock();
+        context.getRegistry().bind("awsLambdaClient", awsLambdaClient);
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        Lambda2Endpoint endpoint = (Lambda2Endpoint) component.createEndpoint(
+                "aws2-lambda://myFunction?operation=getFunction&awsLambdaClient=#awsLambdaClient&accessKey=xxx&secretKey=yyy");
+
+        assertNotNull(endpoint.getConfiguration().getAwsLambdaClient());
+    }
+    
+    @Test(expected = PropertyBindingException.class)
+    public void createEndpointWithMinimalKMSClientMisconfiguration() throws Exception {
+
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        Lambda2Endpoint endpoint = (Lambda2Endpoint) component.createEndpoint(
+                "aws2-lambda://myFunction?operation=getFunction&awsLambdaClient=#awsLambdaClient&accessKey=xxx&secretKey=yyy");
+    }
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentConfigurationTest.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentConfigurationTest.java
new file mode 100644
index 0000000..60b14a4
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentConfigurationTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.component.aws2.lambda;
+
+import org.apache.camel.component.aws2.lambda.Lambda2Component;
+import org.apache.camel.component.aws2.lambda.Lambda2Endpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.lambda.LambdaClient;
+
+public class LambdaComponentConfigurationTest extends CamelTestSupport {
+
+    @Test
+    public void createEndpointWithMinimalConfiguration() throws Exception {
+        LambdaClient awsLambdaClient = new AmazonLambdaClientMock();
+        context.getRegistry().bind("awsLambdaClient", awsLambdaClient);
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        Lambda2Endpoint endpoint = (Lambda2Endpoint) component.createEndpoint(
+            "aws2-lambda://myFunction?operation=getFunction&awsLambdaClient=#awsLambdaClient&accessKey=xxx&secretKey=yyy");
+
+        assertEquals("xxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyy", endpoint.getConfiguration().getSecretKey());
+        assertNotNull(endpoint.getConfiguration().getAwsLambdaClient());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutOperation() throws Exception {
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        component.createEndpoint("aws2-lambda://myFunction");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutAmazonLambdaClientConfiguration() throws Exception {
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        component.createEndpoint("aws2-lambda://myFunction?operation=getFunction");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutAccessKeyConfiguration() throws Exception {
+        Lambda2Component component = context.getComponent("aws-lambda", Lambda2Component.class);
+        component.createEndpoint("aws2-lambda://myFunction?operation=getFunction&secretKey=yyy");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutSecretKeyConfiguration() throws Exception {
+        Lambda2Component component = context.getComponent("aws-lambda", Lambda2Component.class);
+        component.createEndpoint("aws2-lambda://myFunction?operation=getFunction&accessKey=xxx");
+    }
+
+    @Test
+    public void createEndpointWithoutSecretKeyAndAccessKeyConfiguration() throws Exception {
+        LambdaClient awsLambdaClient = new AmazonLambdaClientMock();
+        context.getRegistry().bind("awsLambdaClient", awsLambdaClient);
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        component.createEndpoint("aws2-lambda://myFunction?operation=getFunction&awsLambdaClient=#awsLambdaClient");
+    }
+    
+    @Test
+    public void createEndpointWithComponentElements() throws Exception {
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        Lambda2Endpoint endpoint = (Lambda2Endpoint)component.createEndpoint("aws2-lambda://myFunction");
+        
+        assertEquals("myFunction", endpoint.getFunction());
+        assertEquals("XXX", endpoint.getConfiguration().getAccessKey());
+        assertEquals("YYY", endpoint.getConfiguration().getSecretKey());
+    }
+    
+    @Test
+    public void createEndpointWithComponentAndEndpointElements() throws Exception {
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        component.setRegion(Region.US_WEST_1.toString());
+        Lambda2Endpoint endpoint = (Lambda2Endpoint)component.createEndpoint("aws2-lambda://myFunction?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1");
+        
+        assertEquals("myFunction", endpoint.getFunction());
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+    }
+    
+    @Test
+    public void createEndpointWithComponentEndpointElementsAndProxy() throws Exception {
+        Lambda2Component component = context.getComponent("aws2-lambda", Lambda2Component.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        component.setRegion(Region.US_WEST_1.toString());
+        Lambda2Endpoint endpoint = (Lambda2Endpoint)component.createEndpoint("aws2-lambda://label?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1&proxyHost=localhost&proxyPort=9000&proxyProtocol=HTTP");
+        
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+        assertEquals(Protocol.HTTP, endpoint.getConfiguration().getProxyProtocol());
+        assertEquals("localhost", endpoint.getConfiguration().getProxyHost());
+        assertEquals(Integer.valueOf(9000), endpoint.getConfiguration().getProxyPort());
+    }
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentSpringTest.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentSpringTest.java
new file mode 100644
index 0000000..c9c3d49
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentSpringTest.java
@@ -0,0 +1,337 @@
+/*
+ * 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.component.aws2.lambda;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.component.aws2.lambda.Lambda2Constants;
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import software.amazon.awssdk.core.SdkBytes;
+import software.amazon.awssdk.services.lambda.model.CreateAliasResponse;
+import software.amazon.awssdk.services.lambda.model.CreateEventSourceMappingResponse;
+import software.amazon.awssdk.services.lambda.model.CreateFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteAliasResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteEventSourceMappingResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.GetAliasResponse;
+import software.amazon.awssdk.services.lambda.model.GetFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.ListAliasesResponse;
+import software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsResponse;
+import software.amazon.awssdk.services.lambda.model.ListFunctionsResponse;
+import software.amazon.awssdk.services.lambda.model.ListTagsResponse;
+import software.amazon.awssdk.services.lambda.model.ListVersionsByFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.PublishVersionResponse;
+import software.amazon.awssdk.services.lambda.model.TagResourceResponse;
+import software.amazon.awssdk.services.lambda.model.UntagResourceResponse;
+
+public class LambdaComponentSpringTest extends CamelSpringTestSupport {
+
+    @Test
+    public void lambdaCreateFunctionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:createFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.RUNTIME, "nodejs6.10");
+                exchange.getIn().setHeader(Lambda2Constants.HANDLER, "GetHelloWithName.handler");
+                exchange.getIn().setHeader(Lambda2Constants.DESCRIPTION, "Hello with node.js on Lambda");
+                exchange.getIn().setHeader(Lambda2Constants.ROLE, "arn:aws:iam::643534317684:role/lambda-execution-role");
+
+                ClassLoader classLoader = getClass().getClassLoader();
+                File file = new File(classLoader.getResource("org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.zip").getFile());
+                FileInputStream inputStream = new FileInputStream(file);
+                exchange.getIn().setBody(inputStream);
+            }
+        });
+
+        CreateFunctionResponse result = (CreateFunctionResponse) exchange.getMessage().getBody();
+        assertEquals(result.functionName(), "GetHelloWithName");
+        assertEquals(result.description(), "Hello with node.js on Lambda");
+        assertNotNull(result.functionArn());
+        assertNotNull(result.codeSha256());
+    }
+
+    @Test
+    public void lambdaDeleteFunctionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:deleteFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+
+            }
+        });
+        assertNotNull(exchange.getMessage().getBody(DeleteFunctionResponse.class));
+    }
+
+
+    @Test
+    public void lambdaGetFunctionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:getFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+
+            }
+        });
+        GetFunctionResponse result = (GetFunctionResponse) exchange.getMessage().getBody();
+        assertEquals(result.configuration().functionName(), "GetHelloWithName");
+    }
+
+
+    @Test
+    public void lambdaListFunctionsTest() throws Exception {
+        Exchange exchange = template.send("direct:listFunctions", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+
+            }
+        });
+
+        ListFunctionsResponse result = (ListFunctionsResponse) exchange.getMessage().getBody();
+        assertEquals(result.functions().size(), 1);
+        assertEquals(result.functions().get(0).functionName(), "GetHelloWithName");
+    }
+
+
+    @Test
+    public void lambdaInvokeFunctionTest() throws Exception {
+        Exchange exchange = template.send("direct:invokeFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("{\"name\":\"Camel\"}");
+            }
+        });
+
+        assertNotNull(exchange.getMessage().getBody(String.class));
+        assertEquals(exchange.getMessage().getBody(String.class), "{\"Hello\":\"Camel\"}");
+    }
+    
+    @Test
+    public void lambdaCreateEventSourceMappingTest() throws Exception {
+        Exchange exchange = template.send("direct:createEventSourceMapping", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.EVENT_SOURCE_ARN, "arn:aws:sqs:eu-central-1:643534317684:testqueue");
+                exchange.getIn().setHeader(Lambda2Constants.EVENT_SOURCE_BATCH_SIZE, 100);
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        CreateEventSourceMappingResponse result = exchange.getMessage().getBody(CreateEventSourceMappingResponse.class);
+        assertEquals(result.functionArn(), "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+    }
+    
+    @Test
+    public void lambdaDeleteEventSourceMappingTest() throws Exception {
+        Exchange exchange = template.send("direct:deleteEventSourceMapping", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.EVENT_SOURCE_UUID, "a1239494949382882383");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        DeleteEventSourceMappingResponse result = exchange.getMessage().getBody(DeleteEventSourceMappingResponse.class);
+        assertTrue(result.state().equalsIgnoreCase("Deleting"));
+    }
+    
+    @Test
+    public void lambdaListEventSourceMappingTest() throws Exception {
+        Exchange exchange = template.send("direct:listEventSourceMapping", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        ListEventSourceMappingsResponse result = exchange.getMessage().getBody(ListEventSourceMappingsResponse.class);
+        assertEquals(result.eventSourceMappings().get(0).functionArn(), "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+    }
+    
+    @Test
+    public void lambdaListTagsTest() throws Exception {
+
+        Exchange exchange = template.send("direct:listTags", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_ARN, "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        ListTagsResponse result = (ListTagsResponse)exchange.getMessage().getBody();
+        assertEquals("lambda-tag", result.tags().get("test"));
+    }
+    
+    @Test
+    public void tagResourceTest() throws Exception {
+
+        Exchange exchange = template.send("direct:tagResource", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                Map<String, String> tags = new HashMap<>();
+                tags.put("test", "added-tag");
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_ARN, "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_TAGS, tags);
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        TagResourceResponse result = (TagResourceResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+    }
+    
+    @Test
+    public void untagResourceTest() throws Exception {
+
+        Exchange exchange = template.send("direct:untagResource", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                List<String> tagKeys = new ArrayList<>();
+                tagKeys.add("test");
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_ARN, "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_TAG_KEYS, tagKeys);
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        UntagResourceResponse result = (UntagResourceResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+    }
+    
+    @Test
+    public void publishVersionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:publishVersion", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.VERSION_DESCRIPTION, "This is my description");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        PublishVersionResponse result = (PublishVersionResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("GetHelloWithName", result.functionName());
+        assertEquals("This is my description", result.description());
+    }
+    
+    @Test
+    public void listVersionsTest() throws Exception {
+
+        Exchange exchange = template.send("direct:listVersions", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.VERSION_DESCRIPTION, "This is my description");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        ListVersionsByFunctionResponse result = (ListVersionsByFunctionResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("GetHelloWithName", result.versions().get(0).functionName());
+        assertEquals("1", result.versions().get(0).version());
+    }
+    
+    @Test
+    public void createAliasTest() throws Exception {
+
+        Exchange exchange = template.send("direct:createAlias", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_ALIAS_DESCRIPTION, "an alias");
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, "alias");
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_VERSION, "1");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        CreateAliasResponse result = (CreateAliasResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("an alias", result.description());
+        assertEquals("alias", result.name());
+        assertEquals("1", result.functionVersion());
+    }
+    
+    @Test
+    public void deleteAliasTest() throws Exception {
+
+        Exchange exchange = template.send("direct:deleteAlias", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, "alias");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        DeleteAliasResponse result = (DeleteAliasResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+    }
+    
+    @Test
+    public void getAliasTest() throws Exception {
+
+        Exchange exchange = template.send("direct:getAlias", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, "alias");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        GetAliasResponse result = (GetAliasResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("an alias", result.description());
+        assertEquals("alias", result.name());
+        assertEquals("1", result.functionVersion());
+    }
+    
+    @Test
+    public void listAliasesTest() throws Exception {
+
+        Exchange exchange = template.send("direct:listAliases", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_VERSION, "1");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        ListAliasesResponse result = (ListAliasesResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("an alias", result.aliases().get(0).description());
+        assertEquals("alias", result.aliases().get(0).name());
+        assertEquals("1", result.aliases().get(0).functionVersion());
+    }
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext(
+            "org/apache/camel/component/aws2/lambda/LambdaComponentSpringTest-context.xml");
+    }
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentVerifierExtensionTest.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentVerifierExtensionTest.java
new file mode 100644
index 0000000..5185aa0
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaComponentVerifierExtensionTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.component.aws2.lambda;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Component;
+import org.apache.camel.component.extension.ComponentVerifierExtension;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LambdaComponentVerifierExtensionTest extends CamelTestSupport {
+
+    // *************************************************
+    // Tests (parameters)
+    // *************************************************
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testParameters() throws Exception {
+        Component component = context().getComponent("aws2-lambda");
+
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "l");
+        parameters.put("function", "myfunction");
+        parameters.put("operation", "invokeFunction");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus());
+    }
+
+    @Test
+    public void testConnectivity() throws Exception {
+        Component component = context().getComponent("aws2-lambda");
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "US_EAST_1");
+        parameters.put("function", "myfunction");
+        parameters.put("operation", "invokeFunction");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
+
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaOperationsTest.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaOperationsTest.java
new file mode 100644
index 0000000..376b5f0
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaOperationsTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.component.aws2.lambda;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.camel.component.aws2.lambda.Lambda2Operations;
+
+public class LambdaOperationsTest {
+
+    @Test
+    public void supportedOperationCount() {
+        assertEquals(18, Lambda2Operations.values().length);
+    }
+
+    @Test
+    public void valueOf() {
+        assertEquals(Lambda2Operations.createFunction, Lambda2Operations.valueOf("createFunction"));
+        assertEquals(Lambda2Operations.getFunction, Lambda2Operations.valueOf("getFunction"));
+        assertEquals(Lambda2Operations.listFunctions, Lambda2Operations.valueOf("listFunctions"));
+        assertEquals(Lambda2Operations.invokeFunction, Lambda2Operations.valueOf("invokeFunction"));
+        assertEquals(Lambda2Operations.deleteFunction, Lambda2Operations.valueOf("deleteFunction"));
+        assertEquals(Lambda2Operations.updateFunction, Lambda2Operations.valueOf("updateFunction"));
+        assertEquals(Lambda2Operations.createEventSourceMapping, Lambda2Operations.valueOf("createEventSourceMapping"));
+        assertEquals(Lambda2Operations.deleteEventSourceMapping, Lambda2Operations.valueOf("deleteEventSourceMapping"));
+        assertEquals(Lambda2Operations.listEventSourceMapping, Lambda2Operations.valueOf("listEventSourceMapping"));
+        assertEquals(Lambda2Operations.listTags, Lambda2Operations.valueOf("listTags"));
+        assertEquals(Lambda2Operations.tagResource, Lambda2Operations.valueOf("tagResource"));
+        assertEquals(Lambda2Operations.untagResource, Lambda2Operations.valueOf("untagResource"));
+        assertEquals(Lambda2Operations.publishVersion, Lambda2Operations.valueOf("publishVersion"));
+        assertEquals(Lambda2Operations.listVersions, Lambda2Operations.valueOf("listVersions"));
+        assertEquals(Lambda2Operations.createAlias, Lambda2Operations.valueOf("createAlias"));
+        assertEquals(Lambda2Operations.deleteAlias, Lambda2Operations.valueOf("deleteAlias"));
+        assertEquals(Lambda2Operations.getAlias, Lambda2Operations.valueOf("getAlias"));
+        assertEquals(Lambda2Operations.listAliases, Lambda2Operations.valueOf("listAliases"));
+    }
+
+    @Test
+    public void testToString() {
+        assertEquals(Lambda2Operations.createFunction.toString(), "createFunction");
+        assertEquals(Lambda2Operations.getFunction.toString(), "getFunction");
+        assertEquals(Lambda2Operations.listFunctions.toString(), "listFunctions");
+        assertEquals(Lambda2Operations.invokeFunction.toString(), "invokeFunction");
+        assertEquals(Lambda2Operations.deleteFunction.toString(), "deleteFunction");
+        assertEquals(Lambda2Operations.updateFunction.toString(), "updateFunction");
+        assertEquals(Lambda2Operations.createEventSourceMapping.toString(), "createEventSourceMapping");
+        assertEquals(Lambda2Operations.deleteEventSourceMapping.toString(), "deleteEventSourceMapping");
+        assertEquals(Lambda2Operations.listEventSourceMapping.toString(), "listEventSourceMapping");
+        assertEquals(Lambda2Operations.listTags.toString(), "listTags");
+        assertEquals(Lambda2Operations.tagResource.toString(), "tagResource");
+        assertEquals(Lambda2Operations.untagResource.toString(), "untagResource");
+        assertEquals(Lambda2Operations.publishVersion.toString(), "publishVersion");
+        assertEquals(Lambda2Operations.listVersions.toString(), "listVersions");
+        assertEquals(Lambda2Operations.createAlias.toString(), "createAlias");
+        assertEquals(Lambda2Operations.deleteAlias.toString(), "deleteAlias");
+        assertEquals(Lambda2Operations.getAlias.toString(), "getAlias");
+        assertEquals(Lambda2Operations.listAliases.toString(), "listAliases");
+    }
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerDefaultFunctionTest.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerDefaultFunctionTest.java
new file mode 100644
index 0000000..c4a6c57
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerDefaultFunctionTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.component.aws2.lambda;
+
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class LambdaProducerDefaultFunctionTest extends CamelTestSupport {
+
+    @BindToRegistry("awsLambdaClient")
+    AmazonLambdaClientMock clientMock = new AmazonLambdaClientMock();
+
+    @EndpointInject("mock:result")
+    private MockEndpoint mock;
+
+
+
+    @Test
+    public void lambdaInvokeFunctionTest() throws Exception {
+        Exchange exchange = template.send("direct:invokeFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("{\"name\":\"Camel\"}");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        assertNotNull(exchange.getMessage().getBody(String.class));
+        assertEquals(exchange.getMessage().getBody(String.class), "{\"Hello\":\"Camel\"}");
+    }
+
+   
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+              
+                from("direct:invokeFunction").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient").to("mock:result");
+
+               
+            }
+        };
+    }
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerTest.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerTest.java
new file mode 100644
index 0000000..b5dfd25
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerTest.java
@@ -0,0 +1,384 @@
+/*
+ * 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.component.aws2.lambda;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import software.amazon.awssdk.core.SdkBytes;
+import software.amazon.awssdk.services.lambda.model.CreateAliasResponse;
+import software.amazon.awssdk.services.lambda.model.CreateEventSourceMappingResponse;
+import software.amazon.awssdk.services.lambda.model.CreateFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteAliasResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteEventSourceMappingResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.GetAliasResponse;
+import software.amazon.awssdk.services.lambda.model.GetFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.ListAliasesResponse;
+import software.amazon.awssdk.services.lambda.model.ListEventSourceMappingsResponse;
+import software.amazon.awssdk.services.lambda.model.ListFunctionsResponse;
+import software.amazon.awssdk.services.lambda.model.ListTagsResponse;
+import software.amazon.awssdk.services.lambda.model.ListVersionsByFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.PublishVersionResponse;
+import software.amazon.awssdk.services.lambda.model.TagResourceResponse;
+import software.amazon.awssdk.services.lambda.model.UntagResourceResponse;
+
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.lambda.Lambda2Constants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class LambdaProducerTest extends CamelTestSupport {
+
+    @BindToRegistry("awsLambdaClient")
+    AmazonLambdaClientMock clientMock = new AmazonLambdaClientMock();
+
+    @EndpointInject("mock:result")
+    private MockEndpoint mock;
+
+    @Test
+    public void lambdaCreateFunctionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:createFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.RUNTIME, "nodejs6.10");
+                exchange.getIn().setHeader(Lambda2Constants.HANDLER, "GetHelloWithName.handler");
+                exchange.getIn().setHeader(Lambda2Constants.DESCRIPTION, "Hello with node.js on Lambda");
+                exchange.getIn().setHeader(Lambda2Constants.ROLE, "arn:aws:iam::643534317684:role/lambda-execution-role");
+
+                ClassLoader classLoader = getClass().getClassLoader();
+                File file = new File(classLoader.getResource("org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.zip").getFile());
+                FileInputStream inputStream = new FileInputStream(file);
+                exchange.getIn().setBody(inputStream);
+            }
+        });
+
+        CreateFunctionResponse result = (CreateFunctionResponse) exchange.getMessage().getBody();
+        assertEquals(result.functionName(), "GetHelloWithName");
+        assertEquals(result.description(), "Hello with node.js on Lambda");
+        assertNotNull(result.functionArn());
+        assertNotNull(result.codeSha256());
+    }
+
+    @Test
+    public void lambdaDeleteFunctionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:deleteFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+
+            }
+        });
+        assertNotNull(exchange.getMessage().getBody(DeleteFunctionResponse.class));
+    }
+
+
+    @Test
+    public void lambdaGetFunctionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:getFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+
+            }
+        });
+        GetFunctionResponse result = (GetFunctionResponse) exchange.getMessage().getBody();
+        assertEquals(result.configuration().functionName(), "GetHelloWithName");
+    }
+
+
+    @Test
+    public void lambdaListFunctionsTest() throws Exception {
+        Exchange exchange = template.send("direct:listFunctions", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+
+            }
+        });
+
+        ListFunctionsResponse result = (ListFunctionsResponse) exchange.getMessage().getBody();
+        assertEquals(result.functions().size(), 1);
+        assertEquals(result.functions().get(0).functionName(), "GetHelloWithName");
+    }
+
+
+    @Test
+    public void lambdaInvokeFunctionTest() throws Exception {
+        Exchange exchange = template.send("direct:invokeFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("{\"name\":\"Camel\"}");
+            }
+        });
+
+        assertNotNull(exchange.getMessage().getBody(String.class));
+        assertEquals(exchange.getMessage().getBody(String.class), "{\"Hello\":\"Camel\"}");
+    }
+    
+    @Test
+    public void lambdaCreateEventSourceMappingTest() throws Exception {
+        Exchange exchange = template.send("direct:createEventSourceMapping", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.EVENT_SOURCE_ARN, "arn:aws:sqs:eu-central-1:643534317684:testqueue");
+                exchange.getIn().setHeader(Lambda2Constants.EVENT_SOURCE_BATCH_SIZE, 100);
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        CreateEventSourceMappingResponse result = exchange.getMessage().getBody(CreateEventSourceMappingResponse.class);
+        assertEquals(result.functionArn(), "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+    }
+    
+    @Test
+    public void lambdaDeleteEventSourceMappingTest() throws Exception {
+        Exchange exchange = template.send("direct:deleteEventSourceMapping", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.EVENT_SOURCE_UUID, "a1239494949382882383");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        DeleteEventSourceMappingResponse result = exchange.getMessage().getBody(DeleteEventSourceMappingResponse.class);
+        assertTrue(result.state().equalsIgnoreCase("Deleting"));
+    }
+    
+    @Test
+    public void lambdaListEventSourceMappingTest() throws Exception {
+        Exchange exchange = template.send("direct:listEventSourceMapping", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        ListEventSourceMappingsResponse result = exchange.getMessage().getBody(ListEventSourceMappingsResponse.class);
+        assertEquals(result.eventSourceMappings().get(0).functionArn(), "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+    }
+    
+    @Test
+    public void lambdaListTagsTest() throws Exception {
+
+        Exchange exchange = template.send("direct:listTags", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_ARN, "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        ListTagsResponse result = (ListTagsResponse)exchange.getMessage().getBody();
+        assertEquals("lambda-tag", result.tags().get("test"));
+    }
+    
+    @Test
+    public void tagResourceTest() throws Exception {
+
+        Exchange exchange = template.send("direct:tagResource", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                Map<String, String> tags = new HashMap<>();
+                tags.put("test", "added-tag");
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_ARN, "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_TAGS, tags);
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        TagResourceResponse result = (TagResourceResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+    }
+    
+    @Test
+    public void untagResourceTest() throws Exception {
+
+        Exchange exchange = template.send("direct:untagResource", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                List<String> tagKeys = new ArrayList<>();
+                tagKeys.add("test");
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_ARN, "arn:aws:lambda:eu-central-1:643534317684:function:GetHelloWithName");
+                exchange.getIn().setHeader(Lambda2Constants.RESOURCE_TAG_KEYS, tagKeys);
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        UntagResourceResponse result = (UntagResourceResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+    }
+    
+    @Test
+    public void publishVersionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:publishVersion", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.VERSION_DESCRIPTION, "This is my description");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        PublishVersionResponse result = (PublishVersionResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("GetHelloWithName", result.functionName());
+        assertEquals("This is my description", result.description());
+    }
+    
+    @Test
+    public void listVersionsTest() throws Exception {
+
+        Exchange exchange = template.send("direct:listVersions", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.VERSION_DESCRIPTION, "This is my description");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        ListVersionsByFunctionResponse result = (ListVersionsByFunctionResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("GetHelloWithName", result.versions().get(0).functionName());
+        assertEquals("1", result.versions().get(0).version());
+    }
+    
+    @Test
+    public void createAliasTest() throws Exception {
+
+        Exchange exchange = template.send("direct:createAlias", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_ALIAS_DESCRIPTION, "an alias");
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, "alias");
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_VERSION, "1");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        CreateAliasResponse result = (CreateAliasResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("an alias", result.description());
+        assertEquals("alias", result.name());
+        assertEquals("1", result.functionVersion());
+    }
+    
+    @Test
+    public void deleteAliasTest() throws Exception {
+
+        Exchange exchange = template.send("direct:deleteAlias", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, "alias");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        DeleteAliasResponse result = (DeleteAliasResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+    }
+    
+    @Test
+    public void getAliasTest() throws Exception {
+
+        Exchange exchange = template.send("direct:getAlias", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_ALIAS_NAME, "alias");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        GetAliasResponse result = (GetAliasResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("an alias", result.description());
+        assertEquals("alias", result.name());
+        assertEquals("1", result.functionVersion());
+    }
+    
+    @Test
+    public void listAliasesTest() throws Exception {
+
+        Exchange exchange = template.send("direct:listAliases", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.FUNCTION_VERSION, "1");
+            }
+        });
+        assertMockEndpointsSatisfied();
+
+        ListAliasesResponse result = (ListAliasesResponse)exchange.getMessage().getBody();
+        assertNotNull(result);
+        assertEquals("an alias", result.aliases().get(0).description());
+        assertEquals("alias", result.aliases().get(0).name());
+        assertEquals("1", result.aliases().get(0).functionVersion());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:createFunction").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=createFunction").to("mock:result");
+
+                from("direct:getFunction").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=getFunction").to("mock:result");
+
+                from("direct:listFunctions").to("aws2-lambda://myFunction?awsLambdaClient=#awsLambdaClient&operation=listFunctions").to("mock:result");
+
+                from("direct:invokeFunction").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=invokeFunction").to("mock:result");
+
+                from("direct:deleteFunction").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=deleteFunction").to("mock:result");
+
+                from("direct:updateFunction").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=updateFunction").to("mock:result");
+                
+                from("direct:listTags").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=listTags").to("mock:result");
+                
+                from("direct:tagResource").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=tagResource").to("mock:result");
+                
+                from("direct:untagResource").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=untagResource").to("mock:result");
+                
+                from("direct:publishVersion").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=publishVersion").to("mock:result");
+                
+                from("direct:listVersions").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=listVersions").to("mock:result");
+
+                from("direct:createEventSourceMapping").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=createEventSourceMapping").to("mock:result");
+                
+                from("direct:deleteEventSourceMapping").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=deleteEventSourceMapping").to("mock:result");
+                
+                from("direct:listEventSourceMapping").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=listEventSourceMapping").to("mock:result");
+                
+                from("direct:createAlias").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=createAlias").to("mock:result");
+                
+                from("direct:deleteAlias").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=deleteAlias").to("mock:result");
+                
+                from("direct:getAlias").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=getAlias").to("mock:result");
+                
+                from("direct:listAliases").to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=listAliases").to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/integration/LambdaComponentIntegrationTest.java b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/integration/LambdaComponentIntegrationTest.java
new file mode 100644
index 0000000..7a051db
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/integration/LambdaComponentIntegrationTest.java
@@ -0,0 +1,145 @@
+/*
+ * 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.component.aws2.lambda.integration;
+
+import java.io.*;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.lambda.Lambda2Constants;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import software.amazon.awssdk.core.SdkBytes;
+import software.amazon.awssdk.services.lambda.model.CreateFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.DeleteFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.GetFunctionResponse;
+import software.amazon.awssdk.services.lambda.model.ListFunctionsResponse;
+
+@Ignore("Must be manually tested. Provide your own accessKey and secretKey!")
+public class LambdaComponentIntegrationTest extends CamelTestSupport {
+
+
+    @Test
+    public void lambdaCreateFunctionTest() throws Exception {
+        Exchange exchange = template.send("direct:createFunction", ExchangePattern.InOut, new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Lambda2Constants.RUNTIME, "nodejs6.10");
+                exchange.getIn().setHeader(Lambda2Constants.HANDLER, "GetHelloWithName.handler");
+                exchange.getIn().setHeader(Lambda2Constants.DESCRIPTION, "Hello with node.js on Lambda");
+                exchange.getIn().setHeader(Lambda2Constants.ROLE, "arn:aws:iam::643534317684:role/lambda-execution-role");
+
+                ClassLoader classLoader = getClass().getClassLoader();
+                File file = new File(classLoader.getResource("org/apache/camel/component/aws/lambda/function/node/GetHelloWithName.zip").getFile());
+                FileInputStream inputStream = new FileInputStream(file);
+                exchange.getIn().setBody(SdkBytes.fromInputStream(inputStream));
+            }
+        });
+        assertNotNull(exchange.getMessage().getBody(CreateFunctionResponse.class));
+        assertEquals(exchange.getMessage().getBody(CreateFunctionResponse.class).functionName(), "GetHelloWithName");
+    }
+
+    @Test
+    public void lambdaListFunctionsTest() throws Exception {
+        Exchange exchange = template.send("direct:listFunctions", ExchangePattern.InOut, new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+
+            }
+        });
+        assertNotNull(exchange.getMessage().getBody(ListFunctionsResponse.class));
+        assertEquals(exchange.getMessage().getBody(ListFunctionsResponse.class).functions().size(), 3);
+    }
+
+
+    @Test
+    public void lambdaGetFunctionTest() throws Exception {
+        Exchange exchange = template.send("direct:getFunction", ExchangePattern.InOut, new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+
+            }
+        });
+        GetFunctionResponse result = exchange.getMessage().getBody(GetFunctionResponse.class);
+        assertNotNull(result);
+        assertEquals(result.configuration().functionName(), "GetHelloWithName");
+        assertEquals(result.configuration().runtime(), "nodejs6.10");
+
+    }
+
+
+    @Test
+    public void lambdaInvokeFunctionTest() throws Exception {
+        Exchange exchange = template.send("direct:invokeFunction", ExchangePattern.InOut, new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("{\"name\":\"Camel\"}");
+            }
+        });
+
+        assertNotNull(exchange.getMessage().getBody(String.class));
+        assertEquals(exchange.getMessage().getBody(String.class), "{\"Hello\":\"Camel\"}");
+    }
+
+
+    @Test
+    public void lambdaDeleteFunctionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:deleteFunction", ExchangePattern.InOut, new Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+            }
+        });
+        assertNotNull(exchange.getMessage().getBody(DeleteFunctionResponse.class));
+    }
+
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+
+
+                from("direct:createFunction")
+                    .to("aws2-lambda://GetHelloWithName?operation=createFunction&accessKey=xxxx&secretKey=xxxx&awsLambdaEndpoint=lambda.eu-central-1.amazonaws.com");
+
+                from("direct:listFunctions")
+                    .to("aws2-lambda://myFunction?operation=listFunctions&accessKey=xxxx&secretKey=xxxx&awsLambdaEndpoint=lambda.eu-central-1.amazonaws.com");
+
+                from("direct:getFunction")
+                    .to("aws2-lambda://GetHelloWithName?operation=getFunction&accessKey=xxxx&secretKey=xxxx&awsLambdaEndpoint=lambda.eu-central-1.amazonaws.com");
+
+                from("direct:invokeFunction")
+                    .to("aws2-lambda://GetHelloWithName?operation=invokeFunction&accessKey=xxxx&secretKey=xxxx&awsLambdaEndpoint=lambda.eu-central-1.amazonaws.com");
+
+                from("direct:deleteFunction")
+                    .to("aws2-lambda://GetHelloWithName?operation=deleteFunction&accessKey=xxxx&secretKey=xxxx&awsLambdaEndpoint=lambda.eu-central-1.amazonaws.com");
+
+            }
+        };
+    }
+}
diff --git a/components/camel-aws2-lambda/src/test/resources/log4j2.properties b/components/camel-aws2-lambda/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..72c73f6
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-aws2-lambda-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/LambdaComponentSpringTest-context.xml b/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/LambdaComponentSpringTest-context.xml
new file mode 100644
index 0000000..2e89a26
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/LambdaComponentSpringTest-context.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="
+    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+    http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+
+        <route>
+            <from uri="direct:createFunction"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=createFunction"/>
+        </route>
+
+        <route>
+            <from uri="direct:getFunction"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=getFunction"/>
+        </route>
+
+        <route>
+            <from uri="direct:listFunctions"/>
+            <to uri="aws2-lambda://myFunction?awsLambdaClient=#awsLambdaClient&amp;operation=listFunctions"/>
+        </route>
+
+        <route>
+            <from uri="direct:invokeFunction"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=invokeFunction"/>
+        </route>
+
+        <route>
+            <from uri="direct:deleteFunction"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=deleteFunction"/>
+        </route>
+
+        <route>
+            <from uri="direct:createEventSourceMapping"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=createEventSourceMapping"/>
+        </route>
+        
+        <route>
+            <from uri="direct:deleteEventSourceMapping"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=deleteEventSourceMapping"/>
+        </route>
+        
+        <route>
+            <from uri="direct:listEventSourceMapping"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=listEventSourceMapping"/>
+        </route>
+        
+        <route>
+            <from uri="direct:listTags"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=listTags"/>
+        </route>
+        
+        <route>
+            <from uri="direct:tagResource"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=tagResource"/>
+        </route>
+        
+        <route>
+            <from uri="direct:untagResource"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=untagResource"/>
+        </route>
+        
+        <route>
+            <from uri="direct:publishVersion"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=publishVersion"/>
+        </route>
+        
+        <route>
+            <from uri="direct:listVersions"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=listVersions"/>
+        </route>
+        
+        <route>
+            <from uri="direct:createAlias"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=createAlias"/>
+        </route>
+        
+        <route>
+            <from uri="direct:deleteAlias"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=deleteAlias"/>
+        </route>
+        
+        <route>
+            <from uri="direct:getAlias"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=getAlias"/>
+        </route>
+        
+        <route>
+            <from uri="direct:listAliases"/>
+            <to uri="aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&amp;operation=listAliases"/>
+        </route>
+    </camelContext>
+
+    <bean id="awsLambdaClient" class="org.apache.camel.component.aws2.lambda.AmazonLambdaClientMock"/>
+</beans>
\ No newline at end of file
diff --git a/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.js b/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.js
new file mode 100644
index 0000000..e8a0039
--- /dev/null
+++ b/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.js
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+'use strict';
+exports.handler = function(event, context, callback) {
+	var name = (event.name === undefined ? 'No-Name' : event.name);
+	callback(null, {"Hello":name});
+}
diff --git a/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.zip b/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.zip
new file mode 100644
index 0000000..e9991f8
Binary files /dev/null and b/components/camel-aws2-lambda/src/test/resources/org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.zip differ
diff --git a/core/camel-allcomponents/pom.xml b/core/camel-allcomponents/pom.xml
index 5ce92a0..b6d96ee 100644
--- a/core/camel-allcomponents/pom.xml
+++ b/core/camel-allcomponents/pom.xml
@@ -192,6 +192,10 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-aws2-lambda</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-aws2-mq</artifactId>
 		</dependency>
 		<dependency>
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index d5d6668..3f47da4 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -552,6 +552,18 @@ public interface ComponentsBuilderFactory {
         return org.apache.camel.builder.component.dsl.Aws2KmsComponentBuilderFactory.aws2Kms();
     }
     /**
+     * AWS Lambda (camel-aws2-lambda)
+     * The aws-lambda is used for managing and invoking functions from Amazon
+     * Lambda.
+     * 
+     * Category: cloud,computing,serverless
+     * Since: 3.2
+     * Maven coordinates: org.apache.camel:camel-aws2-lambda
+     */
+    static org.apache.camel.builder.component.dsl.Aws2LambdaComponentBuilderFactory.Aws2LambdaComponentBuilder aws2Lambda() {
+        return org.apache.camel.builder.component.dsl.Aws2LambdaComponentBuilderFactory.aws2Lambda();
+    }
+    /**
      * AWS 2 MQ (camel-aws2-mq)
      * The aws2-mq is used for managing Amazon MQ instances.
      * 
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2LambdaComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2LambdaComponentBuilderFactory.java
new file mode 100644
index 0000000..b97d1c9
--- /dev/null
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2LambdaComponentBuilderFactory.java
@@ -0,0 +1,161 @@
+/*
+ * 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.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.aws2.lambda.Lambda2Component;
+
+/**
+ * The aws-lambda is used for managing and invoking functions from Amazon
+ * Lambda.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface Aws2LambdaComponentBuilderFactory {
+
+    /**
+     * AWS Lambda (camel-aws2-lambda)
+     * The aws-lambda is used for managing and invoking functions from Amazon
+     * Lambda.
+     * 
+     * Category: cloud,computing,serverless
+     * Since: 3.2
+     * Maven coordinates: org.apache.camel:camel-aws2-lambda
+     */
+    static Aws2LambdaComponentBuilder aws2Lambda() {
+        return new Aws2LambdaComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the AWS Lambda component.
+     */
+    interface Aws2LambdaComponentBuilder
+            extends
+                ComponentBuilder<Lambda2Component> {
+        /**
+         * Amazon AWS Access Key.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2LambdaComponentBuilder accessKey(java.lang.String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default Aws2LambdaComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * Amazon AWS Region.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2LambdaComponentBuilder region(java.lang.String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Key.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2LambdaComponentBuilder secretKey(java.lang.String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+        /**
+         * Whether the component should use basic property binding (Camel 2.x)
+         * or the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default Aws2LambdaComponentBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * The AWS Lambda default configuration.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.aws2.lambda.Lambda2Configuration</code> type.
+         * 
+         * Group: advanced
+         */
+        default Aws2LambdaComponentBuilder configuration(
+                org.apache.camel.component.aws2.lambda.Lambda2Configuration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+    }
+
+    class Aws2LambdaComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<Lambda2Component>
+            implements
+                Aws2LambdaComponentBuilder {
+        @Override
+        protected Lambda2Component buildConcreteComponent() {
+            return new Lambda2Component();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "accessKey": ((Lambda2Component) component).setAccessKey((java.lang.String) value); return true;
+            case "lazyStartProducer": ((Lambda2Component) component).setLazyStartProducer((boolean) value); return true;
+            case "region": ((Lambda2Component) component).setRegion((java.lang.String) value); return true;
+            case "secretKey": ((Lambda2Component) component).setSecretKey((java.lang.String) value); return true;
+            case "basicPropertyBinding": ((Lambda2Component) component).setBasicPropertyBinding((boolean) value); return true;
+            case "configuration": ((Lambda2Component) component).setConfiguration((org.apache.camel.component.aws2.lambda.Lambda2Configuration) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-componentdsl/src/generated/resources/metadata.json b/core/camel-componentdsl/src/generated/resources/metadata.json
index d36beb9..e68b48c 100644
--- a/core/camel-componentdsl/src/generated/resources/metadata.json
+++ b/core/camel-componentdsl/src/generated/resources/metadata.json
@@ -521,6 +521,26 @@
     "artifactId": "camel-aws2-kms",
     "version": "3.1.0-SNAPSHOT"
   },
+  "Aws2LambdaComponentBuilderFactory": {
+    "kind": "component",
+    "scheme": "aws2-lambda",
+    "extendsScheme": "",
+    "syntax": "aws2-lambda:function",
+    "title": "AWS Lambda",
+    "description": "The aws-lambda is used for managing and invoking functions from Amazon Lambda.",
+    "label": "cloud,computing,serverless",
+    "deprecated": false,
+    "deprecationNote": "cloud,computing,serverless",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.aws2.lambda.Lambda2Component",
+    "firstVersion": "3.2.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-lambda",
+    "version": "3.1.0-SNAPSHOT"
+  },
   "Aws2MqComponentBuilderFactory": {
     "kind": "component",
     "scheme": "aws2-mq",