= AWS Kinesis Firehose Component
:doctitle: AWS Kinesis Firehose
:shortname: aws2-kinesis-firehose
:artifactid: camel-aws2-kinesis
:description: Produce data to AWS Kinesis Firehose streams 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-kinesis

*Since Camel {since}*

*{component-header}*

The AWS2 Kinesis Firehose component supports sending messages to Amazon Kinesis Firehose service (Batch not supported).

Prerequisites

You must have a valid Amazon Web Services developer account, and be
signed up to use Amazon Kinesis Firehose. More information are available
at https://aws.amazon.com/kinesis/firehose/[AWS Kinesis Firehose]

[NOTE]
====
The AWS2 Kinesis Firehose component is not supported in OSGI
====

== URI Format

[source,java]
-----------------------------------
aws2-kinesis-firehose://delivery-stream-name[?options]
-----------------------------------

The stream needs to be created prior to it being used. +
 You can append query options to the URI in the following format,
?options=value&option2=value&...

== URI Options


// 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 Kinesis Firehose component options

You have to provide the FirehoseClient in the
Registry with proxies and relevant credentials
configured.


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

=== Amazon Kinesis Firehose configuration

You then have to reference the FirehoseClient in the `amazonKinesisFirehoseClient` URI option.

[source,java]
--------------------------------------------------------------------------------------------------------------------
from("aws2-kinesis-firehose://mykinesisdeliverystream?amazonKinesisFirehoseClient=#kinesisClient")
  .to("log:out?showAll=true");
--------------------------------------------------------------------------------------------------------------------

=== Providing AWS Credentials

It is recommended that the credentials are obtained by using the
http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.html[DefaultAWSCredentialsProviderChain]
that is the default when creating a new ClientConfiguration instance,
however, a
different http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/AWSCredentialsProvider.html[AWSCredentialsProvider]
can be specified when calling createClient(...).

=== Kinesis Firehose Producer operations

Camel-AWS s3 component provides the following operation on the producer side:

- SendBatchRecord
- CreateDeliveryStream
- DeleteDeliveryStream
- DescribeDeliveryStream
- UpdateDestination

=== Send Batch Records Example

You can send an iterable of Kinesis Record (as the following example shows) or you can send directly a PutRecordBatchRequest POJO instance in the body.

[source,java]
--------------------------------------------------------------------------------------------------------------------
    @Test
    public void testFirehoseBatchRouting() throws Exception {
        Exchange exchange = template.send("direct:start", ExchangePattern.InOnly, new Processor() {
            public void process(Exchange exchange) throws Exception {
                List<Record> recs = new ArrayList<Record>();
                Record rec = Record.builder().data(SdkBytes.fromString("Test1", Charset.defaultCharset())).build();
                Record rec1 = Record.builder().data(SdkBytes.fromString("Test2", Charset.defaultCharset())).build();
                recs.add(rec);
                recs.add(rec1);
                exchange.getIn().setBody(recs);
            }
        });
        assertNotNull(exchange.getIn().getBody());
    }

from("direct:start").to("aws2-kinesis-firehose://cc?amazonKinesisFirehoseClient=#FirehoseClient&operation=sendBatchRecord");
--------------------------------------------------------------------------------------------------------------------

In the deliveryStream you'll find "Test1Test2".

=== Message headers set by the Kinesis producer on successful storage of a Record

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description

|`CamelAwsKinesisFirehoseRecordId` |`String` |The record ID, as defined in
http://docs.aws.amazon.com/firehose/latest/APIReference/API_PutRecord.html#API_PutRecord_ResponseSyntax[Response Syntax]


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

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

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



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