= AWS Kinesis Firehose Component
:doctitle: AWS Kinesis Firehose
:shortname: aws2-kinesis-firehose
:artifactid: camel-aws2-kinesis
:description: Produce data to AWS Kinesis Firehose streams.
:since: 3.2
:supportlevel: Stable
:tabs-sync-option:
: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 is available
at https://aws.amazon.com/kinesis/firehose/[AWS Kinesis Firehose]

== 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, Default Credential Provider and Profile Credentials Provider

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

The order of evaluation for Default Credentials Provider is the following:

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

You have also the possibility of using Profile Credentials Provider, by specifying the useProfileCredentialsProvider option to true and profileCredentialsName to the profile name.

Only one of static, default and profile credentials could be used at the same time.

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]

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

=== 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".

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