☰ All modules Tier 2 · SQS, SNS and Kinesis GuideCheat sheet ‹ cdkother-services ›
Contents
  1. How SQS, SNS and Kinesis appears on DVA-C02
  2. 1. SQS standard queues and the message lifecycle
  3. 2. SQS visibility timeout and long polling
  4. 3. SQS dead letter queues and redrive
  5. 4. SQS delay queues and large messages
  6. 5. SQS FIFO queues
  7. 6. SQS security and access policies
  8. 7. SNS topics and subscriptions
  9. 8. SNS fan out and message filtering
  10. 9. SNS FIFO topics and message archiving
  11. 10. Kinesis Data Streams shards and capacity modes
  12. 11. Kinesis producers consumers and the KCL
  13. 12. Kinesis throttling and enhanced fan out
  14. 13. Amazon Data Firehose
  15. 14. Choosing between SQS SNS Kinesis and Firehose
  16. Quick decision rules
  17. Changed vs older material

SQS, SNS and Kinesis — DVA-C02 Mastery Guide

  • Sources: course chapter 12 (SQS, SNS and Kinesis, notes/source/12.SQS_SNS_Kinesis.pdf), used as the syllabus only; all wording here is original. Lambda event source mappings, EventBridge, S3 event notifications, MSK and Step Functions belong to other modules and appear only as cross-references.
  • Written 2026-10-12; values checked against AWS docs on 2026-10-12. The marker ⚠️ Changed: <current>. Older material may say <old>. flags a value or behaviour that differs from the course or from older practice tests: learn the current value. ⚠️ unverified marks a detail that could not be confirmed in AWS documentation: don't build an answer on it. Every change is listed in Changed vs older material.
  • Tier 2 (deployment and messaging), bank target 40 questions. Domains: Development with AWS Services (primary), Troubleshooting and Optimization.
  • How to use it: /explain <topic> teaches from these sections (concept → exam facts → developer angle → traps → 3 check questions); /quiz sqs-sns-kinesis asks bank questions whose source_note links point at the ## N. headings below; /drill sqs-sns-kinesis fires short recall prompts from notes/sqs-sns-kinesis-cheat-sheet.md. Suggested loop: read a section, answer its two practice questions before opening the answers, then /quiz and /drill.

How SQS, SNS and Kinesis appears on DVA-C02

The exam treats these services as the glue between application components. A question describes a producer, one or more consumers and a requirement, then asks which service, setting or API call meets it:

Typical question shapes: a scenario with one deciding constraint; a symptom (metric, error code, duplicate or missing message) to diagnose; "Which TWO actions…" with five options; the exact attribute, parameter or API action that does the job.

Domain map: Development with AWS Services → §1, §4–§11, §13, §14 · Troubleshooting and Optimization → §2, §3, §12 and the metric and failure parts of §1, §8 and §13. Policy and encryption questions (§6, §7, §8) also touch the Security domain; in this module's bank they count under development.

Covered elsewhere (one-line cross-references only): Lambda event source mapping tuning (batch size, partial batch responses, ParallelizationFactor, bisecting): see notes/lambda-guide.md · EventBridge rules and Scheduler: see notes/monitoring-guide.md · S3 event notification setup: see notes/s3-guide.md · Auto Scaling on queue backlog: see notes/ec2-mastery-guide.md §10 · MSK vs Kinesis, Step Functions, SES: see notes/other-services-guide.md · KMS key types and key policy mechanics: see notes/security-encryption-guide.md.

# Topic Why it is on the exam
1 SQS standard queues and the message lifecycle Decoupling with a pull queue; send, receive, delete with receipt handles; at-least-once delivery and idempotent consumers
2 SQS visibility timeout and long polling Reappearing messages and duplicates, extending processing time, cutting empty receives and cost
3 SQS dead letter queues and redrive Isolating poison messages, retention surprises, moving messages back after a fix
4 SQS delay queues and large messages Postponing delivery, per-message timers, payloads above 1 MiB through S3
5 SQS FIFO queues Ordering per message group, deduplication, throughput modes
6 SQS security and access policies Default encryption, KMS key policies for service producers, cross-account queue policies
7 SNS topics and subscriptions Push delivery, protocols, retries and subscription DLQs, message size, encryption
8 SNS fan out and message filtering SNS plus SQS fan-out permissions, filter policies on attributes or body
9 SNS FIFO topics and message archiving Ordered fan-out to SQS, throughput scope, archive and replay
10 Kinesis Data Streams shards and capacity modes Shard math, partition keys, retention, record size, capacity modes
11 Kinesis producers consumers and the KCL PutRecords failures, KPL trade-offs, shard iterators, KCL leases and checkpoints
12 Kinesis throttling and enhanced fan out ProvisionedThroughputExceededException, hot shards, iterator age, dedicated read throughput
13 Amazon Data Firehose No-code delivery to S3, Redshift, OpenSearch and partners; buffering, Lambda transformation, format conversion
14 Choosing between SQS SNS Kinesis and Firehose The comparison the exam keeps coming back to

1. SQS standard queues and the message lifecycle

Concept

Exam facts

Developer angle

aws sqs create-queue --queue-name orders \
  --attributes MessageRetentionPeriod=1209600,VisibilityTimeout=60,ReceiveMessageWaitTimeSeconds=20
QURL=$(aws sqs get-queue-url --queue-name orders --query QueueUrl --output text)
aws sqs send-message --queue-url "$QURL" --message-body '{"orderId":"o-1001","total":42.5}' \
  --message-attributes '{"channel":{"DataType":"String","StringValue":"web"}}'
# backlog and in-flight counts (queue attribute names, not CloudWatch metric names)
aws sqs get-queue-attributes --queue-url "$QURL" \
  --attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible

A consumer loop that long-polls, processes and deletes in batches:

import boto3
sqs = boto3.client("sqs")
queue_url = sqs.get_queue_url(QueueName="orders")["QueueUrl"]

while True:
    resp = sqs.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=10, WaitTimeSeconds=20)
    done = []
    for msg in resp.get("Messages", []):
        handle_order(msg["Body"])  # your idempotent logic: a message can arrive twice
        done.append({"Id": msg["MessageId"], "ReceiptHandle": msg["ReceiptHandle"]})
    if done:
        result = sqs.delete_message_batch(QueueUrl=queue_url, Entries=done)
        for failure in result.get("Failed", []):
            print("delete failed:", failure["Id"], failure["Code"])

Traps

Practice questions

  1. A developer runs a payment-capture worker that long-polls an SQS standard queue and deletes each message right after processing it. Logs show that a few payments are captured twice each week. The team must keep the existing queue and producers unchanged. What should the developer do?

    • A. Increase the queue's MessageRetentionPeriod to 14 days.
    • B. Set MaxNumberOfMessages to 1 on every ReceiveMessage call and give each message its own worker thread.
    • C. Record each payment ID with a conditional write and skip IDs already recorded.
    • D. Call PurgeQueue after each batch of messages has been processed.
  2. A developer's consumer receives messages from an SQS standard queue and deletes them later from a cleanup thread, using the MessageId values it saved. Processed messages keep coming back, and request costs are high because each ReceiveMessage call returns a single message. Which TWO changes fix these problems? (Select TWO.)

    • A. Send every message with a MessageDeduplicationId.
    • B. Delete each message with the ReceiptHandle returned by its most recent receive.
    • C. Raise the queue's MaximumMessageSize to its maximum value.
    • D. Set MaxNumberOfMessages to 10 on each ReceiveMessage call.
    • E. Turn on server-side encryption with an SSE-KMS key.
Answers
  1. C. Standard queues deliver at least once, so the fix is an idempotent consumer: a conditional write (for example to DynamoDB) records each payment ID once. A doesn't touch duplicates; B shrinks batches but duplicates still arrive; D also deletes messages nobody has processed yet.
  2. B, D. Deletion needs the latest receipt handle, not the message ID, and asking for up to 10 messages per call cuts the number of requests. A applies only to FIFO queues; C and E change neither deletion nor request count.

2. SQS visibility timeout and long polling

Concept

Exam facts

Developer angle

# queue-wide defaults
aws sqs set-queue-attributes --queue-url "$QURL" \
  --attributes VisibilityTimeout=120,ReceiveMessageWaitTimeSeconds=20
# per call: long poll, batch of 10, a longer timeout for this batch only
aws sqs receive-message --queue-url "$QURL" --wait-time-seconds 20 \
  --max-number-of-messages 10 --visibility-timeout 300 \
  --message-system-attribute-names ApproximateReceiveCount
# give one message 10 more minutes, counted from now
aws sqs change-message-visibility --queue-url "$QURL" \
  --receipt-handle "$RECEIPT_HANDLE" --visibility-timeout 600

Heartbeat for long jobs:

import threading
import boto3

sqs = boto3.client("sqs")

def process_with_heartbeat(queue_url, msg, work, extend_to=120, every=60):
    """Keep the message hidden while work() runs, then delete it."""
    stop = threading.Event()
    def heartbeat():
        while not stop.wait(every):   # every 60 s: hidden for another 120 s, counted from now
            sqs.change_message_visibility(QueueUrl=queue_url, ReceiptHandle=msg["ReceiptHandle"],
                                          VisibilityTimeout=extend_to)
    threading.Thread(target=heartbeat, daemon=True).start()
    try:
        work(msg["Body"])
        sqs.delete_message(QueueUrl=queue_url, ReceiptHandle=msg["ReceiptHandle"])
    finally:
        stop.set()

Traps

Practice questions

  1. A video service sends transcoding jobs to an SQS standard queue. Jobs take between 2 and 40 minutes. With the queue's visibility timeout at 5 minutes, long jobs are often transcoded twice. If a worker crashes, its job must be retried within a few minutes. What should the developer do?

    • A. Set the queue's visibility timeout to 12 hours, the maximum that SQS allows for a message.
    • B. Set DelaySeconds to 900 on the queue.
    • C. Enable long polling on the queue with a 20-second wait time.
    • D. Extend the timeout with periodic ChangeMessageVisibility calls while a job runs.
  2. A developer sees that the CloudWatch NumberOfEmptyReceives metric of an SQS queue is very high and drives most of the queue's cost. The queue usually holds messages, yet many ReceiveMessage calls return nothing. Which TWO changes would each reduce the empty responses? (Select TWO.)

    • A. Set the queue attribute ReceiveMessageWaitTimeSeconds to 20.
    • B. Set the queue's VisibilityTimeout to 0.
    • C. Pass WaitTimeSeconds=20 on each ReceiveMessage call.
    • D. Set the queue's DelaySeconds to 20.
    • E. Re-create the queue as a FIFO queue.
Answers
  1. D. A heartbeat keeps long jobs hidden while the short base timeout still lets a crashed job reappear within minutes. A delays retries for hours after a crash; B hides new messages, not in-flight ones; C makes receiving more efficient but doesn't stop duplicate processing.
  2. A, C. Either one enables long polling, which queries all servers and waits for messages instead of answering empty. B makes every received message visible again at once; D postpones delivery; E changes ordering semantics, not polling.

3. SQS dead letter queues and redrive

Concept

Exam facts

Developer angle

attrs.json for the source queue (the policy value is a JSON string):

{"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:eu-west-1:111122223333:orders-dlq\",\"maxReceiveCount\":\"5\"}"}

The DLQ's RedriveAllowPolicy uses the same string format, for example {"redrivePermission":"byQueue","sourceQueueArns":["arn:aws:sqs:eu-west-1:111122223333:orders"]}.

aws sqs create-queue --queue-name orders-dlq --attributes MessageRetentionPeriod=1209600
aws sqs set-queue-attributes --queue-url "$QURL" --attributes file://attrs.json
# after the fix: move the messages back at a controlled rate
aws sqs start-message-move-task \
  --source-arn arn:aws:sqs:eu-west-1:111122223333:orders-dlq \
  --max-number-of-messages-per-second 50
aws sqs list-message-move-tasks --source-arn arn:aws:sqs:eu-west-1:111122223333:orders-dlq
# page someone as soon as anything lands in the DLQ
aws cloudwatch put-metric-alarm --alarm-name orders-dlq-not-empty \
  --namespace AWS/SQS --metric-name ApproximateNumberOfMessagesVisible \
  --dimensions Name=QueueName,Value=orders-dlq --statistic Maximum \
  --period 60 --evaluation-periods 1 --threshold 1 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:ops-alerts

Traps

Practice questions

  1. A developer configured a standard order queue and its standard DLQ with 4-day retention and a maxReceiveCount of 5. Messages that sat in the source queue for about 3 days before failing vanish from the DLQ the next day, before anyone can investigate them. What should the developer change?

    • A. Raise maxReceiveCount on the source queue to 50.
    • B. Set the DLQ's message retention period to 14 days.
    • C. Enable long polling on the DLQ.
    • D. Recreate the DLQ as a FIFO queue.
  2. A developer has deployed a bug fix, and 50,000 messages in a DLQ must go back to their source queue. The downstream database can absorb only about 100 extra writes per second, and the team wants no custom code. Which TWO actions should the developer take? (Select TWO.)

    • A. Call PurgeQueue on the DLQ before starting the redrive.
    • B. Set the DLQ's DelaySeconds attribute to 900.
    • C. Call StartMessageMoveTask on the DLQ with MaxNumberOfMessagesPerSecond set to 100.
    • D. Write a Lambda function that polls the DLQ and re-sends each message to the source queue.
    • E. Give the operator role sqs:StartMessageMoveTask, sqs:ReceiveMessage, sqs:DeleteMessage and sqs:GetQueueAttributes on the DLQ and sqs:SendMessage on the source queue.
Answers
  1. B. In a standard queue the original enqueue timestamp drives expiry, so the DLQ needs a longer retention than its source. A only delays the move; C and D don't change expiry (and a FIFO DLQ can't serve a standard source).
  2. C, E. A message move task with a rate limit protects the database, and it needs those permissions on both queues. A destroys the messages; B only delays messages arriving in the DLQ and moves nothing; D works but is exactly the custom code the team wants to avoid.

4. SQS delay queues and large messages

Concept

Exam facts

Developer angle

# every new message waits 2 minutes
aws sqs set-queue-attributes --queue-url "$QURL" --attributes DelaySeconds=120
# one message waits 15 minutes (standard queues only); overrides the queue delay
aws sqs send-message --queue-url "$QURL" \
  --message-body '{"type":"reminder","userId":"u-77"}' --delay-seconds 900

Java producer with the Extended Client Library (AWS SDK for Java 2.x):

S3Client s3 = S3Client.create();
ExtendedClientConfiguration config = new ExtendedClientConfiguration()
        .withPayloadSupportEnabled(s3, "orders-large-payloads");
SqsClient sqsExtended = new AmazonSQSExtendedClient(SqsClient.builder().build(), config);

sqsExtended.sendMessage(SendMessageRequest.builder()
        .queueUrl(queueUrl)
        .messageBody(largeJsonDocument)   // stored in S3; SQS receives a pointer
        .build());

Traps

Practice questions

  1. A sign-up service publishes several event types to one SQS standard queue. Only the welcome-reminder events must become available to consumers 10 minutes after they're sent; every other event must be processed immediately. What should the developer do?

    • A. Send the reminder events with the DelaySeconds parameter set to 600.
    • B. Set the queue's DelaySeconds attribute to 600.
    • C. Set the queue's VisibilityTimeout to 600.
    • D. Move the reminders to a FIFO queue and set DelaySeconds on each reminder message.
  2. A developer must pass 5 MB JSON documents between two Java components through SQS with the least custom code. Which TWO actions should the developer take? (Select TWO.)

    • A. Set the queue's MaximumMessageSize attribute to 5,242,880 bytes.
    • B. Use the Amazon SQS Extended Client Library for Java with an S3 payload bucket in both the producer and the consumer.
    • C. Split each document into 1 MiB parts and send the parts with SendMessageBatch.
    • D. Enable content-based deduplication on the queue.
    • E. Grant the producer s3:PutObject and the consumer s3:GetObject and s3:DeleteObject on the payload bucket.
Answers
  1. A. A message timer delays only the messages that carry it. B delays every event; C hides messages after they're received, not after they're sent; D fails because FIFO queues don't support per-message delays.
  2. B, E. The library keeps the document in S3 and sends a pointer, and both sides need S3 permissions. A exceeds the 1 MiB maximum; C needs reassembly code and still hits the 1 MiB limit per batch; D applies only to FIFO queues and doesn't help with size.

5. SQS FIFO queues

Concept

Exam facts

Developer angle

aws sqs create-queue --queue-name payments.fifo \
  --attributes FifoQueue=true,DeduplicationScope=messageGroup,FifoThroughputLimit=perMessageGroupId
aws sqs send-message --queue-url "$FIFO_URL" \
  --message-body '{"account":"acct-42","op":"debit","amount":25}' \
  --message-group-id acct-42 --message-deduplication-id pay-000981

Traps

Practice questions

  1. A ledger service must apply debit and credit events in the order they were produced for each customer account. There are thousands of active accounts, and events for different accounts may be processed in parallel. Which design meets these requirements?

    • A. An SQS FIFO queue with the same MessageGroupId value on every message.
    • B. An SQS standard queue whose consumers sort each batch by SentTimestamp.
    • C. An SQS standard queue with fair queues, using the account ID as MessageGroupId.
    • D. An SQS FIFO queue with MessageGroupId set to the account ID.
  2. A developer is moving an order-intake producer from a standard queue to a new FIFO queue. The producer retries SendMessage after network timeouts, and each retry rebuilds the message body with a fresh requestedAt timestamp. Duplicate orders must not reach consumers. Which TWO actions should the developer take? (Select TWO.)

    • A. Create the queue as orders.fifo with the FifoQueue attribute set to true.
    • B. Enable ContentBasedDeduplication and stop sending a deduplication ID.
    • C. Set the DelaySeconds parameter on each retried message.
    • D. Send every attempt with the same MessageDeduplicationId, derived from the order ID.
    • E. Add the .fifo suffix to the existing standard queue's name.
Answers
  1. D. Per-account groups keep each account ordered while different groups are consumed in parallel. A orders everything but serialises all processing; B can't restore order across batches and consumers; C's group ID only identifies tenants and gives no ordering.
  2. A, D. A FIFO queue is required and must be created as one; a stable deduplication ID makes retries within 5 minutes collapse into one message. B fails because the body changes on every retry; C isn't supported per message on FIFO queues; E is impossible because a queue's type can't change.

6. SQS security and access policies

Concept

Exam facts

Developer angle

Queue policy for S3 event notifications, protected against the confused deputy:

{"Version": "2012-10-17",
 "Statement": [{"Sid": "AllowUploadsBucket", "Effect": "Allow",
   "Principal": {"Service": "s3.amazonaws.com"},
   "Action": "sqs:SendMessage",
   "Resource": "arn:aws:sqs:eu-west-1:111122223333:uploads-queue",
   "Condition": {"ArnLike": {"aws:SourceArn": "arn:aws:s3:::uploads-bucket"},
                 "StringEquals": {"aws:SourceAccount": "111122223333"}}}]}

Key policy statement on the customer managed key of an encrypted queue fed by SNS (S3 and EventBridge use s3.amazonaws.com and events.amazonaws.com):

{"Sid": "AllowSnsToUseTheKey", "Effect": "Allow", "Principal": {"Service": "sns.amazonaws.com"},
 "Action": ["kms:GenerateDataKey", "kms:Decrypt"], "Resource": "*"}
# switch to the customer managed key; a longer reuse period means fewer KMS calls
aws sqs set-queue-attributes --queue-url "$QURL" \
  --attributes KmsMasterKeyId=alias/orders-cmk,KmsDataKeyReusePeriodSeconds=3600

Traps

Practice questions

  1. A developer switched an SQS queue to SSE-KMS with the aws/sqs key, and the S3 event notifications it receives stopped arriving. The queue policy already allows s3.amazonaws.com to call sqs:SendMessage for the bucket, and the data must stay encrypted with KMS. What should the developer do?

    • A. Add the bucket's ARN as an aws:SourceArn condition and the bucket owner's account as an aws:SourceAccount condition to the queue policy.
    • B. Turn off server-side encryption on the queue.
    • C. Encrypt the queue with a customer managed key whose key policy lets s3.amazonaws.com use it.
    • D. Attach an IAM policy that grants kms:* on the aws/sqs key to the bucket owner's role.
  2. An application in account 444455556666 must receive and delete messages from a queue in account 111122223333. Which TWO actions are required? (Select TWO.)

    • A. Grant the consumer role sqs:SetQueueAttributes in the queue policy.
    • B. Add a queue policy statement in account 111122223333 that allows the consumer role from account 444455556666 to call sqs:ReceiveMessage and sqs:DeleteMessage.
    • C. Attach an IAM policy to the consumer role in account 444455556666 that allows sqs:ReceiveMessage and sqs:DeleteMessage on the queue's ARN.
    • D. Create an IAM user in account 111122223333 and store its access keys in the application.
    • E. Set the queue policy's principal to "*" with no conditions.
Answers
  1. C. S3 has to use the queue's key through its service principal, and only a customer managed key's policy can grant that. A is good practice but doesn't fix KMS access; B breaks the encryption requirement; D can't work because the AWS managed key's policy can't be changed and S3 doesn't act through that role.
  2. B, C. Cross-account access needs the resource policy in the owner account and an identity policy in the caller's account. A can't be shared cross-account and isn't needed; D relies on long-term keys (least secure); E opens the queue to everyone.

7. SNS topics and subscriptions

Concept

Exam facts

Developer angle

TOPIC_ARN=$(aws sns create-topic --name order-events --query TopicArn --output text)
aws sns subscribe --topic-arn "$TOPIC_ARN" --protocol https \
  --notification-endpoint https://hooks.example.com/orders --return-subscription-arn
aws sns publish --topic-arn "$TOPIC_ARN" --subject "Order placed" \
  --message '{"orderId":"o-1001","total":42.5}' \
  --message-attributes '{"eventType":{"DataType":"String","StringValue":"order_placed"}}'
# keep what the retry policy can't deliver
aws sns set-subscription-attributes --subscription-arn "$SUB_ARN" \
  --attribute-name RedrivePolicy \
  --attribute-value '{"deadLetterTargetArn":"arn:aws:sqs:eu-west-1:111122223333:order-events-dlq"}'
# accept payloads up to 1 MiB (only SQS, Lambda and Firehose subscriptions, at most 100)
aws sns set-topic-attributes --topic-arn "$TOPIC_ARN" \
  --attribute-name MaximumMessageSize --attribute-value 1048576

Traps

Practice questions

  1. A company's SNS topic delivers order events to a partner's HTTPS webhook. The partner's endpoint is sometimes unavailable for up to 2 hours during maintenance, and no event may be lost. What should the developer do with the LEAST operational overhead?

    • A. Give the subscription an SQS dead-letter queue and redeliver its messages afterwards.
    • B. Set the subscription's delivery policy to 100 retries with a maximum delay of 3,600 seconds.
    • C. Enable raw message delivery on the HTTPS subscription.
    • D. Publish every event twice, five minutes apart.
  2. A developer encrypted an SNS topic with the alias/aws/sns key, and CloudWatch alarm notifications stopped reaching the topic. Security requires the topic to stay encrypted. Which TWO actions fix the problem? (Select TWO.)

    • A. Enable raw message delivery on all subscriptions.
    • B. Configure the alarm action with an IAM user's access keys.
    • C. Turn off server-side encryption on the topic.
    • D. Create a customer managed KMS key and set it as the topic's KmsMasterKeyId.
    • E. Add a key policy statement that allows cloudwatch.amazonaws.com to use kms:GenerateDataKey* and kms:Decrypt.
Answers
  1. A. HTTP/S retries stop after 3,600 s in total, so a subscription DLQ keeps what the retries can't deliver. B runs into the 3,600-second ceiling; C only changes the payload format; D doubles the traffic and both copies can still be lost.
  2. D, E. CloudWatch must use the topic's key through its service principal, which only a customer managed key's policy can allow. A has nothing to do with encryption; B isn't how alarm actions authenticate; C breaks the security requirement.

8. SNS fan out and message filtering

Concept

Exam facts

Developer angle

QUEUE_ARN=$(aws sqs get-queue-attributes --queue-url "$REFUNDS_URL" \
  --attribute-names QueueArn --query Attributes.QueueArn --output text)
SUB_ARN=$(aws sns subscribe --topic-arn "$TOPIC_ARN" --protocol sqs \
  --notification-endpoint "$QUEUE_ARN" --attributes RawMessageDelivery=true \
  --return-subscription-arn --query SubscriptionArn --output text)
aws sns set-subscription-attributes --subscription-arn "$SUB_ARN" \
  --attribute-name FilterPolicyScope --attribute-value MessageBody
aws sns set-subscription-attributes --subscription-arn "$SUB_ARN" \
  --attribute-name FilterPolicy --attribute-value file://refunds-filter.json

refunds-filter.json (body scope; nested keys; AND across keys):

{
  "order": {"status": ["REFUNDED"], "total": [{"numeric": [">=", 100]}]},
  "channel": [{"anything-but": ["test"]}]
}

An attribute-scope policy mixes OR inside a key with $or across keys, for example {"eventType": ["order_placed", {"prefix": "order_ship"}], "$or": [{"priority": ["high"]}, {"amount": [{"numeric": [">", 1000]}]}]}.

Traps

Practice questions

  1. An order service publishes JSON payloads such as {"status":"REFUNDED","orderId":"o-17"} to an SNS topic without message attributes. A refunds queue subscribed to the topic must receive only refunded orders, and the publisher's code must not change. What should the developer do?

    • A. Set an attribute-based filter policy {"status": ["REFUNDED"]} on the subscription.
    • B. Create a separate topic for refunded orders and have the publisher send refunds to it.
    • C. Set FilterPolicyScope to MessageBody on the subscription with the policy {"status": ["REFUNDED"]}.
    • D. Subscribe a Lambda function to the topic that drops non-refund messages and forwards refunds to the queue.
  2. A developer subscribes a new SQS queue to an SNS topic in the same account. The subscription shows as confirmed, but no messages arrive. The queue uses SSE-KMS with the aws/sqs key and has no queue policy. Which TWO changes are required? (Select TWO.)

    • A. Add a queue policy that allows sns.amazonaws.com to call sqs:SendMessage with aws:SourceArn set to the topic ARN.
    • B. Enable raw message delivery on the subscription.
    • C. Increase the queue's visibility timeout.
    • D. Grant sns:Publish on the topic to the queue's consumers.
    • E. Re-encrypt the queue with a customer managed key whose key policy allows sns.amazonaws.com to use kms:GenerateDataKey and kms:Decrypt.
Answers
  1. C. The payload carries no attributes, so only a body-scoped policy can match it without publisher changes. A reads attributes that don't exist, so nothing matches; B changes the publisher; D adds code and cost where a filter setting is enough.
  2. A, E. SNS needs permission to send to the queue and to use its KMS key, which the AWS managed key can't grant. B only changes the payload format; C affects consumers, not delivery; D concerns publishing, not delivery to the queue.

9. SNS FIFO topics and message archiving

Concept

Exam facts

Developer angle

FIFO_TOPIC=$(aws sns create-topic --name price-updates.fifo \
  --attributes FifoTopic=true,ContentBasedDeduplication=true,FifoThroughputScope=MessageGroup \
  --query TopicArn --output text)
aws sns publish --topic-arn "$FIFO_TOPIC" \
  --message '{"sku":"P-214","price":19.99}' --message-group-id P-214
# keep 30 days of messages for replay
aws sns set-topic-attributes --topic-arn "$FIFO_TOPIC" \
  --attribute-name ArchivePolicy --attribute-value '{"MessageRetentionPeriod":"30"}'
# redeliver a two-hour window to one subscription
aws sns set-subscription-attributes --subscription-arn "$SUB_ARN" \
  --attribute-name ReplayPolicy \
  --attribute-value '{"PointType":"Timestamp","StartingPoint":"2026-10-10T08:00:00.000Z","EndingPoint":"2026-10-10T10:00:00.000Z"}'

Traps

Practice questions

  1. A pricing service publishes price changes that a wholesale service and a retail service must apply in order for each product. An analytics service also needs every change, doesn't care about order and should cost as little as possible. Which design meets these requirements?

    • A. An SNS FIFO topic with SQS FIFO queues for wholesale and retail and a Lambda function subscribed directly for analytics.
    • B. An SNS FIFO topic with SQS FIFO queues for wholesale and retail and an SQS standard queue for analytics.
    • C. An SNS standard topic with three SQS standard queues whose consumers sort by SentTimestamp.
    • D. A producer that writes each change separately to three SQS FIFO queues.
  2. A developer finds that a consumer bug corrupted two hours of price updates read from an SQS FIFO queue subscribed to an SNS FIFO topic. The topic has had an archive policy with 30 days of retention for months. The updates must be processed again without asking the publisher to resend them. Which TWO actions should the developer take? (Select TWO.)

    • A. Call StartMessageMoveTask with the topic ARN as the source.
    • B. Purge the subscribed queue and wait for SNS to redeliver automatically.
    • C. Deploy the fixed consumer before the replay starts.
    • D. Set a ReplayPolicy on the queue's subscription with StartingPoint and EndingPoint around the two-hour window.
    • E. Change the topic's FifoThroughputScope to Topic.
Answers
  1. B. FIFO queues give ordered, deduplicated delivery, and a standard queue is the cheaper subscriber for the order-insensitive consumer. A fails because FIFO topics can't deliver to Lambda directly; C loses ordering; D ties the producer to every consumer.
  2. C, D. Fix the consumer, then replay the window from the archive to that subscription (and resume it afterwards, because an EndingPoint pauses the subscription). A works only for SQS dead-letter queues; B deletes data and SNS doesn't redeliver by itself; E has nothing to do with replay.

10. Kinesis Data Streams shards and capacity modes

Concept

Exam facts

Developer angle

aws kinesis create-stream --stream-name clicks --shard-count 4            # provisioned
aws kinesis create-stream --stream-name telemetry \
  --stream-mode-details StreamMode=ON_DEMAND                                # on-demand
aws kinesis update-shard-count --stream-name clicks \
  --target-shard-count 8 --scaling-type UNIFORM_SCALING
aws kinesis increase-stream-retention-period --stream-name clicks --retention-period-hours 168
aws kinesis start-stream-encryption --stream-name clicks \
  --encryption-type KMS --key-id alias/aws/kinesis
STREAM_ARN=$(aws kinesis describe-stream-summary --stream-name telemetry \
  --query StreamDescriptionSummary.StreamARN --output text)
aws kinesis update-max-record-size --stream-arn "$STREAM_ARN" --max-record-size-in-ki-b 4096

Sizing example: 1,500 records/s of 2 KB each, read by three shared-throughput consumer applications.

Input Calculation Shards
Write bandwidth 1,500 × 2 KB = 3,000 KB/s ÷ 1,024 3
Write records 1,500 records/s ÷ 1,000 2
Read bandwidth 3,000 KB/s × 3 consumers = 9,000 KB/s ÷ 2,048 5
Result largest value 5 (or 3 shards with enhanced fan-out consumers, §12)

Traps

Practice questions

  1. A developer is sizing a provisioned Kinesis data stream that receives 4,000 records per second of 1 KB each. Two consumer applications read every record with shared-throughput GetRecords calls. What is the minimum number of shards that avoids throttling?

    • A. 2
    • B. 4
    • C. 6
    • D. 8
  2. A team ingests IoT telemetry into a provisioned stream. Traffic is unpredictable, the team spends hours splitting and merging shards, and next month's product launch is expected to push the peak to three times today's level within minutes. Which TWO actions meet these requirements with the LEAST operational overhead? (Select TWO.)

    • A. Switch the stream to on-demand capacity with UpdateStreamMode.
    • B. Call UpdateShardCount on the stream every few minutes during the launch.
    • C. Enable On-demand Advantage for the account and set the stream's warm throughput above the expected launch peak.
    • D. Raise the stream's retention period to 7 days.
    • E. Send each record with SequenceNumberForOrdering.
Answers
  1. B. Writes need 4,000 KB/s ÷ 1,024 → 4 shards and 4,000 records/s ÷ 1,000 → 4; reads need 8,000 KB/s ÷ 2,048 → 4. A is below the write limits; C and D over-provision.
  2. A, C. On-demand removes shard management, and warm throughput (On-demand Advantage) has capacity ready for a jump beyond double the previous peak. B is the manual work the team wants to stop; D and E add no write capacity.

11. Kinesis producers consumers and the KCL

Concept

Exam facts

Developer angle

# write one record (AWS CLI v2 expects base64 blobs unless told otherwise)
aws kinesis put-record --stream-name clicks --partition-key user-42 \
  --cli-binary-format raw-in-base64-out --data '{"page":"/cart"}'
# read one shard from a point in time
IT=$(aws kinesis get-shard-iterator --stream-name clicks \
  --shard-id shardId-000000000000 --shard-iterator-type AT_TIMESTAMP \
  --timestamp 2026-10-12T08:00:00Z --query ShardIterator --output text)
aws kinesis get-records --shard-iterator "$IT" --limit 500

Retrying only the failed entries of PutRecords:

import time
import boto3

kinesis = boto3.client("kinesis")

def put_all(stream_arn, records, attempts=6):
    """records: [{"Data": b"...", "PartitionKey": "user-42"}, ...], at most 500 per call."""
    pending = records
    for attempt in range(attempts):
        resp = kinesis.put_records(StreamARN=stream_arn, Records=pending)
        if resp["FailedRecordCount"] == 0:
            return
        pending = [rec for rec, res in zip(pending, resp["Records"]) if "ErrorCode" in res]
        time.sleep(min(0.1 * 2 ** attempt, 5))   # exponential backoff
    raise RuntimeError(f"{len(pending)} records still failing")

Traps

Practice questions

  1. A company runs a KCL consumer application on 10 EC2 instances to process a stream with 6 shards. CloudWatch shows that 4 of the instances process nothing, and the team wants to cut cost without lowering throughput. What should the developer do?

    • A. Raise the write capacity of the application's DynamoDB lease table.
    • B. Register each instance as a separate enhanced fan-out consumer.
    • C. Change the application's initial position to LATEST.
    • D. Reduce the consumer fleet to 6 instances.
  2. A developer's producer sends batches with PutRecords. The responses return HTTP 200, but FailedRecordCount is often above zero with ProvisionedThroughputExceededException entries, and downstream counts show missing events. Shard-level metrics show one shard throttled while the others are mostly idle. Which TWO actions should the developer take? (Select TWO.)

    • A. Treat every HTTP 200 response from PutRecords as a full success.
    • B. Resend only the entries that returned an ErrorCode, with exponential backoff.
    • C. Switch to PutRecord calls with SequenceNumberForOrdering.
    • D. Increase the stream's retention period.
    • E. Switch to a partition key with many more distinct values.
Answers
  1. D. One lease per shard means at most 6 busy workers for 6 shards, so 6 instances keep the throughput and remove the idle cost. A doesn't create more work to do; B adds read capacity, not processing parallelism, at extra cost; C skips data.
  2. B, E. Retrying the failed entries stops the losses, and a higher-cardinality key spreads records over all shards, which removes the hot shard. A is the bug causing the losses; C adds ordering, not capacity; D doesn't affect writes.

12. Kinesis throttling and enhanced fan out

Concept

Exam facts

Developer angle

# find the hot shard (shard-level metrics cost extra)
aws kinesis enable-enhanced-monitoring --stream-name clicks \
  --shard-level-metrics IncomingBytes IncomingRecords WriteProvisionedThroughputExceeded IteratorAgeMilliseconds
# split it at a hash key inside its range (read the range from list-shards)
aws kinesis list-shards --stream-name clicks
aws kinesis split-shard --stream-name clicks --shard-to-split shardId-000000000003 \
  --new-starting-hash-key 255211775190703847597530955573826158592
# dedicated 2 MB/s per shard for a new consumer application
CONSUMER_ARN=$(aws kinesis register-stream-consumer --stream-arn "$STREAM_ARN" \
  --consumer-name fraud-scorer --query Consumer.ConsumerARN --output text)
# alarm when consumers fall more than 10 minutes behind
aws cloudwatch put-metric-alarm --alarm-name clicks-consumer-lag \
  --namespace AWS/Kinesis --metric-name GetRecords.IteratorAgeMilliseconds \
  --dimensions Name=StreamName,Value=clicks --statistic Maximum --period 60 \
  --evaluation-periods 5 --threshold 600000 --comparison-operator GreaterThanThreshold

Traps

Practice questions

  1. A company has five independent applications that read the same Kinesis data stream with shared-throughput GetRecords calls. ReadProvisionedThroughputExceeded is frequent and end-to-end latency is about one second. Each application needs lower latency with the LEAST operational overhead. What should the developer do?

    • A. Double the number of shards in the stream.
    • B. Put an SNS topic in front of the stream and subscribe one SQS queue per application.
    • C. Register each application as an enhanced fan-out consumer and read with KCL 2.x or later.
    • D. Make each application call GetRecords twice as often.
  2. A Lambda function consumes a 4-shard stream. GetRecords.IteratorAgeMilliseconds has been rising for hours while WriteProvisionedThroughputExceeded stays at zero, and each invocation runs close to its timeout. Which TWO actions should the developer take? (Select TWO.)

    • A. Decrease the stream's retention period.
    • B. Add more retries to the producers.
    • C. Raise the event source mapping's ParallelizationFactor.
    • D. Increase the number of shards in the stream.
    • E. Switch the producers to random partition keys.
Answers
  1. C. EFO gives each application its own 2 MB/s per shard with push delivery (about 70 ms), and the KCL manages the subscriptions. A raises read capacity at a higher cost but keeps the shared-polling latency; B needs custom code to forward records from the stream and adds hops and latency; D makes the throttling worse.
  2. C, D. The consumer is the bottleneck, and more concurrent batches per shard or more shards both add processing parallelism. A makes records expire sooner; B and E fix a write problem that the metrics rule out.

13. Amazon Data Firehose

Concept

Exam facts

Developer angle

aws firehose create-delivery-stream --delivery-stream-name clicks-to-s3 \
  --delivery-stream-type DirectPut \
  --extended-s3-destination-configuration file://s3-destination.json
# Data is a base64 blob in AWS CLI v2: {"page":"/cart"} followed by a newline
aws firehose put-record --delivery-stream-name clicks-to-s3 \
  --record '{"Data":"eyJwYWdlIjoiL2NhcnQifQo="}'

s3-destination.json:

{"RoleARN": "arn:aws:iam::111122223333:role/FirehoseDeliveryRole", "BucketARN": "arn:aws:s3:::clickstream-raw",
 "Prefix": "clicks/", "ErrorOutputPrefix": "errors/", "CompressionFormat": "GZIP",
 "BufferingHints": {"SizeInMBs": 64, "IntervalInSeconds": 60}}

A transformation function that drops synthetic traffic and enriches the rest:

import base64
import json

def handler(event, context):
    out = []
    for record in event["records"]:
        payload = json.loads(base64.b64decode(record["data"]))
        if payload.get("synthetic"):
            out.append({"recordId": record["recordId"], "result": "Dropped",
                        "data": record["data"]})
            continue
        payload["source"] = "web"
        data = base64.b64encode((json.dumps(payload) + "\n").encode()).decode()
        out.append({"recordId": record["recordId"], "result": "Ok", "data": data})
    return {"records": out}

Traps

Practice questions

  1. A web application emits JSON clickstream events. Analysts query them in Amazon Athena and want columnar files in S3 with the LEAST operational overhead. What should the developer do?

    • A. Write the events to a Kinesis data stream and run a KCL application on EC2 that writes Parquet files to S3.
    • B. Send the events to a Firehose stream with record format conversion to Apache Parquet.
    • C. Write JSON files to S3 and convert each file to Parquet with a Lambda function triggered by S3 event notifications.
    • D. Send the events to a Firehose stream and have a Managed Service for Apache Flink application read from it and write Parquet.
  2. A developer's Firehose stream with a Lambda transformation delivers almost nothing to S3; most records appear under the processing-failed prefix. The function decodes each record, adds fields and returns a plain list of the modified JSON objects, and CloudWatch Logs show that some invocations with large batches time out after 5 minutes. Which TWO changes are needed? (Select TWO.)

    • A. Return an object for every input record with its original recordId, a result of Ok, Dropped or ProcessingFailed, and base64-encoded data.
    • B. Set the destination buffering interval to 0 seconds.
    • C. Enable dynamic partitioning on the S3 destination.
    • D. Keep each invocation under 5 minutes, for example by lowering the Lambda buffering size hint.
    • E. Return the transformed JSON as plain text in the data field.
Answers
  1. B. Firehose converts JSON to Parquet on the way to S3, using a table schema from the AWS Glue Data Catalog, with no code to run. A and C work but add code and infrastructure to maintain; D is impossible because Flink can't read from Firehose.
  2. A, D. Firehose matches results to inputs by recordId and expects a status and base64 data for each, and it treats invocations longer than 5 minutes as failures. B only changes delivery latency; C doesn't affect the transformation (and can be enabled only when a stream is created); E breaks the required base64 encoding.

14. Choosing between SQS SNS Kinesis and Firehose

Concept

Exam facts

SQS standard SQS FIFO SNS standard SNS FIFO Kinesis Data Streams Data Firehose
Model Pull queue Pull queue Push pub/sub Push pub/sub to SQS queues Pull stream (EFO push) Managed delivery
Who gets a message One consumer (whoever deletes it) One consumer; a group's later messages wait for its in-flight ones Every matching subscription Every matching SQS subscription Every consumer application Its destination
Ordering Best effort Per message group Best effort Per message group Per shard (partition key) Not a feature
Duplicates Possible None within 5 min Possible None within 5 min Possible (at-least-once consumers) Not a feature
Keeps data Until deleted, ≤ 14 days Until deleted, ≤ 14 days No (retries only) Optional archive ≤ 365 days 24 h – 365 days, replayable No (≤ 24 h buffer if the destination is down)
Max message or record 1 MiB (S3 pointer up to 2 GB) 1 MiB 256 KiB default, 1 MiB opt-in 256 KiB default, 1 MiB opt-in 1 MiB default, 10 MiB opt-in 1,000 KiB
Capacity Nearly unlimited 300 TPS per action; high throughput mode much more Soft Regional publish quota 300 msg/s per group; 3,000 msg/s or more per topic Shards or on-demand Automatic (Direct PUT quota)

Developer angle

One publish, two durable consumers: a worker queue and an S3 archive through Firehose (the queue policy and the Firehose role must allow SNS):

aws sns subscribe --topic-arn "$TOPIC_ARN" --protocol sqs --notification-endpoint "$QUEUE_ARN"
aws sns subscribe --topic-arn "$TOPIC_ARN" --protocol firehose \
  --notification-endpoint arn:aws:firehose:eu-west-1:111122223333:deliverystream/order-archive \
  --attributes SubscriptionRoleArn=arn:aws:iam::111122223333:role/SnsToFirehoseRole
Requirement in the stem Service Setting or API that seals it
"Each message processed by one worker, retried on failure" SQS standard VisibilityTimeout, RedrivePolicy
"Strict order per order ID, no duplicates" SQS FIFO MessageGroupId, MessageDeduplicationId
"Add consumers later without changing the producer" SNS + SQS Subscribe, queue policy for sns.amazonaws.com
"Only cancelled orders go to this service" SNS FilterPolicy (+ FilterPolicyScope)
"Replay the last 3 days" KDS IncreaseStreamRetentionPeriod, AT_TIMESTAMP iterator
"Five apps read the stream with low latency" KDS RegisterStreamConsumer (EFO)
"Land data in S3 as Parquet with no code" Firehose DataFormatConversionConfiguration

Traps

Practice questions

  1. A company's analytics teams each need to read the last three days of click events at different times, and new teams may join and start from the beginning of that window. Events arrive at thousands per second and must be readable within a second. Which solution meets these requirements?

    • A. Amazon Kinesis Data Streams with a retention period of at least 72 hours.
    • B. An SQS standard queue with a 14-day retention period shared by all teams.
    • C. An SNS topic with one SQS queue per team.
    • D. An Amazon Data Firehose stream that delivers the events to S3 every 60 seconds.
  2. An order service publishes an event for every order. An inventory service must process every event with retries and must not lose any, an archive of all events must land in S3 without custom code, and a fraud service will be added next quarter without changes to the order service. Which TWO components should the developer use? (Select TWO.)

    • A. A Kinesis data stream read by a KCL application that writes the archive files to S3.
    • B. An SNS topic for the order events with an SQS queue subscribed for the inventory service.
    • C. A Firehose stream that subscribes to the order events topic and delivers to S3.
    • D. An SQS FIFO queue shared by the inventory and fraud services.
    • E. A scheduled job that copies order rows from the database to S3 every hour.
Answers
  1. A. A stream keeps records for its retention period and every consumer reads independently from any position, so a new team can start at the oldest record. B hands each message to one consumer and deletes it; C delivers only messages published after a queue subscribes; D writes files to S3 but offers no stream to read or replay.
  2. B, C. SNS decouples the publisher, an SQS subscription gives inventory durable retries, a Firehose subscription archives to S3 without code, and the fraud service later adds its own subscription. A needs custom consumer code; D makes the two services compete for the same messages; E is custom code and isn't event-driven.

Quick decision rules

SQS (§1–§6)

SNS (§7–§9)

Kinesis and Firehose (§10–§13)

Changed vs older material

Learn the Current column; the course or older practice material may still show the left-hand value. Rows already in notes/current-facts.md are marked there; the others await confirmation in this module's /ingest review.

Topic Course / older material Current (verified 2026-10-12) Source
§1 · SQS maximum message size 256 KB (the course already says 1,024 KB) 1 MiB (1,048,576 bytes) since 2025-08-04; MaximumMessageSize 1 KiB–1 MiB, default 1 MiB; 64 KB billing chunks AWS docs
§1 · MessageGroupId on standard queues FIFO-only parameter Standard queues use it as a tenant ID for fair queues (since 2025-07-21); no ordering AWS docs
§1 · Backlog metric for scaling CloudWatch metric ApproximateNumberOfMessages CloudWatch metric ApproximateNumberOfMessagesVisible; ApproximateNumberOfMessages is a GetQueueAttributes attribute AWS docs
§1 · FIFO in-flight limit 20,000 messages 120,000 messages (since 2024-11-21) What's New
§3 · DLQ redrive Console only, standard queues only StartMessageMoveTask API (2023-06-07), FIFO supported, source or same-type custom destination, up to 500 msg/s AWS docs
§4 · Extended Client Library Java library only Java and Python libraries; S3 payloads up to 2 GB; synchronous clients AWS docs
§5 · FIFO queue throughput 300 msg/s, 3,000 msg/s with batching Normal mode as before; high throughput mode up to 70,000 TPS per action (700,000 msg/s batched) in us-east-1, us-west-2, eu-west-1 AWS docs
§6 · Default encryption Unencrypted unless SSE-KMS is enabled SSE-SQS by default for new queues (since 2022) What's New
§7 · SNS maximum message size 256 KB, fixed 256 KiB default; MaximumMessageSize up to 1 MiB since 2026-09-18 (≤ 100 SQS, Lambda or Firehose subscriptions) AWS docs
§7 · Android push Google GCM Firebase Cloud Messaging with HTTP v1 credentials (since 2024-01-18) AWS docs
§7 · SNS message data protection Available to every account Closed to new customers since 2026-04-30 AWS docs
§8 · Filter policies Message attributes only; exact, prefix, anything-but, numeric, exists FilterPolicyScope MessageAttributes or MessageBody (2022-11-22); suffix, equals-ignore-case, $or (2023-11-16) AWS docs
§9 · SNS FIFO throughput Same as SQS FIFO 300 msg/s per group; 3,000 msg/s or 20 MB/s per topic (Topic scope); MessageGroup scope (2025-01-21) up to the Regional quota AWS docs
§9 · SNS FIFO subscribers SQS FIFO queues only (the course already includes standard queues) SQS FIFO and standard queues (since 2023-09-14) AWS docs
§9 · SNS persistence Messages are never stored FIFO topics archive 1–365 days and replay (2023-10-26); standard topics still don't store AWS docs
§10 · KDS record size 1 MB (the course says 10 MiB without the default) 1 MiB default, up to 10 MiB opt-in per stream (2025-10-28) AWS docs
§10 · PutRecords request size 5 MB 10 MiB, 500 records (2025-10-28) AWS docs
§10 · Capacity modes Provisioned and on-demand; on-demand starts at 4 MB/s or 4,000 records/s On-demand Standard (4 MB/s write, 8 MB/s read to start), On-demand Advantage, provisioned AWS docs
§10 · Partition keys Always decide the shard AUTO distribution on on-demand streams ignores them AWS docs
§11 · KCL and KPL versions KCL 1.x, one lease table KCL 3.x (2024-11-06) and KPL 1.x (2024-12-15) current; KCL 1.x and KPL 0.x in maintenance since 2025-04-17, end-of-support date 2026-01-30 AWS docs
§12 · EFO consumers per stream 20 20, or 50 with On-demand Advantage AWS docs
§13 · Firehose name Amazon Kinesis Data Firehose, delivery stream Amazon Data Firehose, Firehose stream (2024-02-09); APIs unchanged What's New
§13 · Firehose sources and destinations Producers write directly; S3, Redshift, OpenSearch, Splunk, a few partners, HTTP endpoint Sources: Direct PUT, Kinesis Data Streams or Amazon MSK; destinations also include OpenSearch Serverless, Apache Iceberg Tables, Snowflake and more partners AWS docs
§13 · Firehose buffering At least 60 seconds IntervalInSeconds 0–900 (zero buffering since 2023-12-26) AWS docs
§13 · Flink service name Kinesis Data Analytics for Apache Flink Amazon Managed Service for Apache Flink (2023-08-30); namespace kinesisanalyticsv2 AWS blog
§13 · Kinesis Data Analytics for SQL Active service Discontinued; applications deleted from 2026-01-27 AWS docs
§13 · Landing stream data in S3 Needs Firehose or custom consumers On-demand streams can deliver to S3 or Iceberg streaming tables with CreateChannel AWS docs