Skip to main content

SNS

Updated Jul 29, 2020 ·

Overview​

Amazon Simple Notification Service (SNS) helps send alerts like emails, text messages, and push notifications easily.

  • Publishers send messages to topics
  • Subscribers receive the messages

In SNS, a topic acts as the central channel that connects the publisher and subscribers.

Accessing SNS on AWS​

You can use the AWS console to work with SNS.

  • Open the AWS Services tab
  • Search for “SNS”
  • Click on “Simple Notification Service”

Once opened, you’ll be able to view and manage all topics and subscriptions.

  • Topics appear on the left
  • Subscriptions are also listed there
  • Each topic has a unique ARN (Amazon Resource Name)

This ARN is important as it uniquely identifies your topic when using SNS in code.

SNS Topics​

Topic Behavior and Permissions​

SNS topics behave predictably when recreated.

  • Creating a topic with the same name returns the same ARN
  • It doesn’t create duplicates
  • IAM permissions must allow SNS access

Creating an SNS Topic​

To create a topic:

## create client
import boto3
sns = boto3.client('sns',
region_name='us-east-1',
aws_access_key_id=AWS_KEY_ID,
aws_secret_access_key=AWS_SECRET)

response = sns.create_topic(Name='MyAlerts')
topic_arn = response['TopicArn']
print(topic_arn)

Output example:

arn:aws:sns:us-east-1:123456789012:MyAlerts

NOTE: You can also create the topic using a oneliner:

topic_arn_1 = sns.create_topic(Name='MyAlerts')['TopicArn']

Create Multiple Topics​

You can create several topics quickly using a simple loop.

departments = ['trash', 'streets', 'water']

for dept in departments:
sns.create_topic(Name="{}_general".format(dept))
sns.create_topic(Name="{}_critical".format(dept))

Listing Existing Topics​

You can see all existing SNS topics your user has access to. The response will include all Topic ARNs

response = sns.list_topics()
for topic in response['Topics']:
print(topic['TopicArn'])

Deleting a Topic​

When a topic is no longer needed, it’s best to remove it.

sns.delete_topic(TopicArn=topic_arn)
print("Topic deleted.")

To delete multiple topics, you can loop through a filtered list and delete each topic.

topics = sns.list_topics()['Topics']

for topic in topics:
# If not marked critical, delete it
if "critical" not in topic['TopicArn']:
sns.delete_topic(TopicArn=topic['TopicArn'])

SNS Subscriptions​

Subscriptions are how users receive updates from a topic in Amazon SNS.

  • Each subscription has a unique ID
  • It also includes a protocol such as email or SMS
  • The endpoint is the phone number or email where messages are delivered

SNS supports many types of message delivery, including

  • Email, for sending notifications to email addresses
  • SMS, for sending text messages to mobile numbers

Subscription Details​

Each subscription has a few key properties.

  • The protocol defines how the message is delivered
  • The endpoint is the specific email or phone number
  • The status shows if the user has confirmed the subscription

Phone numbers confirm automatically, while email subscriptions require clicking a confirmation link.

Create an SMS Subscription​

To create a text message (SMS) subscription using boto3:

import boto3
sns = boto3.client('sns')

response_sms = sns.subscribe(
TopicArn='arn:aws:sns:us-east-1:123456789012:city_alerts',
Protocol='sms',
Endpoint='+15551234567'
)

print(response_sms['SubscriptionArn'])

This returns a SubscriptionArn, which uniquely identifies your subscription.

arn:aws:sns:us-east-1:123456789012:city_alerts:55555555-aaaa-bbbb-cccc-555555555555

Create an Email Subscription​

We can also subscribe using an email address instead of a phone number.

  • Use the same subscribe() method
  • Set the protocol to “email”
  • Provide the recipient’s email address as the endpoint
response_email = sns.subscribe(
TopicArn='arn:aws:sns:us-east-1:123456789012:city_alerts',
Protocol='email',
Endpoint='user@example.com'
)

print(response_email['SubscriptionArn'])

At first, the status shows pending confirmation. The recipient must click the link in their email to activate it. Once confirmed, it changes to confirmed and can receive notifications.

Create Multiple Subscriptions​

You can add multiple subscribers to a topic at once, which is useful for sending notifications to a group.

# For each email in contacts, create subscription to street_critical
for email in contacts['Email']:
sns.subscribe(TopicArn = str_critical_arn,
Protocol = 'email',
Endpoint = email)

response = sns.list_subscriptions_by_topic(
TopicArn = str_critical_arn)
subs = pd.DataFrame(response['Subscriptions'])

subs.head()

Output:


SubscriptionArn Owner Protocol Endpoint TopicArn
0 arn:aws:sns:us-east-1:123456789012:streets_cri... email js@fake.com arn:aws:sns:us-east-1:123456789012:streets_cri...
1 arn:aws:sns:us-east-1:123456789012:streets_cri... email whoami@fake.com arn:aws:sns:us-east-1:123456789012:streets_cri...
2 arn:aws:sns:us-east-1:123456789012:streets_cri... email tom@fake.com arn:aws:sns:us-east-1:123456789012:streets_cri...
3 arn:aws:sns:us-east-1:123456789012:streets_cri... email bob@abc.com arn:aws:sns:us-east-1:123456789012:streets_cri...
4 arn:aws:sns:us-east-1:123456789012:streets_cri... email alex@fake.com arn:aws:sns:us-east-1:123456789012:streets_cri...

List Subscriptions for a Topic​

You can list all subscribers connected to a topic.

response = sns.list_subscriptions_by_topic(
TopicArn='arn:aws:sns:us-east-1:123456789012:city_alerts'
)

for sub in response['Subscriptions']:
print(sub['Protocol'], sub['Endpoint'], sub['SubscriptionArn'])

The response contains a list of all subscriptions for that topic

email user1@example.com arn:aws:sns:us-east-1:123456789012:city_alerts:11111111-aaaa-bbbb-cccc-111111111111
sms +15551234567 arn:aws:sns:us-east-1:123456789012:city_alerts:22222222-aaaa-bbbb-cccc-222222222222
lambda arn:aws:lambda:us-east-1:123456789012:function:process_alert arn:aws:sns:us-east-1:123456789012:city_alerts:33333333-aaaa-bbbb-cccc-333333333333

List All Subscriptions​

You can also view every subscription across all topics.

response = sns.list_subscriptions()

for sub in response['Subscriptions']:
print(sub['TopicArn'], sub['Protocol'], sub['Endpoint'], sub['SubscriptionArn'])

Output:

arn:aws:sns:us-east-1:123456789012:city_alerts sms +15551234567 arn:aws:sns:us-east-1:123456789012:city_alerts:55555555-aaaa-bbbb-cccc-555555555555
arn:aws:sns:us-east-1:123456789012:weather_updates email user@example.com arn:aws:sns:us-east-1:123456789012:weather_updates:99999999-dddd-eeee-ffff-999999999999

Delete Subscriptions​

To stop sending notifications to certain users:

sns.unsubscribe(SubscriptionArn='arn:aws:sns:us-east-1:123456789012:abc123')
print("Subscription removed.")

To delete multiple subscriptions, you can loop through all subscriptions to remove users with a specific protocol.

# List subscriptions for streets_critical topic.
response = sns.list_subscriptions_by_topic(
TopicArn = str_critical_arn)

# For each subscription, if protocol is SMS, unsubscribe
for sub in response['Subscriptions']:
if sub['Protocol'] == 'sms':
sns.unsubscribe(SubscriptionArn=sub['SubscriptionArn'])

subs = sns.list_subscriptions_by_topic(
TopicArn=str_critical_arn)['Subscriptions']

Remove Multiple Subscriptions​

You can also remove multiple subscriptions at once, for example, all SMS-based ones.

response = sns.list_subscriptions()
for sub in response['Subscriptions']:
if sub['Protocol'] == 'sms':
sns.unsubscribe(SubscriptionArn=sub['SubscriptionArn'])

Sending Messages​

Sending messages with Amazon SNS is simple and flexible. You can broadcast to many people or send a single text message to one recipient.

  • You can publish to a topic
  • You can send a single SMS message
  • You can also customize each message

Publishing To A Topic​

When you publish to a topic, every subscriber connected to that topic receives the message. This method helps distribute one message to many recipients at once.

import boto3
sns = boto3.client('sns')

sns.publish(
TopicArn='arn:aws:sns:us-east-1:123456789012:weather_alerts',
Message='Heavy rain expected tomorrow. Stay safe!',
Subject='Weather Update'
)

Expected result:

{
'MessageId': 'abcd1234-5678-efgh-ijkl-1234567890ab'
}

Message And Subject​

The message body and subject determine what the subscribers receive.

  • Message is the main text
  • Subject appears only in email messages
  • SMS messages ignore the subject line

This keeps email messages clear and detailed, while SMS messages stay short and direct.

Sending Custom Messages​

You can create messages dynamically using variables.

city = "Springfield"
temp = 35

sns.publish(
TopicArn='arn:aws:sns:us-east-1:123456789012:weather_alerts',
Message=f"Alert for {city}: Temperature reaching {temp}°C today!"
)

Sending A Single SMS​

You can also send one SMS directly to a phone number.

sns.publish(
PhoneNumber='+15551234567',
Message='System maintenance scheduled for 10 PM tonight.'
)

Sending direct SMS messages works well for quick, one-time alerts.

  • Good for temporary notifications
  • Not ideal for repeated or automated use
  • Harder to maintain in larger systems

For growing systems, topics make it easier to manage subscribers and updates.

Topic vs Single SMS​

There are two main ways to send messages.

  • Publish to a topic

    • Reaches multiple subscribers
    • Easier to maintain
  • Send a single SMS

    • Simple for one recipient
    • Great for quick, direct messages