> aws-sns
Use Amazon SNS for pub/sub messaging and notifications. Create topics and manage subscriptions across protocols (SQS, Lambda, HTTP, email, SMS). Configure message filtering, mobile push notifications, and fan-out architectures.
curl "https://skillshub.wtf/TerminalSkills/skills/aws-sns?format=md"AWS SNS
Amazon Simple Notification Service (SNS) is a fully managed pub/sub messaging service. Publishers send messages to topics, and subscribers receive them via SQS, Lambda, HTTP/S, email, SMS, or mobile push. It's the glue for fan-out architectures.
Core Concepts
- Topic — a logical channel for publishing messages
- Subscription — an endpoint subscribed to a topic (SQS, Lambda, HTTP, email, SMS)
- Message filtering — JSON policy to route only matching messages to a subscriber
- Fan-out — one message published, delivered to all subscribers simultaneously
- FIFO Topic — ordered, deduplicated delivery (pairs with FIFO SQS queues)
Topics
# Create a standard topic
aws sns create-topic --name order-events
# Create a FIFO topic
aws sns create-topic \
--name order-events.fifo \
--attributes FifoTopic=true,ContentBasedDeduplication=true
# List topics
aws sns list-topics --query 'Topics[].TopicArn' --output table
Subscriptions
# Subscribe an SQS queue to a topic
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789:order-events \
--protocol sqs \
--notification-endpoint arn:aws:sqs:us-east-1:123456789:order-processing
# Subscribe a Lambda function
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789:order-events \
--protocol lambda \
--notification-endpoint arn:aws:lambda:us-east-1:123456789:function:process-order
# Subscribe an HTTP endpoint
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789:order-events \
--protocol https \
--notification-endpoint https://api.myapp.com/webhooks/orders
# Subscribe email (requires confirmation)
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789:order-events \
--protocol email \
--notification-endpoint alerts@myapp.com
# List subscriptions for a topic
aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:us-east-1:123456789:order-events
Publishing Messages
# Publish a message to a topic
aws sns publish \
--topic-arn arn:aws:sns:us-east-1:123456789:order-events \
--message '{"orderId":"12345","status":"completed","amount":99.99}' \
--message-attributes '{
"event_type": {"DataType":"String","StringValue":"order.completed"},
"priority": {"DataType":"String","StringValue":"high"}
}'
# Publish to FIFO topic
aws sns publish \
--topic-arn arn:aws:sns:us-east-1:123456789:order-events.fifo \
--message '{"orderId":"12345","status":"completed"}' \
--message-group-id "customer-789" \
--message-deduplication-id "order-12345-completed"
# Publish with different payloads per protocol
aws sns publish \
--topic-arn arn:aws:sns:us-east-1:123456789:alerts \
--message-structure json \
--message '{
"default": "Order 12345 completed",
"email": "Your order #12345 has been completed. Thank you!",
"sqs": "{\"orderId\":\"12345\",\"status\":\"completed\"}"
}'
Message Filtering
# Set filter policy — subscriber only gets "order.completed" events
aws sns set-subscription-attributes \
--subscription-arn arn:aws:sns:us-east-1:123456789:order-events:abc-123 \
--attribute-name FilterPolicy \
--attribute-value '{
"event_type": ["order.completed"],
"priority": ["high", "critical"]
}'
# Filter on message body (not just attributes)
aws sns set-subscription-attributes \
--subscription-arn arn:aws:sns:us-east-1:123456789:order-events:abc-123 \
--attribute-name FilterPolicyScope \
--attribute-value MessageBody
aws sns set-subscription-attributes \
--subscription-arn arn:aws:sns:us-east-1:123456789:order-events:abc-123 \
--attribute-name FilterPolicy \
--attribute-value '{"status": ["completed"], "amount": [{"numeric": [">=", 100]}]}'
Fan-Out Pattern (SNS → SQS)
# Fan-out setup: one SNS topic publishing to multiple SQS queues
import boto3
import json
sns = boto3.client('sns')
sqs = boto3.client('sqs')
# Create topic
topic = sns.create_topic(Name='order-events')
topic_arn = topic['TopicArn']
# Create queues for different consumers
queues = ['order-fulfillment', 'order-analytics', 'order-notifications']
for queue_name in queues:
queue = sqs.create_queue(QueueName=queue_name)
queue_url = queue['QueueUrl']
attrs = sqs.get_queue_attributes(QueueUrl=queue_url, AttributeNames=['QueueArn'])
queue_arn = attrs['Attributes']['QueueArn']
# Allow SNS to send to SQS
policy = {
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "sns.amazonaws.com"},
"Action": "sqs:SendMessage",
"Resource": queue_arn,
"Condition": {"ArnEquals": {"aws:SourceArn": topic_arn}}
}]
}
sqs.set_queue_attributes(QueueUrl=queue_url, Attributes={"Policy": json.dumps(policy)})
# Subscribe
sns.subscribe(TopicArn=topic_arn, Protocol='sqs', Endpoint=queue_arn)
Mobile Push
# Create platform application for FCM (Android)
aws sns create-platform-application \
--name my-app-android \
--platform GCM \
--attributes PlatformCredential="YOUR_FCM_SERVER_KEY"
# Register a device token
aws sns create-platform-endpoint \
--platform-application-arn arn:aws:sns:us-east-1:123456789:app/GCM/my-app-android \
--token "device-token-from-fcm"
# Send push notification to a device
aws sns publish \
--target-arn arn:aws:sns:us-east-1:123456789:endpoint/GCM/my-app-android/abc123 \
--message '{"GCM":"{\"notification\":{\"title\":\"Order Shipped\",\"body\":\"Your order is on the way\"}}"}' \
--message-structure json
Best Practices
- Use message filtering to avoid unnecessary processing at subscribers
- Pair SNS with SQS for reliable fan-out (SNS alone doesn't retry on failure)
- Use FIFO topics + FIFO queues when message ordering matters
- Set delivery retry policies for HTTP/S endpoints
- Enable CloudWatch logging on SNS topics for debugging
- Use message attributes for routing, keep the body for data
- Grant least-privilege access with topic policies
> related_skills --same-repo
> zustand
You are an expert in Zustand, the small, fast, and scalable state management library for React. You help developers manage global state without boilerplate using Zustand's hook-based stores, selectors for performance, middleware (persist, devtools, immer), computed values, and async actions — replacing Redux complexity with a simple, un-opinionated API in under 1KB.
> zoho
Integrate and automate Zoho products. Use when a user asks to work with Zoho CRM, Zoho Books, Zoho Desk, Zoho Projects, Zoho Mail, or Zoho Creator, build custom integrations via Zoho APIs, automate workflows with Deluge scripting, sync data between Zoho apps and external systems, manage leads and deals, automate invoicing, build custom Zoho Creator apps, set up webhooks, or manage Zoho organization settings. Covers Zoho CRM, Books, Desk, Projects, Creator, and cross-product integrations.
> zod
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
> zipkin
Deploy and configure Zipkin for distributed tracing and request flow visualization. Use when a user needs to set up trace collection, instrument Java/Spring or other services with Zipkin, analyze service dependencies, or configure storage backends for trace data.