Service Reference
SNS — Simple Notification Service
SNS uses a query-string or JSON API. Topics are identified by ARN: arn:aws:sns:us-east-1:000000000000:<topic-name>
SNS — Simple Notification Service
AWS docs: https://docs.aws.amazon.com/sns/latest/api/welcome.html
SNS uses a query-string or JSON API. Topics are identified by ARN:
arn:aws:sns:us-east-1:000000000000:<topic-name>
Subscription delivery is asynchronous — the HTTP response is returned before delivery completes to subscribers, matching the behaviour of real SNS.
Known limitations
- Subscription confirmation (
ConfirmSubscriptiontoken flow) is simplified: the emulator auto-confirms all subscriptions without requiring a token round-trip. - HTTP/HTTPS subscriptions require a reachable URL inside the Docker network.
emailandemail-jsonsubscriptions are captured in the Inbox (/_overcast/ses/inbox), viewable in the web UI.smssubscriptions are captured in the same Inbox withkind=sms, viewable in the web UI. No real SMS is sent. The endpoint must be a phone number in E.164 format (e.g.+12125551234).- Mobile push (
applicationprotocol) and Kinesis Firehose (firehoseprotocol) are not supported and return400 InvalidParameteronSubscribe. lambdasubscriptions invoke the function asynchronously with AWS’s SNS event —Records[0].EventSourceisaws:snsand the notification sits underRecords[0].Sns. As on AWS,RawMessageDeliveryhas no effect on alambdasubscription: the function always receives the full event.- Delivery to
lambdameans Lambda accepted the event, exactly as anInvocationType=Eventinvoke returns202before the handler runs. A function that is throttled — including one reserved to zero concurrency — is retried inside Lambda and is not a delivery failure, matching AWS. Whether the handler then succeeded is reported against the function, not the subscription. - A delivery that fails is not silently discarded. It is logged, published on the
event stream as
sns:DeliveryFailed, and — when the subscription’sRedrivePolicynames adeadLetterTargetArn— written to that SQS queue. Forlambdathat covers a function that does not exist, one that is not in an invokable state, a missing layer version, and a runtime the emulator cannot execute. - CloudFormation applies
AWS::SNS::Topicattributes through SNS on both create and update, and applies standaloneAWS::SNS::Subscriptionattributes through SNS after subscribing. The topic’s inlineSubscriptionlist creates the listed SNS subscriptions during creation. Updating that list or removing a previously configured SNS attribute fails the stack update rather than leaving stale SNS configuration. Cross-regionAWS::SNS::SubscriptionRegionis not implemented and fails the stack rather than being ignored. FIFO topic attributes round-trip, andPublishvalidates the FIFO-onlyMessageGroupId/MessageDeduplicationIdparameters against a topic name ending in.fifo, but actual FIFO ordering, deduplication, andSequenceNumbergeneration remain unimplemented (#183). Publishaccepts exactly one ofTopicArn,PhoneNumber, orTargetArnas the destination, matching AWS.PhoneNumberdelivers directly to the Inbox askind=smswith no topic involved.TargetArn(publishing to a mobile platform endpoint) returns400 InvalidParameter— Overcast has noCreatePlatformEndpoint, so noTargetArnis ever a real endpoint.PublishandPublishBatchvalidateMessage(≤ 256 KB, except SMS) andSubject(< 100 characters, no line breaks or control characters), and supportMessageStructure=json: theMessagevalue must be a JSON object with a stringdefaultkey, and each subscriber receives the entry keyed by its own protocol name (falling back todefault) — including underRawMessageDelivery, which strips the notification envelope but not the per-protocol selection underneath it.
Summary
| Category | ✅ Supported | ⚠️ Partial | ❌ Unsupported |
|---|---|---|---|
| Topics | 8 | ||
| Subscriptions | 7 | ||
| Publishing | 5 | 1 | |
| Platform applications (mobile push) | 5 | ||
| SMS | 1 | 3 |
Endpoints
Topics
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
CreateTopic | ✅ Supported | Idempotent; attributes stored; inline Tags applied at creation and left untouched by a repeat call | docs |
DeleteTopic | ✅ Supported | docs | |
GetTopicAttributes | ✅ Supported | docs | |
SetTopicAttributes | ✅ Supported | docs | |
ListTopics | ✅ Supported | docs | |
TagResource | ✅ Supported | Tags are stored on the topic; member-indexed form encoding | docs |
UntagResource | ✅ Supported | docs | |
ListTagsForResource | ✅ Supported | docs |
Subscriptions
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
Subscribe | ✅ Supported | Protocols: sqs, sms, email, email-json, http, https, lambda. application and firehose return 400. | docs |
ConfirmSubscription | ✅ Supported | Emulator auto-confirms; any token accepted | docs |
Unsubscribe | ✅ Supported | docs | |
ListSubscriptions | ✅ Supported | docs | |
ListSubscriptionsByTopic | ✅ Supported | docs | |
GetSubscriptionAttributes | ✅ Supported | Returns SubscriptionArn, TopicArn, Protocol, Endpoint, Owner + custom attributes | docs |
SetSubscriptionAttributes | ✅ Supported | Stores any attribute; FilterPolicy drives message filtering, RedrivePolicy the subscription dead-letter queue | docs |
Publishing
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
Publish | ✅ Supported | TopicArn/PhoneNumber/TargetArn destination selection (exactly one required); MessageStructure=json per-protocol payload selection; Message (256 KB) and Subject (<100 chars, no control/line-break chars) validation; async fan-out to sqs, lambda, email, email-json, http, https, and sms subscribers; records AWS/SNS CloudWatch metrics NumberOfMessagesPublished and PublishSize on accept, and NumberOfNotificationsDelivered/NumberOfNotificationsFailed per subscription delivery attempt (service-metrics-platform.md phase 2) — a delivery whose protocol dependency was never wired into this instance (nil enqueuer/mailer/smsSender/outbound) is treated as a delivery failure like any other protocol’s: failDelivery runs (recording NumberOfNotificationsFailed, redirecting to the subscription’s DLQ when configured), with a one-time Warn per (topic, protocol) telling the operator what to wire (#1306) | docs |
PublishBatch | ✅ Supported | Up to 10 messages; each entry independently validated (Message/Subject/MessageStructure=json), a bad entry fails without aborting the batch; records NumberOfMessagesPublished/PublishSize per successful entry | docs |
Message filtering (subscription filter policy) | ✅ Supported | String/Number attribute value matching via FilterPolicy on SetSubscriptionAttributes | docs |
Lambda subscription delivery | ✅ Supported | Publish invokes the subscribed function asynchronously with the AWS Records[].Sns event; RawMessageDelivery does not apply to lambda, matching AWS | docs |
Subscription dead-letter queue (RedrivePolicy) | ✅ Supported | A delivery that fails is redirected to the SQS queue named by the subscription’s RedrivePolicy | docs |
FIFO topic Publish parameters | ⚠️ Partial | MessageGroupId/MessageDeduplicationId are required and validated for a topic named *.fifo (or ContentBasedDeduplication substitutes for the dedup ID); actual FIFO ordering, deduplication, and SequenceNumber generation remain unimplemented | docs |
Platform applications (mobile push)
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
CreatePlatformApplication | ❌ Unsupported | APNs, GCM/FCM, ADM | docs |
DeletePlatformApplication | ❌ Unsupported | docs | |
ListPlatformApplications | ❌ Unsupported | docs | |
CreatePlatformEndpoint | ❌ Unsupported | Device registration | docs |
PublishToEndpoint | ❌ Unsupported | via Publish with TargetArn; returns 400 InvalidParameter explicitly rather than a generic missing-TopicArn error | docs |
SMS
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
SMS publish | ✅ Supported | via sms subscription on Publish, or directly via Publish with PhoneNumber (no topic involved); captured in the Inbox with kind=sms | docs |
CheckIfPhoneNumberIsOptedOut | ❌ Unsupported | docs | |
ListPhoneNumbersOptedOut | ❌ Unsupported | docs | |
OptInPhoneNumber | ❌ Unsupported | docs |