= AWS Simple Notification System (SNS) Component
:doctitle: AWS Simple Notification System (SNS)
:shortname: aws2-sns
:artifactid: camel-aws2-sns
:description: Send messages to AWS Simple Notification Topic.
:since: 3.1
:supportlevel: Stable
:tabs-sync-option:
:component-header: Only producer is supported
//Manually maintained attributes
:group: AWS
:camel-spring-boot-name: aws2-sns

*Since Camel {since}*

*{component-header}*

The AWS2 SNS component allows messages to be sent to an
https://aws.amazon.com/sns[Amazon Simple Notification] Topic. The
implementation of the Amazon API is provided by
the https://aws.amazon.com/sdkforjava/[AWS SDK].

Prerequisites

You must have a valid Amazon Web Services developer account, and be
signed up to use Amazon SNS. More information is available at
https://aws.amazon.com/sns[Amazon SNS].

== URI Format

-----------------------------
aws2-sns://topicNameOrArn[?options]
-----------------------------

The topic will be created if they don't already exist.

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 SNS component options

You have to provide the amazonSNSClient in the
Registry or your accessKey and secretKey to access
the https://aws.amazon.com/sns[Amazon's SNS].

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

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

== Usage

=== Advanced AmazonSNS configuration

If you need more control over the `SnsClient` instance configuration you
can create your own instance and refer to it from the URI:

[source,java]
-------------------------------------------------
from("direct:start")
.to("aws2-sns://MyTopic?amazonSNSClient=#client");
-------------------------------------------------

The `#client` refers to a `AmazonSNS` in the
Registry.

=== Create a subscription between an AWS SNS Topic and an AWS SQS Queue

You can create a subscription of an SQS Queue to an SNS Topic in this way:

[source,java]
-------------------------------------------------
from("direct:start")
.to("aws2-sns://test-camel-sns1?amazonSNSClient=#amazonSNSClient&subscribeSNStoSQS=true&queueArn=arn:aws:sqs:eu-central-1:123456789012:test_camel");
-------------------------------------------------

The `#amazonSNSClient` refers to a `SnsClient` in the Registry.
By specifying `subscribeSNStoSQS` to true and a `queueArn` of an existing SQS Queue,
you'll be able to subscribe your SQS Queue to your SNS Topic.

At this point, you can consume messages coming from SNS Topic through your SQS Queue

[source,java]
-------------------------------------------------
from("aws2-sqs://test-camel?amazonSQSClient=#amazonSQSClient&delay=50&maxMessagesPerPoll=5")
    .to(...);
-------------------------------------------------

=== Topic Auto-creation

With the option `autoCreateTopic` users are able to avoid the auto-creation of an SNS Topic in case it doesn't exist. The default for this option is `false`.
If set to false, any operation on a non-existent topic in AWS won't be successful and an error will be returned.

=== SNS FIFO

SNS FIFO are supported. While creating the SQS queue, you will subscribe to the SNS topic there is an important point to remember, you'll need to make possible for the SNS Topic to send the message to the SQS Queue.

This is clear with an example.

Suppose you created an SNS FIFO Topic called `Order.fifo` and an SQS Queue called `QueueSub.fifo`.

In the access Policy of the `QueueSub.fifo` you should submit something like this

[source,json]
-------------------------------------------------
{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__owner_statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::780560123482:root"
      },
      "Action": "SQS:*",
      "Resource": "arn:aws:sqs:eu-west-1:780560123482:QueueSub.fifo"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "sns.amazonaws.com"
      },
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:eu-west-1:780560123482:QueueSub.fifo",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:sns:eu-west-1:780410022472:Order.fifo"
        }
      }
    }
  ]
}
-------------------------------------------------

This is a critical step to make the subscription work correctly.

=== SNS Fifo Topic Message group ID Strategy and message Deduplication ID Strategy

When sending something to the FIFO topic, you'll need to always set up a message group ID strategy.

If the content-based message deduplication has been enabled on the SNS Fifo topic, where won't be the need of setting a message deduplication id strategy, otherwise you'll have to set it.

== Examples

=== Producer Examples

Sending to a topic

[source,java]
--------------------------------------------------------------------------------
from("direct:start")
  .to("aws2-sns://camel-topic?subject=The+subject+message&autoCreateTopic=true");
--------------------------------------------------------------------------------

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

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



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