Skip to content
v2.274.0

CDK Construct Library for Amazon Simple Notification Service Subscriptions ​

This library provides constructs for adding subscriptions to an Amazon SNS topic. Subscriptions can be added by calling the .addSubscription(...) method on the topic.

Subscriptions ​

Subscriptions can be added to the following endpoints:

  • HTTPS
  • Amazon SQS
  • AWS Lambda
  • Email
  • SMS
  • Amazon Data Firehose

Subscriptions to Amazon SQS, AWS Lambda and Amazon Data Firehose can be added on topics across regions.

Create an Amazon SNS Topic to add subscriptions.

ts
const myTopic = new sns.Topic(this, 'MyTopic');
python
my_topic = sns.Topic(self, "MyTopic")
java
Topic myTopic = new Topic(this, "MyTopic");
csharp
var myTopic = new Topic(this, "MyTopic");
go
myTopic := sns.NewTopic(this, jsii.String("MyTopic"))

HTTPS ​

Add an HTTP or HTTPS Subscription to your topic:

ts
const myTopic = new sns.Topic(this, 'MyTopic');

myTopic.addSubscription(new subscriptions.UrlSubscription('https://foobar.com/'));
python
my_topic = sns.Topic(self, "MyTopic")

my_topic.add_subscription(subscriptions.UrlSubscription("https://foobar.com/"))
java
Topic myTopic = new Topic(this, "MyTopic");

myTopic.addSubscription(new UrlSubscription("https://foobar.com/"));
csharp
var myTopic = new Topic(this, "MyTopic");

myTopic.AddSubscription(new UrlSubscription("https://foobar.com/"));
go
myTopic := sns.NewTopic(this, jsii.String("MyTopic"))

myTopic.AddSubscription(subscriptions.NewUrlSubscription(jsii.String("https://foobar.com/")))

The URL being subscribed can also be tokens, that resolve to a URL during deployment. A typical use case is when the URL is passed in as a CloudFormation parameter. The following code defines a CloudFormation parameter and uses it in a URL subscription.

ts
const myTopic = new sns.Topic(this, 'MyTopic');
const url = new CfnParameter(this, 'url-param');

myTopic.addSubscription(new subscriptions.UrlSubscription(url.valueAsString));
python
my_topic = sns.Topic(self, "MyTopic")
url = CfnParameter(self, "url-param")

my_topic.add_subscription(subscriptions.UrlSubscription(url.value_as_string))
java
Topic myTopic = new Topic(this, "MyTopic");
CfnParameter url = new CfnParameter(this, "url-param");

myTopic.addSubscription(new UrlSubscription(url.getValueAsString()));
csharp
var myTopic = new Topic(this, "MyTopic");
var url = new CfnParameter(this, "url-param");

myTopic.AddSubscription(new UrlSubscription(url.ValueAsString));
go
myTopic := sns.NewTopic(this, jsii.String("MyTopic"))
url := awscdk.NewCfnParameter(this, jsii.String("url-param"))

myTopic.AddSubscription(subscriptions.NewUrlSubscription(url.valueAsString))

The delivery policy can also be set like so:

ts
const myTopic = new sns.Topic(this, 'MyTopic');

myTopic.addSubscription(
  new subscriptions.UrlSubscription(
    'https://foobar.com/',
    {
      deliveryPolicy: {
        healthyRetryPolicy: {
          minDelayTarget: Duration.seconds(5),
          maxDelayTarget: Duration.seconds(10),
          numRetries: 6,
          backoffFunction: sns.BackoffFunction.EXPONENTIAL,
        },
        throttlePolicy: {
          maxReceivesPerSecond: 10,
        },
        requestPolicy: {
          headerContentType: 'application/json',
        },
      },
    },
  ),
);
python
my_topic = sns.Topic(self, "MyTopic")

my_topic.add_subscription(
    subscriptions.UrlSubscription("https://foobar.com/",
        delivery_policy=sns.DeliveryPolicy(
            healthy_retry_policy=sns.HealthyRetryPolicy(
                min_delay_target=Duration.seconds(5),
                max_delay_target=Duration.seconds(10),
                num_retries=6,
                backoff_function=sns.BackoffFunction.EXPONENTIAL
            ),
            throttle_policy=sns.ThrottlePolicy(
                max_receives_per_second=10
            ),
            request_policy=sns.RequestPolicy(
                header_content_type="application/json"
            )
        )
    ))
java
Topic myTopic = new Topic(this, "MyTopic");

myTopic.addSubscription(
UrlSubscription.Builder.create("https://foobar.com/")
        .deliveryPolicy(DeliveryPolicy.builder()
                .healthyRetryPolicy(HealthyRetryPolicy.builder()
                        .minDelayTarget(Duration.seconds(5))
                        .maxDelayTarget(Duration.seconds(10))
                        .numRetries(6)
                        .backoffFunction(BackoffFunction.EXPONENTIAL)
                        .build())
                .throttlePolicy(ThrottlePolicy.builder()
                        .maxReceivesPerSecond(10)
                        .build())
                .requestPolicy(RequestPolicy.builder()
                        .headerContentType("application/json")
                        .build())
                .build())
        .build());
csharp
var myTopic = new Topic(this, "MyTopic");

myTopic.AddSubscription(
new UrlSubscription("https://foobar.com/", new UrlSubscriptionProps {
    DeliveryPolicy = new DeliveryPolicy {
        HealthyRetryPolicy = new HealthyRetryPolicy {
            MinDelayTarget = Duration.Seconds(5),
            MaxDelayTarget = Duration.Seconds(10),
            NumRetries = 6,
            BackoffFunction = BackoffFunction.EXPONENTIAL
        },
        ThrottlePolicy = new ThrottlePolicy {
            MaxReceivesPerSecond = 10
        },
        RequestPolicy = new RequestPolicy {
            HeaderContentType = "application/json"
        }
    }
}));
go
myTopic := sns.NewTopic(this, jsii.String("MyTopic"))

myTopic.AddSubscription(
subscriptions.NewUrlSubscription(jsii.String("https://foobar.com/"), &UrlSubscriptionProps{
	DeliveryPolicy: &DeliveryPolicy{
		HealthyRetryPolicy: &HealthyRetryPolicy{
			MinDelayTarget: awscdk.Duration_Seconds(jsii.Number(5)),
			MaxDelayTarget: awscdk.Duration_*Seconds(jsii.Number(10)),
			NumRetries: jsii.Number(6),
			BackoffFunction: sns.BackoffFunction_EXPONENTIAL,
		},
		ThrottlePolicy: &ThrottlePolicy{
			MaxReceivesPerSecond: jsii.Number(10),
		},
		RequestPolicy: &RequestPolicy{
			HeaderContentType: jsii.String("application/json"),
		},
	},
}))

Amazon SQS ​

Subscribe a queue to your topic:

ts
const myQueue = new sqs.Queue(this, 'MyQueue');
const myTopic = new sns.Topic(this, 'MyTopic');

myTopic.addSubscription(new subscriptions.SqsSubscription(myQueue));
python
my_queue = sqs.Queue(self, "MyQueue")
my_topic = sns.Topic(self, "MyTopic")

my_topic.add_subscription(subscriptions.SqsSubscription(my_queue))
java
Queue myQueue = new Queue(this, "MyQueue");
Topic myTopic = new Topic(this, "MyTopic");

myTopic.addSubscription(new SqsSubscription(myQueue));
csharp
var myQueue = new Queue(this, "MyQueue");
var myTopic = new Topic(this, "MyTopic");

myTopic.AddSubscription(new SqsSubscription(myQueue));
go
myQueue := sqs.NewQueue(this, jsii.String("MyQueue"))
myTopic := sns.NewTopic(this, jsii.String("MyTopic"))

myTopic.AddSubscription(subscriptions.NewSqsSubscription(myQueue))

KMS key permissions will automatically be granted to SNS when a subscription is made to an encrypted queue.

Note that subscriptions of queues in different accounts need to be manually confirmed by reading the initial message from the queue and visiting the link found in it.

AWS Lambda ​

Subscribe an AWS Lambda function to your topic:

ts
import * as lambda from 'aws-cdk-lib/aws-lambda';

const myTopic = new sns.Topic(this, 'myTopic');
declare const myFunction: lambda.Function;
myTopic.addSubscription(new subscriptions.LambdaSubscription(myFunction));
python
import aws_cdk.aws_lambda as lambda_
# my_function: lambda.Function


my_topic = sns.Topic(self, "myTopic")
my_topic.add_subscription(subscriptions.LambdaSubscription(my_function))
java
import software.amazon.awscdk.services.lambda.*;
Function myFunction;


Topic myTopic = new Topic(this, "myTopic");
myTopic.addSubscription(new LambdaSubscription(myFunction));
csharp
using Amazon.CDK.AWS.Lambda;
Function myFunction;


var myTopic = new Topic(this, "myTopic");
myTopic.AddSubscription(new LambdaSubscription(myFunction));
go
import lambda "github.com/aws/aws-cdk-go/awscdk"
var myFunction Function


myTopic := sns.NewTopic(this, jsii.String("myTopic"))
myTopic.AddSubscription(subscriptions.NewLambdaSubscription(myFunction))

Email ​

Subscribe an email address to your topic:

ts
const myTopic = new sns.Topic(this, 'MyTopic');
myTopic.addSubscription(new subscriptions.EmailSubscription('foo@bar.com'));
python
my_topic = sns.Topic(self, "MyTopic")
my_topic.add_subscription(subscriptions.EmailSubscription("foo@bar.com"))
java
Topic myTopic = new Topic(this, "MyTopic");
myTopic.addSubscription(new EmailSubscription("foo@bar.com"));
csharp
var myTopic = new Topic(this, "MyTopic");
myTopic.AddSubscription(new EmailSubscription("foo@bar.com"));
go
myTopic := sns.NewTopic(this, jsii.String("MyTopic"))
myTopic.AddSubscription(subscriptions.NewEmailSubscription(jsii.String("foo@bar.com")))

The email being subscribed can also be tokens, that resolve to an email address during deployment. A typical use case is when the email address is passed in as a CloudFormation parameter. The following code defines a CloudFormation parameter and uses it in an email subscription.

ts
const myTopic = new sns.Topic(this, 'Topic');
const emailAddress = new CfnParameter(this, 'email-param');

myTopic.addSubscription(new subscriptions.EmailSubscription(emailAddress.valueAsString));
python
my_topic = sns.Topic(self, "Topic")
email_address = CfnParameter(self, "email-param")

my_topic.add_subscription(subscriptions.EmailSubscription(email_address.value_as_string))
java
Topic myTopic = new Topic(this, "Topic");
CfnParameter emailAddress = new CfnParameter(this, "email-param");

myTopic.addSubscription(new EmailSubscription(emailAddress.getValueAsString()));
csharp
var myTopic = new Topic(this, "Topic");
var emailAddress = new CfnParameter(this, "email-param");

myTopic.AddSubscription(new EmailSubscription(emailAddress.ValueAsString));
go
myTopic := sns.NewTopic(this, jsii.String("Topic"))
emailAddress := awscdk.NewCfnParameter(this, jsii.String("email-param"))

myTopic.AddSubscription(subscriptions.NewEmailSubscription(emailAddress.valueAsString))

Note that email subscriptions require confirmation by visiting the link sent to the email address.

SMS ​

Subscribe an sms number to your topic:

ts
const myTopic = new sns.Topic(this, 'Topic');

myTopic.addSubscription(new subscriptions.SmsSubscription('+15551231234'));
python
my_topic = sns.Topic(self, "Topic")

my_topic.add_subscription(subscriptions.SmsSubscription("+15551231234"))
java
Topic myTopic = new Topic(this, "Topic");

myTopic.addSubscription(new SmsSubscription("+15551231234"));
csharp
var myTopic = new Topic(this, "Topic");

myTopic.AddSubscription(new SmsSubscription("+15551231234"));
go
myTopic := sns.NewTopic(this, jsii.String("Topic"))

myTopic.AddSubscription(subscriptions.NewSmsSubscription(jsii.String("+15551231234")))

The number being subscribed can also be tokens, that resolve to a number during deployment. A typical use case is when the number is passed in as a CloudFormation parameter. The following code defines a CloudFormation parameter and uses it in an sms subscription.

ts
const myTopic = new sns.Topic(this, 'Topic');
const smsNumber = new CfnParameter(this, 'sms-param');

myTopic.addSubscription(new subscriptions.SmsSubscription(smsNumber.valueAsString));
python
my_topic = sns.Topic(self, "Topic")
sms_number = CfnParameter(self, "sms-param")

my_topic.add_subscription(subscriptions.SmsSubscription(sms_number.value_as_string))
java
Topic myTopic = new Topic(this, "Topic");
CfnParameter smsNumber = new CfnParameter(this, "sms-param");

myTopic.addSubscription(new SmsSubscription(smsNumber.getValueAsString()));
csharp
var myTopic = new Topic(this, "Topic");
var smsNumber = new CfnParameter(this, "sms-param");

myTopic.AddSubscription(new SmsSubscription(smsNumber.ValueAsString));
go
myTopic := sns.NewTopic(this, jsii.String("Topic"))
smsNumber := awscdk.NewCfnParameter(this, jsii.String("sms-param"))

myTopic.AddSubscription(subscriptions.NewSmsSubscription(smsNumber.valueAsString))

Amazon Data Firehose ​

Subscribe an Amazon Data Firehose delivery stream to your topic:

ts
import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';

const myTopic = new sns.Topic(this, 'Topic');
declare const stream: firehose.DeliveryStream;

myTopic.addSubscription(new subscriptions.FirehoseSubscription(stream));
python
import aws_cdk.aws_kinesisfirehose as firehose
# stream: firehose.DeliveryStream


my_topic = sns.Topic(self, "Topic")

my_topic.add_subscription(subscriptions.FirehoseSubscription(stream))
java
import software.amazon.awscdk.services.kinesisfirehose.*;
DeliveryStream stream;


Topic myTopic = new Topic(this, "Topic");

myTopic.addSubscription(new FirehoseSubscription(stream));
csharp
using Amazon.CDK.AWS.KinesisFirehose;
DeliveryStream stream;


var myTopic = new Topic(this, "Topic");

myTopic.AddSubscription(new FirehoseSubscription(stream));
go
import firehose "github.com/aws/aws-cdk-go/awscdk"
var stream DeliveryStream


myTopic := sns.NewTopic(this, jsii.String("Topic"))

myTopic.AddSubscription(subscriptions.NewFirehoseSubscription(stream))

To remove any Amazon SNS metadata from published messages, specify rawMessageDelivery to true.

ts
import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';

const myTopic = new sns.Topic(this, 'Topic');
declare const stream: firehose.DeliveryStream;

myTopic.addSubscription(new subscriptions.FirehoseSubscription(stream, {
  rawMessageDelivery: true,
}));
python
import aws_cdk.aws_kinesisfirehose as firehose
# stream: firehose.DeliveryStream


my_topic = sns.Topic(self, "Topic")

my_topic.add_subscription(subscriptions.FirehoseSubscription(stream,
    raw_message_delivery=True
))
java
import software.amazon.awscdk.services.kinesisfirehose.*;
DeliveryStream stream;


Topic myTopic = new Topic(this, "Topic");

myTopic.addSubscription(FirehoseSubscription.Builder.create(stream)
        .rawMessageDelivery(true)
        .build());
csharp
using Amazon.CDK.AWS.KinesisFirehose;
DeliveryStream stream;


var myTopic = new Topic(this, "Topic");

myTopic.AddSubscription(new FirehoseSubscription(stream, new FirehoseSubscriptionProps {
    RawMessageDelivery = true
}));
go
import firehose "github.com/aws/aws-cdk-go/awscdk"
var stream DeliveryStream


myTopic := sns.NewTopic(this, jsii.String("Topic"))

myTopic.AddSubscription(subscriptions.NewFirehoseSubscription(stream, &FirehoseSubscriptionProps{
	RawMessageDelivery: jsii.Boolean(true),
}))

Types ​

NameKindSummary
EmailSubscriptionClassUse an email address as a subscription target.
EmailSubscriptionPropsStructOptions for email subscriptions.
FirehoseSubscriptionClassUse an Amazon Data Firehose delivery stream as a subscription target.
FirehoseSubscriptionPropsStructProperties for an Amazon Data Firehose subscription.
LambdaSubscriptionClassUse a Lambda function as a subscription target.
LambdaSubscriptionPropsStructProperties for a Lambda subscription.
SmsSubscriptionClassUse an sms address as a subscription target.
SmsSubscriptionPropsStructOptions for SMS subscriptions.
SqsSubscriptionClassUse an SQS queue as a subscription target.
SqsSubscriptionPropsStructProperties for an SQS subscription.
SubscriptionPropsStructOptions to subscribing to an SNS topic.
UrlSubscriptionClassUse a URL as a subscription target.
UrlSubscriptionPropsStructOptions for URL subscriptions.