← Week 2: DynamoDB Internals

Day 11: DynamoDB Streams

Phase 5 · Aug 22, 2026

← Week 2: DynamoDB Internals

Agenda (2–3 hours)

  • Read (45 min): DynamoDB Streams documentation; DynamoDB → Lambda trigger documentation; Kinesis Data Streams for DynamoDB documentation
  • Study (45 min): What are the four stream view types? When would you use each?
  • Practice (45 min): Enable DynamoDB Streams on a table; create a Lambda trigger that projects changes into a secondary "read model" table
  • Challenge (30 min): How does DynamoDB Streams differ from Kafka? What retention guarantees does it provide?
← Week 2: DynamoDB Internals

DynamoDB Streams Overview

Streams capture item-level changes in near real-time (within ~100ms):

PUT/UPDATE/DELETE item → DynamoDB Table → DynamoDB Stream → Lambda / Kinesis

Stream records have a 24-hour retention window. Each shard contains records in order for a set of partition keys.

← Week 2: DynamoDB Internals

Stream View Types

View Type Contents
KEYS_ONLY Only partition key + sort key
NEW_IMAGE The item as it appears after modification
OLD_IMAGE The item as it appeared before modification
NEW_AND_OLD_IMAGES Both before and after images

For CDC (projections, derived read models): use NEW_IMAGE.
For audit logging: use NEW_AND_OLD_IMAGES.
For cascade delete (delete children when parent deleted): use OLD_IMAGE.

← Week 2: DynamoDB Internals

Lambda Trigger

use aws_lambda_events::event::dynamodb::{Event as DynamodbEvent, EventRecord};
use aws_lambda_events::dynamodb::StreamRecord;

async fn handler(event: LambdaEvent<DynamodbEvent>) -> Result<(), Error> {
    for record in &event.payload.records {
        match record.event_name.as_deref() {
            Some("INSERT") | Some("MODIFY") => {
                let new_image = record.change.new_image.as_ref().unwrap();
                project_to_read_model(new_image).await?;
            }
            Some("REMOVE") => {
                let keys = &record.change.keys;
                remove_from_read_model(keys).await?;
            }
            _ => {}
        }
    }
    Ok(())
}
← Week 2: DynamoDB Internals

Kinesis Data Streams Integration

DynamoDB can export to Kinesis Data Streams instead of the native Streams API:

DynamoDB Table → Kinesis Data Stream → Kinesis Consumer (Lambda, Firehose, etc.)

Advantages over native DynamoDB Streams:

  • Retention: up to 1 year (vs 24 hours)
  • Multiple consumers can read the same stream
  • Integrate with existing Kinesis processing infrastructure
  • Better monitoring (CloudWatch metrics for behind-shards)
← Week 2: DynamoDB Internals

Key Takeaways

  • DynamoDB Streams provide near-real-time CDC with 24-hour retention
  • Choose stream view type based on use case: NEW_IMAGE for projections, NEW_AND_OLD_IMAGES for audit
  • Lambda triggers integrate directly; Kinesis Streams export for longer retention and fan-out
  • Streams enable the outbox pattern natively for DynamoDB-centric architectures

Tomorrow: single-table design — the advanced DynamoDB modeling technique.