Amazon SNS errors and delivery failures

Look up an SNS API exception (AuthorizationError, NotFound, InvalidParameter, Throttled, KMS*, EndpointDisabled, batch and limit errors), and find out why a published message never reached a subscriber — retry tables per endpoint type, permanent failures that aren't retried, discard without a subscription DLQ, queue and key policies, filter policies, unconfirmed subscriptions — including the topic policy CloudWatch alarms and EventBridge need to publish.

markdownreferencev4CH67-VC09stage: operatetrust: officialservice: snsinterface: anyAuthorizationErrorExceptionNotFoundException SNSInvalidParameterException SNSInvalidParameterValueExceptionThrottledExceptionKMSAccessDeniedExceptionKMSDisabledExceptionKMSNotFoundExceptionKMSThrottlingExceptionEndpointDisabledExceptionFilterPolicyLimitExceededExceptionSubscriptionLimitExceededExceptionTopicLimitExceededExceptionTooManyEntriesInBatchRequestExceptionInvalidSecurityExceptionSNS message not deliveredSNS retry policy100015 attempts 23 days50 attempts 6 hoursSNS discards messagesubscription pending confirmationSNS topic policy cloudwatch.amazonaws.comalarm SNS not publishingEventBridge SNS topic policy

Created 18 Oct 2026 · Modified 23 Oct 2026 · 4 versions

A successful Publish only means SNS accepted the message. Delivery to each subscriber happens afterwards, with its own retries, and failures there never reach the publisher. Check the subscriber side first.

Message published, subscriber got nothing

CauseFixCheck
Queue policy doesn't allow sns.amazonaws.com sqs:SendMessage from this topicAdd the statement with aws:SourceArn = topic (patterns/sns-to-sqs-fanout.md)aws sqs get-queue-attributes --queue-url <u> --attribute-names Policy
Encrypted queue on aws/sqs, or a key policy without sns.amazonaws.comCustomer managed key with kms:Decrypt + kms:GenerateDataKey* for SNS, or SSE-SQSaws sqs get-queue-attributes --attribute-names KmsMasterKeyId, then aws kms get-key-policy --key-id <k> --policy-name default
Filter policy excluded it, or was changed less than 15 minutes agoreference/sns/filter-policies.mdaws sns get-subscription-attributes --subscription-arn <s> → FilterPolicy, FilterPolicyScope
Raw delivery to SQS with more than 10 attributesDiscarded as a client-side error. Reduce the attributes or disable raw deliveryCount the message's attributes; get-subscription-attributes → RawMessageDelivery
Subscription pending confirmation (email, cross-account SQS)Confirm it. Email: the link in the "AWS Notifications" messageaws sns list-subscriptions-by-topic --topic-arn <t>: PendingConfirmation as the subscription ARN
Permanent error (not 5XX or 429), e.g. permissionsNot retried, then discarded unless the subscription has a DLQThe subscription DLQ, if any, holds the message; the subscriber's own logs
Retries exhaustedDiscarded unless the subscription has a DLQ (RedrivePolicy)get-subscription-attributes → RedrivePolicy present?
Lambda subscriberThe function's resource-based policy must allow sns.amazonaws.com to invoke it (reference/lambda/permissions.md)aws lambda get-policy --function-name <fn>: sns.amazonaws.com with the topic as SourceArn

Retry schedules

EndpointScheduleTotal
SQS, Lambda (AWS managed)3 immediate; 2 at 1 s; 10 backoff 1–20 s; 100,000 at 20 s100,015 attempts over 23 days
SMTP, SMS, mobile push (customer managed)0 immediate; 2 at 10 s; 10 backoff 10–600 s; 38 at 600 s50 attempts over 6 hours
HTTP/SSame four phases; custom delivery policies allowedPolicy-dependent
FirehoseThrottling errors use the customer-managed schedule—

Only 5XX and 429 responses are retried. Messages SNS holds back because of a subscription's maxReceivesPerSecond are requeued without using attempts.

Other services publishing to your topic

They need a topic policy statement for their service principal, plus key access if the topic is encrypted.

CloudWatch alarms:

{
  "Effect": "Allow",
  "Principal": { "Service": "cloudwatch.amazonaws.com" },
  "Action": "SNS:Publish",
  "Resource": "arn:aws:sns:<region>:<topic-account>:<topic>",
  "Condition": {
    "ArnLike": { "aws:SourceArn": "arn:aws:cloudwatch:<region>:<alarm-account>:alarm:*" },
    "StringEquals": { "aws:SourceAccount": "<alarm-account>" }
  }
}

If an alarm ARN has non-ASCII characters, condition on aws:SourceAccount only.

EventBridge: sns:Publish for events.amazonaws.com. If the topic is encrypted, the customer managed key also needs kms:Decrypt and kms:GenerateDataKey for events.amazonaws.com. Rules deleted soon after creation can leave this permission on the topic, so remove it with aws sns set-topic-attributes.

API exceptions

ExceptionMeaning → fixCheck
AuthorizationErrorExceptionAccess denied to the topic or action. Check the caller's IAM policy and the topic policy (guides/iam/fix-access-denied.md)aws sns get-topic-attributes --topic-arn <t> → Policy; the caller's IAM policy
NotFoundExceptionThe topic, subscription or endpoint doesn't exist. Check the ARN's Region and accountaws sns list-topics --region <r> with the same credentials
InvalidParameterException, InvalidParameterValueException, ValidationExceptionA parameter breaks a constraint, for example an invalid filter policy JSON or a FIFO-only parameter on a standard topic (example is the hub's reading)The message names the parameter; validate filter policies as JSON
ThrottledExceptionThe request rate exceeds your account's limit for the action. Back off; use PublishBatchCalls per second in your code; CloudTrail errorCode
KMSAccessDeniedException, KMSDisabledException, KMSInvalidStateException, KMSNotFoundException, KMSOptInRequired, KMSThrottlingExceptionThe topic's key can't be used by the publisher: no access, disabled, pending deletion, missing, or throttled (reference/kms/key-policies-and-errors.md)aws sns list-topics --region <r> with the same credentials
EndpointDisabledException, PlatformApplicationDisabledExceptionMobile push endpoint or application disabledaws sns get-endpoint-attributes --endpoint-arn <e> → Enabled
FilterPolicyLimitExceededExceptionToo many filter policies in the account (an adjustable quota). Request an increaseService Quotas for SNS filter policies; count existing ones
SubscriptionLimitExceededException, TopicLimitExceededExceptionAccount subscription or topic quota reachedService Quotas for SNS
TooManyEntriesInBatchRequestException, BatchRequestTooLongException, BatchEntryIdsNotDistinctException, EmptyBatchRequestException, InvalidBatchEntryIdExceptionPublishBatch: more than 10 entries, total too large, duplicate IDs, none, or malformed IDsCount the PublishBatch entries and their IDs
InvalidSecurityExceptionNot HTTPS, or not signed with SigV4The client's endpoint scheme and signing
OptedOutExceptionSMS: the number opted outaws sns check-if-phone-number-is-opted-out --phone-number <n>
InternalErrorExceptionService-side. Retry with backoffRetry; if persistent, keep the request ID

The SNS message size limit wasn't on the collected pages.

When none of these fits

Turn on delivery-status logging for the protocol (UNVERIFIED setup steps; not collected), or attach a subscription DLQ and read what lands there. Check the topic's NumberOfNotificationsFailed metric (UNVERIFIED metric name). Confirm the subscription's PendingConfirmation status and its FilterPolicy with aws sns get-subscription-attributes.

Read this document as markdown — the same bytes an agent receives.