overcast local AWS emulator

Service Reference

SQS — Simple Queue Service

SQS supports AWS JSON 1.0, AWS Query, and Smithy RPC v2 CBOR. JSON and Query requests share the root endpoint; the action is identified by the Action query parameter or the...

SQS — Simple Queue Service

AWS docs: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Welcome.html

SQS supports AWS JSON 1.0, AWS Query, and Smithy RPC v2 CBOR. JSON and Query requests share the root endpoint; the action is identified by the Action query parameter or the X-Amz-Target header in SDK requests. RPC v2 CBOR requests use /service/AmazonSQS/operation/<Operation> with Smithy-Protocol: rpc-v2-cbor.

Queue URLs are returned in the form http://localhost:4566/<account-id>/<queue-name>. For local use, <account-id> defaults to 000000000000.

Queue URLs and endpoint resolution

AWS SDKs resolve the SQS endpoint from the QueueUrl, not from the endpoint you configured. The JS v3 client’s queueUrlMiddleware replaces the resolved endpoint with the queue URL’s origin whenever the two differ, and .NET and Java v1 use the queue URL as the request URI outright — a leftover from the Query protocol, where a queue was addressed by its URL.

AWS_ENDPOINT_URL does not protect against this. It is resolved through the endpoint ruleset’s Endpoint parameter and never becomes the client’s endpoint config field, which is what the middleware checks. Only an endpoint passed explicitly to the client suppresses the override:

// Both of these keep the client pinned to Overcast:
new SQSClient({ endpoint: process.env.AWS_ENDPOINT_URL });
new SQSClient({ useQueueUrlAsEndpoint: false });

The practical consequence is that a queue URL is only usable by a caller that can dial its origin. Overcast therefore mints queue URLs per request, on the origin the caller reached it on: a host CLI hitting localhost:4566 gets localhost:4566 URLs, and a Lambda container calling in on Overcast’s container address gets that address. OVERCAST_HOSTNAME is the fallback for callers with no usable origin, not an override.

Queue URLs minted elsewhere are always accepted — only the queue name is read from the URL, so a queue created on one origin can be addressed from another.

For URLs that cross the boundary out-of-band — a CDK deploy run on the host baking queue.queueUrl into a function’s environment — see Lambda: reaching Overcast from function code.



Known limitations

  • Visibility timeout clocks are wall-clock based. They may drift slightly under high load in the in-memory backend.
  • Message attribute data types Binary and Number are stored but not validated.
  • SQS → Lambda event source mapping requires the Lambda service; see lambda.md.

Summary

Category✅ Supported❌ Unsupported
Queue management10
Message operations7
Permissions2
Dead-letter queues2

Endpoints

Queue management

OperationStatusNotesAWS Docs
CreateQueue✅ SupportedIdempotent; FIFO queues supported (.fifo suffix); accepts tags inlinedocs
DeleteQueue✅ Supporteddocs
GetQueueUrl✅ Supporteddocs
ListQueues✅ SupportedOptional QueueNamePrefix filterdocs
GetQueueAttributes✅ SupportedAll standard attributes; All wildcard supported; ApproximateNumberOfMessages(NotVisible) reflects the same counts a background sampler also publishes to CloudWatch every minute as ApproximateNumberOfMessagesVisible/NotVisible/Delayed (service-metrics-platform.md phase 2), whether or not the queue has trafficdocs
SetQueueAttributes✅ SupportedRedriveAllowPolicy accepted, validated, and round-tripped; the redrivePermission restriction itself is not enforced against StartMessageMoveTask or automatic DLQ redrivedocs
PurgeQueue✅ SupportedDeletes all messages immediatelydocs
ListQueueTags✅ Supporteddocs
TagQueue✅ SupportedMerges with existing tagsdocs
UntagQueue✅ Supporteddocs

Message operations

OperationStatusNotesAWS Docs
SendMessage✅ SupportedDelaySeconds, MessageAttributes supported; records AWS/SQS CloudWatch metrics NumberOfMessagesSent and SentMessageSize (service-metrics-platform.md phase 2), skipped for a FIFO content-based-deduplication resend since no new message is enqueueddocs
SendMessageBatch✅ SupportedUp to 10 messages per batch; records NumberOfMessagesSent/SentMessageSize per successful entrydocs
ReceiveMessage✅ SupportedMaxNumberOfMessages, VisibilityTimeout, WaitTimeSeconds, queue default long polling, FIFO ReceiveRequestAttemptId; records NumberOfMessagesReceived (non-empty) or NumberOfEmptyReceives (zero messages) once per call, after any long-poll retry settlesdocs
DeleteMessage✅ SupportedRecords NumberOfMessagesDeleteddocs
DeleteMessageBatch✅ SupportedUp to 10 messages per batch; records NumberOfMessagesDeleted per successful entrydocs
ChangeMessageVisibility✅ SupportedSets new visibility timeout on an in-flight messagedocs
ChangeMessageVisibilityBatch✅ SupportedBatch visibility timeout changes; per-entry success/failure responsedocs

Permissions

OperationStatusNotesAWS Docs
AddPermission❌ Unsupportedstub; returns 501docs
RemovePermission❌ Unsupportedstub; returns 501docs

Dead-letter queues

OperationStatusNotesAWS Docs
ListDeadLetterSourceQueues✅ SupportedLists queues that target a given DLQdocs
StartMessageMoveTask✅ SupportedRedrives messages from a DLQ back to its source queuedocs