= AWS Lambda Component
:doctitle: AWS Lambda
:shortname: aws2-lambda
:artifactid: camel-aws2-lambda
:description: Manage and invoke AWS Lambda functions using AWS SDK version 2.x.
:since: 3.2
:supportlevel: Stable
:component-header: Only producer is supported
//Manually maintained attributes
:group: AWS
:camel-spring-boot-name: aws2-lambda

*Since Camel {since}*

*{component-header}*

The AWS2 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.

== URI Format

-------------------------
aws2-lambda://functionName[?options]
-------------------------

You can append query options to the URI in the following format,
?options=value&option2=value&...


// component-configure options: START

// component-configure options: END

// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
// component options: END

// endpoint options: START

// 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

=== Static credentials vs Default Credential Provider

You have the possibility of avoiding the usage of explicit static credentials, by specifying the useDefaultCredentialsProvider option and set it to true.

 - Java system properties - aws.accessKeyId and aws.secretKey
 - Environment variables - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
 - Web Identity Token from AWS STS.
 - The shared credentials and config files.
 - Amazon ECS container credentials - loaded from the Amazon ECS if the environment variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI is set.
 - Amazon EC2 Instance profile credentials. 

For more information about this you can look at https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html[AWS credentials documentation]

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

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

== List of Avalaible Operations

- listFunctions
- getFunction
- createFunction
- deleteFunction
- invokeFunction
- updateFunction
- createEventSourceMapping
- deleteEventSourceMapping
- listEventSourceMapping
- listTags
- tagResource
- untagResource
- publishVersion
- listVersions
- createAlias
- deleteAlias
- getAlias
- listAliases

== Examples

=== Producer Example

To have a full understanding of how the component works, you may have a look at these https://github.com/apache/camel/tree/main/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/integration[integration tests]

=== Producer Examples

- CreateFunction: this operation will create a function for you in AWS Lambda

[source,java]
--------------------------------------------------------------------------------
  from("direct:createFunction").to("aws2-lambda://GetHelloWithName?operation=createFunction").to("mock:result");
--------------------------------------------------------------------------------

and by sending

[source,java]
--------------------------------------------------------------------------------
        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);
            }
        });
--------------------------------------------------------------------------------

== Using a POJO as body

Sometimes build an AWS Request can be complex, because of multiple options. We introduce the possibility to use a POJO as body.
In AWS Lambda there are multiple operations you can submit, as an example for Get Function request, you can do something like:

[source,java]
------------------------------------------------------------------------------------------------------
from("direct:getFunction")
     .setBody(GetFunctionRequest.builder().functionName("test").build())
     .to("aws2-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=getFunction&pojoRequest=true")
------------------------------------------------------------------------------------------------------

In this way you'll pass the request directly without the need of passing headers and options specifically related to this operation.


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

where `$\{camel-version}` must be replaced by the actual version of Camel.



include::spring-boot:partial$starter.adoc[]
