[[aws-lambda-component]]
= AWS Lambda Component

*Available as of Camel version 2.20*


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 are available at
https://aws.amazon.com/lambda/[Amazon 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 5 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *configuration* (advanced) | The AWS Lambda default configuration |  | LambdaConfiguration
| *accessKey* (producer) | Amazon AWS Access Key |  | String
| *secretKey* (producer) | Amazon AWS Secret Key |  | String
| *region* (producer) | Amazon AWS Region |  | String
| *resolveProperty Placeholders* (advanced) | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. | true | boolean
|===
// 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 (8 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *operation* (producer) | *Required* The operation to perform. It can be listFunctions, getFunction, createFunction, deleteFunction or invokeFunction |  | LambdaOperations
| *region* (producer) | Amazon AWS Region |  | String
| *awsLambdaClient* (advanced) | To use a existing configured AwsLambdaClient as client |  | AWSLambda
| *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
| *accessKey* (security) | Amazon AWS Access Key |  | String
| *secretKey* (security) | Amazon AWS Secret Key |  | String
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-aws-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 13 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.aws-lambda.access-key* | Amazon AWS Access Key |  | String
| *camel.component.aws-lambda.configuration.access-key* | Amazon AWS Access Key |  | String
| *camel.component.aws-lambda.configuration.aws-lambda-client* | To use a existing configured AwsLambdaClient as client |  | AWSLambda
| *camel.component.aws-lambda.configuration.function* | Name of the Lambda function. |  | String
| *camel.component.aws-lambda.configuration.operation* | The operation to perform. It can be listFunctions, getFunction, createFunction, deleteFunction or invokeFunction |  | LambdaOperations
| *camel.component.aws-lambda.configuration.proxy-host* | To define a proxy host when instantiating the Lambda client |  | String
| *camel.component.aws-lambda.configuration.proxy-port* | To define a proxy port when instantiating the Lambda client |  | Integer
| *camel.component.aws-lambda.configuration.region* | Amazon AWS Region |  | String
| *camel.component.aws-lambda.configuration.secret-key* | Amazon AWS Secret Key |  | String
| *camel.component.aws-lambda.enabled* | Whether to enable auto configuration of the aws-lambda component. This is enabled by default. |  | Boolean
| *camel.component.aws-lambda.region* | Amazon AWS Region |  | String
| *camel.component.aws-lambda.resolve-property-placeholders* | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. | true | Boolean
| *camel.component.aws-lambda.secret-key* | Amazon AWS Secret Key |  | String
|===
// spring-boot-auto-configure 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

|=======================================================================

== List of Avalaible Operations

- listFunctions
- getFunction,
- createFunction
- deleteFunction
- invokeFunction
- updateFunction
- createEventSourceMapping
- deleteEventSourceMapping
- listEventSourceMapping

== 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]


== 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</artifactId>
    <version>${camel-version}</version>
</dependency>
---------------------------------------

where `$\{camel-version\}` must be replaced by the actual version of Camel
(2.16 or higher).