Verified AWS Facts — Single Source of Truth
Verified on: 2026-09-21 against official AWS documentation.
Every number in this course comes from this file. Chapters must link here rather than restate values inline, so that one re-verification pass updates the whole course.
Why this file exists. Most SQS tutorials on the internet are 5+ years stale. Several of the values below changed recently and are commonly taught wrong. Those are flagged ⚠️.
1. Message quotas
| Item | Value | Notes |
|---|---|---|
| Maximum message size | 1,048,576 bytes (1 MiB) | ⚠️ Widely taught as 256 KB. AWS raised it. Payloads beyond 1 MiB need the Extended Client Library (S3-backed, up to 2 GB, sync clients only). |
| Minimum message size | 1 byte | |
| Messages per batch request | 10 | Applies to SendMessageBatch, DeleteMessageBatch, ChangeMessageVisibilityBatch. |
MaxNumberOfMessages (ReceiveMessage) | 1–10, default 1 | ⚠️ The SDK default is 1, not 10. Always set it explicitly. |
| Message metadata attributes | 10 per message | Separate from the body. |
| Batched message ID | ≤ 80 chars, [A-Za-z0-9_-] | Per-entry ID inside a batch request; not the MessageId. |
| Message body content | XML, JSON, unformatted text; restricted Unicode ranges | #x9 | #xA | #xD | #x20–#xD7FF | #xE000–#xFFFD | #x10000–#x10FFFF. Raw binary must be Base64-encoded. |
Source: SQS message quotas
2. Time-based configuration
| Setting | Min | Default | Max |
|---|---|---|---|
| Visibility timeout | 0 s | 30 s | 12 hours |
| Message retention period | 60 s (1 min) | 4 days | 14 days (1,209,600 s) |
Delivery delay (queue-level DelaySeconds / per-message message timer) | 0 s | 0 s | 15 minutes |
WaitTimeSeconds (long polling) | 0 s | 0 s | 20 seconds |
| FIFO deduplication interval | — | — | 5 minutes (not configurable) |
Sources: message quotas, standard queue quotas, exactly-once processing
⚠️ Teaching note.
WaitTimeSecondsdefaults to 0 (short polling) on a freshly created queue via the API. The console defaults differ. Never assume long polling is on.
3. Queue quotas
| Item | Standard | FIFO |
|---|---|---|
| In-flight messages (received, not yet deleted) | ~120,000 (approximate; depends on traffic and backlog) | 120,000 ⚠️ (older docs and most blogs say 20,000) |
| Behaviour at the in-flight limit | Short polling → OverLimit error. Long polling → no error, just no messages. | No error returned; processing degrades. |
| Messages stored (backlog) | Unlimited | Unlimited |
| Queue name | ≤ 80 chars, [A-Za-z0-9_-], case-sensitive | Same, and must end in .fifo (suffix counts toward the 80) |
ListQueues page size | 1,000 | 1,000 |
| Message groups per FIFO queue | n/a | No quota |
| Queue policy | 8,192 bytes / 20 statements / 50 principals / 10 conditions | same |
| Tags | ≤ 50 recommended; tagging API limited to 30 TPS per account | same |
Sources: standard queue quotas, FIFO queue quotas
4. Throughput
Standard queues
Nearly unlimited API calls per second, per action (SendMessage, ReceiveMessage, DeleteMessage).
Scales automatically with demand. There is no published per-queue TPS ceiling.
FIFO queues — default (non-high-throughput) mode
| Mode | Limit |
|---|---|
| Without batching | 300 TPS per API action, per partition |
| With batching (10 per call) | 3,000 messages/sec per API action (= 300 calls × 10) |
FIFO queues — high throughput mode enabled
Limits are on API requests, not messages, and are region-dependent:
| Region group | Non-batched TPS | Batched (×10) messages/sec |
|---|---|---|
| us-east-1, us-west-2, eu-west-1 | 70,000 | 700,000 |
| us-east-2, eu-central-1 | 19,000 | 190,000 |
| ap-south-1, ap-southeast-1, ap-southeast-2, ap-northeast-1, eu-south-2 | 9,000 | 90,000 |
| eu-west-2, sa-east-1 | 4,500 | 45,000 |
| All other regions | 2,400 | 24,000 |
Higher limits can be requested via Service Quotas.
Source: SQS message quotas — Message throughput
5. FIFO specifics
MessageGroupIdis required on every send to a FIFO queue; omitting it fails the call. Length ≤ 128 chars; alphanumerics plus punctuation.- Deduplication requires one of:
ContentBasedDeduplicationenabled on the queue → SQS takes a SHA-256 of the message body only (⚠️ not the message attributes — two messages differing only in attributes are treated as duplicates), or- an explicit
MessageDeduplicationIdper message.
- Deduplication interval is 5 minutes, fixed. A
SendMessageretry within that window does not create a duplicate. - AWS's phrase "exactly-once processing" means SQS does not introduce duplicates into the queue.
⚠️ It does not mean your consumer runs exactly once — a consumer crash before
DeleteMessagestill causes redelivery. See Module 09.
Source: Exactly-once processing in Amazon SQS
6. Fair queues (newer feature)
MessageGroupId is now also accepted on standard queues, where it enables fair queues —
mitigating noisy-neighbour starvation when one tenant floods a shared queue. AWS recommends
including a MessageGroupId on all messages when using fair queues. Fair-queue requests are billed
at both fair-queue and standard rates.
Sources: message quotas — Message group ID, SQS pricing
7. Dead-letter queues
- DLQ must be in the same AWS account and Region as the source queue, and the same queue type (a FIFO source needs a FIFO DLQ).
maxReceiveCountin the redrive policy = how many times a message may be received before it is moved to the DLQ.maxReceiveCount = 1means one failed receive sends it to the DLQ.- Redrive allow policy on the DLQ controls which source queues may use it:
allowAll(default),byQueue(up to 10 source queue ARNs), ordenyAll. - ⚠️ Standard queues only: if
maxReceiveCount > 3and a message has been received 3 or more times without deletion, SQS moves it to the back of the queue.ApproximateAgeOfOldestMessagethen reflects the next message under that threshold — a subtle metric distortion worth knowing during incidents. - Retention on move:
- Standard: the original enqueue timestamp is preserved. A message that spent 1 day in the source queue and moves to a DLQ with 4-day retention is deleted after 3 more days.
- FIFO: the enqueue timestamp resets on the move.
- → Best practice: DLQ retention longer than source queue retention.
- AWS explicitly warns against DLQs on FIFO queues where strict ordering must never break.
Source: Using dead-letter queues in Amazon SQS
8. Lambda event source mapping (ESM)
Who polls? ⚠️ The Lambda service polls SQS. Your function does not. Lambda calls
ReceiveMessage, invokes your function synchronously with a batch, and calls DeleteMessage
for the batch only on success.
Default (on-demand) scaling — standard queues
| Behaviour | Value |
|---|---|
| Initial concurrency when messages appear | 5 concurrent invocations (5 batches at a time) |
| Scale-up rate | up to +300 concurrent invokes per minute |
| Max concurrent invokes per ESM | 1,250 |
| Scale-down when idle | back to 5, optimising to as few as 2 (disabled if max-concurrency is set) |
MaximumConcurrency setting range | 2–1,000 per event source |
Batching
| Setting | Value |
|---|---|
| Default batch size | 10 |
Max batching window (MaximumBatchingWindowInSeconds) | up to 5 minutes |
| Low-traffic caveat | With a batch window, Lambda may wait up to 20 s even if you configured less |
| Invocation trigger | batch window expires OR payload size quota reached OR max batch size reached |
FIFO queues
Order is preserved; a batch may span multiple message groups. Concurrency is capped by min(number of active message group IDs, MaximumConcurrency). On error, all retries for the affected messages complete before Lambda takes more from that group.
Provisioned mode (newer)
| Item | Value |
|---|---|
| Per event poller | up to 1 MB/s, 10 concurrent invokes, or 10 SQS polling API calls/sec |
MinimumPollers | 2–200 (default 2) |
MaximumPollers | 2–10,000 (default 200) |
| Scale-up rate | up to 1,000 concurrency per minute (3× faster than on-demand) |
| Max concurrency | up to 100,000 concurrent invokes |
| Mutually exclusive with | the MaximumConcurrency setting |
Poller sizing formula AWS publishes:
EPS per event poller = min(
ceil(1024 / avg event size in KB),
ceil(10 / avg function duration in seconds) * batchSize,
min(100, 10 * batchSize)
)
Required event pollers = peak events/sec ÷ EPS per event pollerFailure handling: by default a function error makes the whole batch visible again →
duplicate processing of already-succeeded messages. Fix with ReportBatchItemFailures
(partial batch response) or by calling DeleteMessage yourself as each message succeeds.
Sources: Using Lambda with Amazon SQS, Configuring scaling behavior for SQS event source mappings
9. Pricing
Verified 2026-09-21. Re-verify before quoting — pricing changes.
| Item | Value |
|---|---|
| Free tier | 1,000,000 requests/month, free, for all customers, indefinitely |
| Standard queue | from $0.40 per million requests, tiered down to $0.24/M at very high volume |
| FIFO queue | from $0.50 per million requests, tiered down to $0.35/M at very high volume |
| Request counting | ⚠️ Each 64 KB chunk of payload is billed as one request. A 1 MiB payload = 16 requests. |
| Data transfer | Free within the same Region. Cross-Region and internet transfer at standard AWS rates. |
| Fair queues | standard-queue requests carrying a MessageGroupId are billed at both fair-queue and standard rates |
The cost lever that matters: a request is an API call, not a message. Batching 10 messages per call cuts request count ~10×. Long polling eliminates billed empty receives.
Sources: Amazon SQS Pricing, tiered pricing announcement
10. Facts commonly taught wrong
Use this list when writing chapters — each deserves an explicit correction.
| Common claim | Reality |
|---|---|
| "Max message size is 256 KB" | 1 MiB |
| "FIFO allows 20,000 in-flight messages" | 120,000 |
| "FIFO gives exactly-once processing" | SQS avoids introducing duplicates on send; your consumer can still run twice |
"ReceiveMessage returns 10 messages by default" | Default is 1 |
"MessageGroupId is FIFO-only" | Also used by fair queues on standard queues |
| "SQS pushes to Lambda" | The Lambda service polls SQS |
| "A Lambda batch failure only retries the failed message" | By default the whole batch returns; needs ReportBatchItemFailures |
| "Billing is per message" | Billing is per request, in 64 KB chunks |
| "Retries happen in order on a standard queue" | After 3 receives, SQS may move the message to the back of the queue |
| "FIFO throughput is 300 TPS, period" | 300 TPS per partition, per action; high-throughput mode goes far higher and is region-dependent |
Re-verification checklist
Re-run before any publish. Values most likely to drift:
- Pricing (§9) — tiers and per-million rates
- FIFO high-throughput regional TPS table (§4)
- Lambda ESM scaling numbers (§8) — AWS has changed these more than once
- Provisioned mode limits (§8)
- In-flight quotas (§3)
- Fair queues — feature status and billing (§6)