Connect

aws_dynamodb_cdc

Reads change data capture (CDC) events from DynamoDB Streams.

Introduced in version 4.79.0.

Consumes records from DynamoDB Streams with automatic checkpointing and shard management.

DynamoDB Streams capture item-level changes in DynamoDB tables. This input supports:

  • Automatic shard discovery and management

  • Checkpoint-based resumption after restarts

  • Concurrent processing of multiple shards

  • Optional initial snapshot of existing table data

  • Multi-table streaming with auto-discovery by tags or explicit table lists

Table discovery modes

This input supports three table discovery modes:

  • single (default) - Stream from the tables specified in the tables field

  • tag - Auto-discover and stream from multiple tables based on DynamoDB table tags. Use table_tag_filter to filter tables (for example, key:value)

  • includelist - Stream from an explicit list of tables specified in the tables field. This mode is kept for backward compatibility. Use single instead.

When the input streams from more than one table, it reads from all matching tables simultaneously. Each table maintains its own checkpoint state. In tag or includelist mode, use table_discovery_interval to periodically rescan for new tables (useful for dynamically tagged tables).

Prerequisites

The source DynamoDB table(s) must have DynamoDB Streams enabled. You can enable streams with one of these view types:

  • KEYS_ONLY - Only the key attributes of the modified item

  • NEW_IMAGE - The entire item as it appears after the modification

  • OLD_IMAGE - The entire item as it appeared before the modification

  • NEW_AND_OLD_IMAGES - Both the new and old item images

Snapshots

When snapshot_mode is set to snapshot_only or snapshot_and_cdc, the input first scans the entire table before (or instead of) streaming changes. This is useful for:

  • Building a replica or cache with all existing data

  • Syncing historical data to a data warehouse

  • Populating a search index with existing records

Snapshots are supported only when streaming from a single table.

Snapshots use the DynamoDB Scan API which consumes read capacity units (RCUs). For large tables, this can be expensive and take considerable time. Use snapshot_segments and snapshot_throttle to control RCU consumption.
Snapshots use eventually consistent reads and do not provide point-in-time consistency. Records modified during the snapshot may appear in both the snapshot and CDC stream (with different values). Use snapshot_deduplicate to minimize duplicates.

Checkpointing

Checkpoints are stored in a separate DynamoDB table (configured via checkpoint_table). This table is created automatically if it does not exist. On restart, the input resumes from the last checkpointed position for each shard. Snapshot progress is also checkpointed, allowing resumption mid-snapshot after failures. The principal needs dynamodb:UpdateItem on the checkpoint table, in addition to the read and write permissions it already uses.

A closed shard that has been read to the end is marked completed in the checkpoint table and is skipped after a restart. A child shard is read only after its parent has been read to the end, so changes to an item are emitted in order across shard splits. There are three exceptions, where a child shard is read without waiting and an older change to an item can be emitted after a newer one: the first discovery under start_from: latest, where every shard starts at its latest position; a parent shard that fails to prepare on 5 consecutive shard refresh cycles (a warning is logged); and a parent shard the stream reports as not found. A child shard that keeps waiting for its parent is reported with a warning every 20 shard refresh cycles. If a stored checkpoint points at stream data that has already been trimmed (older than the 24 hour retention), the shard resumes from TRIM_HORIZON and a warning is logged.

Without a namespace, checkpoints are keyed only by stream and shard (or by source table and shard when global_table is enabled). Multiple pipelines that read the same stream and share one checkpoint_table without a namespace overwrite each other’s positions, which causes skipped or duplicated events.

Multiple independent pipelines can share a single checkpoint table by giving each one a distinct checkpoint_namespace (for example one namespace per developer or environment). Namespaces isolate checkpoints from each other: a pipeline only sees checkpoints written under its own namespace, so changing (or removing) the namespace causes the pipeline to restart from start_from. Namespaces do not coordinate consumers: two pipelines sharing the same namespace still overwrite each other’s checkpoints.

The namespace is prefixed to the checkpoint key. When a pipeline restarts under a namespace that has no checkpoints yet, it starts from start_from. With start_from: trim_horizon, this replays all records still available in the stream’s 24-hour retention window. Switching back to a previously used namespace resumes from that namespace’s last checkpoints.

Alternative

For better performance and longer retention (up to 1 year vs 24 hours), consider using Kinesis Data Streams for DynamoDB with the aws_kinesis input instead.

Message format

Each change event is a JSON object with the fields tableName, eventID, eventName (INSERT, MODIFY, or REMOVE), eventVersion, eventSource, and awsRegion, plus a dynamodb object. The dynamodb object contains keys, newImage, and oldImage when the stream view type provides them, along with sequenceNumber, streamViewType, and sizeBytes. Snapshot records have an eventName of READ and carry the whole item in dynamodb.newImage.

Attribute values are converted from DynamoDB’s typed format, such as {"S": "value"}, to plain values, such as "value". Number attributes stay strings, so convert them in a mapping if you need numeric values.

Metadata

This input adds the following metadata fields to each message:

  • dynamodb_shard_id - The shard ID from which the record was read (empty for snapshot records)

  • dynamodb_sequence_number - The sequence number of the record in the stream (empty for snapshot records)

  • dynamodb_approximate_creation_time - RFC3339 approximate creation time of the stream record (empty for snapshot records)

  • dynamodb_event_name - The type of change: INSERT, MODIFY, REMOVE, or READ (for snapshot records)

  • dynamodb_table - The name of the DynamoDB table

Metrics

This input emits the following metrics:

  • dynamodb_cdc_shards_tracked - Total number of shards being tracked (gauge)

  • dynamodb_cdc_shards_active - Number of shards currently being read from (gauge)

  • dynamodb_cdc_snapshot_state - Snapshot state: 0=not_started, 1=in_progress, 2=complete (gauge)

  • dynamodb_cdc_snapshot_records_read - Total records read during snapshot (counter)

  • dynamodb_cdc_snapshot_segments_active - Number of active snapshot scan segments (gauge)

  • dynamodb_cdc_snapshot_buffer_overflow - Incremented when the deduplication buffer exceeds its size limit, disabling dedup (counter)

  • dynamodb_cdc_snapshot_segment_duration - Time taken by each snapshot scan segment to complete (timer)

  • dynamodb_cdc_checkpoint_failures - Number of failed checkpoint writes to the checkpoint table (counter)

  • dynamodb_cdc_failover_skipped - Records skipped during global-table failover replay because they predate the resumed cutoff (counter)

Global table checkpoints (multi-region failover)

In active/active or active/passive multi-region deployments, set global_table: true and list the other regions in global_table_replicas so the auto-created checkpoint table is provisioned as a DynamoDB Global Table (v2). Checkpoints then replicate across regions: a failed-over pipeline resumes near the last committed position instead of replaying the whole stream. Because each region’s stream has its own sequence numbers, cross-region resume is time-based (at-least-once, replaying from the trim horizon up to the last replicated record time); same-region restarts still resume exactly. If the checkpoint table already exists, enabling global_table reconciles it towards the desired configuration: any missing replica regions are added via UpdateTable. The existing table must have been created in global mode (it must use a TableId hash key); pointing global_table at a pre-existing non-global checkpoint table fails fast with a clear error rather than mutating it.

When global_table is enabled the principal additionally needs dynamodb:CreateTable, dynamodb:UpdateTable, dynamodb:DescribeTable, dynamodb:DescribeLimits, iam:CreateServiceLinkedRole, and create/describe permissions in each replica region.

Use this reference to:

  • Look up configuration options for DynamoDB CDC streaming

  • Find metadata fields available for message processing

  • Identify checkpointing and performance tuning settings

  • Common

  • Advanced

input:
  label: ""
  aws_dynamodb_cdc:
    tables: []
    checkpoint_table: redpanda_dynamodb_checkpoints
    checkpoint_namespace: ""
    start_from: trim_horizon
    auto_replay_nacks: true
    snapshot_mode: none
input:
  label: ""
  aws_dynamodb_cdc:
    tables: []
    table_discovery_mode: single
    table_tag_filter: ""
    table_discovery_interval: 5m
    checkpoint_table: redpanda_dynamodb_checkpoints
    checkpoint_namespace: ""
    global_table: false
    global_table_replicas: []
    batch_size: 1000
    poll_interval: 1s
    start_from: trim_horizon
    checkpoint_limit: 1000
    max_tracked_shards: 10000
    auto_replay_nacks: true
    throttle_backoff: 100ms
    snapshot_mode: none
    snapshot_segments: 1
    snapshot_batch_size: 100
    snapshot_throttle: 100ms
    snapshot_deduplicate: true
    snapshot_buffer_size: 100000
    region: "" # No default (optional)
    endpoint: "" # No default (optional)
    tcp:
      connect_timeout: 0s
      keep_alive:
        idle: 15s
        interval: 15s
        count: 9
      tcp_user_timeout: 0s
    credentials:
      profile: "" # No default (optional)
      id: "" # No default (optional)
      secret: "" # No default (optional)
      token: "" # No default (optional)
      from_ec2_role: false # No default (optional)
      role: "" # No default (optional)
      role_external_id: "" # No default (optional)

Message structure

Each CDC event is delivered as a JSON message with the following structure. Use these fields in your Bloblang mappings with this.<field>:

{
  "eventID": "abc123-",                    (1)
  "eventName": "INSERT | MODIFY | REMOVE",   (2)
  "eventSource": "aws:dynamodb",
  "awsRegion": "us-east-1",
  "tableName": "my-table",                   (3)
  "dynamodb": {
    "keys": {                                (4)
      "pk": "user#123",
      "sk": "profile"
    },
    "newImage": {                            (5)
      "pk": "user#123",
      "sk": "profile",
      "name": "Alice",
      "email": "alice@example.com"
    },
    "oldImage": {                            (6)
      "pk": "user#123",
      "sk": "profile",
      "name": "Alice Smith"
    },
    "sequenceNumber": "12345678901234567890", (7)
    "sizeBytes": 256,
    "streamViewType": "NEW_AND_OLD_IMAGES"
  }
}
1 Unique identifier for this change event.
2 Type of change: INSERT (new item), MODIFY (updated item), or REMOVE (deleted item).
3 Name of the source DynamoDB table.
4 Primary key attributes of the changed item. Always present.
5 Item state after the change. Present for INSERT and MODIFY events (requires NEW_IMAGE or NEW_AND_OLD_IMAGES stream view type).
6 Item state before the change. Present for MODIFY and REMOVE events (requires OLD_IMAGE or NEW_AND_OLD_IMAGES stream view type).
7 Position of this record in the shard, used for ordering and checkpointing.

Example mapping

pipeline:
  processors:
    - mapping: |
        root.event_type = this.eventName
        root.table = this.tableName
        root.keys = this.dynamodb.keys
        root.new_data = this.dynamodb.newImage
        root.old_data = this.dynamodb.oldImage

Fields

auto_replay_nacks

Whether to automatically replay rejected messages (negative acknowledgements, or nacks) at the output level. If the cause of rejections persists, leaving this option enabled can result in back pressure.

Set auto_replay_nacks to false to delete rejected messages. Disabling auto replays can greatly improve memory efficiency of high throughput streams, as the original shape of the data is discarded immediately upon consumption and mutation.

Requires version 4.106.0 or later.

Type: bool

Default: true

batch_size

Maximum number of records to read per shard in a single request. Valid range: 1-1000.

Type: int

Default: 1000

checkpoint_limit

Maximum number of unacknowledged messages before forcing a checkpoint update. Lower values provide better recovery guarantees but increase write overhead.

Type: int

Default: 1000

checkpoint_namespace

Isolates this pipeline’s checkpoints within a shared checkpoint_table by prefixing the namespace to the checkpoint key. Use this so that multiple pipelines reading the same stream can share one checkpoint table without overwriting each other’s positions, for example per-developer or per-environment test pipelines. Leave empty (the default) to keep the original checkpoint keys unchanged. A namespace isolates readers but does not coordinate them: pipelines that share the same namespace still collide. Changing or removing the namespace changes the checkpoint key. If no checkpoints exist yet under the new key, the pipeline starts from start_from. Switching back to a previously used namespace resumes from that namespace’s last checkpoints. The value cannot contain a # character.

Requires version 4.101.0 or later.

Type: string

Default: ""

checkpoint_table

DynamoDB table name for storing checkpoints. Will be created if it doesn’t exist.

Type: string

Default: redpanda_dynamodb_checkpoints

credentials

Manually configure the AWS credentials to use (optional). For more information, see the Amazon Web Services guide.

Type: object

credentials.from_ec2_role

Use the credentials of a host EC2 machine configured to assume an IAM role associated with the instance.

Type: bool

credentials.id

The ID of the AWS credentials to use.

Type: string

credentials.profile

The profile from ~/.aws/credentials to use.

Type: string

credentials.role

The ARN of the role to assume.

Type: string

credentials.role_external_id

An external ID to use when assuming a role.

Type: string

credentials.secret

The secret for the AWS credentials in use.

This field contains sensitive information that usually shouldn’t be added to a configuration directly. For more information, see Secrets.

Type: string

credentials.token

The token for the AWS credentials in use. Required only when using short-term credentials.

Type: string

endpoint

A custom endpoint URL for AWS API requests. Use this to connect to AWS-compatible services or local testing environments instead of the standard AWS endpoints.

Type: string

global_table

Provision the checkpoint table as a DynamoDB Global Table (v2) so checkpoints replicate across regions. Requires global_table_replicas. When the table is auto-created it is created as a global table; when it already exists, its replicas are reconciled (missing regions are added by calling UpdateTable). The existing table must have been created in global mode (TableId hash key). Enabling this against a pre-existing non-global checkpoint table fails fast with a clear error.

Requires version 4.99.0 or later.

Type: bool

Default: false

global_table_replicas[]

Regions other than this pipeline’s own region to replicate the checkpoint table to. The pipeline’s own region is always included. Required when global_table is true. Applied both when the checkpoint table is created and, for an existing global table, when reconciling replicas (missing regions are added; this list is not used to remove regions).

Requires version 4.99.0 or later.

Type: array<string>

Default: []

max_tracked_shards

Maximum number of shards holding acknowledgement state at once. A shard is normally forgotten once it has been read to the end and its last batch has been acknowledged, so this bounds the shards being read concurrently, not the shards seen over the pipeline’s lifetime. Past this limit acknowledgements return an error.

Type: int

Default: 10000

poll_interval

Time to wait between polling attempts when no records are available.

Type: string

Default: 1s

region

The AWS region in which your resources are hosted.

Type: string

snapshot_batch_size

Records per scan request during snapshot. Maximum 1000. Lower values provide better backpressure control but require more API calls.

Requires version 4.82.0 or later.

Type: int

Default: 100

snapshot_buffer_size

Maximum CDC events to buffer for deduplication (approximately 100 bytes per entry). If exceeded, deduplication is disabled and duplicates may be emitted.

Requires version 4.82.0 or later.

Type: int

Default: 100000

snapshot_deduplicate

Deduplicate records that appear in both snapshot and CDC stream. Requires buffering CDC events during snapshot. If buffer is exceeded, deduplication is disabled to prevent data loss.

Requires version 4.82.0 or later.

Type: bool

Default: true

snapshot_mode

none: Streams CDC events only (default). snapshot_only: Performs a one-time full table scan with no ongoing streaming. snapshot_and_cdc: Scans the entire table, then streams changes.

Requires version 4.82.0 or later.

Type: string

Default: none

Options: none, snapshot_only, snapshot_and_cdc

snapshot_segments

Number of parallel scan segments (1-10). Higher parallelism scans faster but consumes more Read Capacity Units (RCUs). A lower value is safer to start with.

Requires version 4.82.0 or later.

Type: int

Default: 1

snapshot_throttle

Minimum time between scan requests per segment. Use this to limit Read Capacity Unit (RCU) consumption during snapshot.

Requires version 4.82.0 or later.

Type: string

Default: 100ms

start_from

Where to start reading on a genuinely fresh pipeline (no checkpoint state exists yet under this checkpoint_namespace for the stream). trim_horizon starts from the oldest available record, latest starts from new records.

latest is honoured only on that first discovery: once any checkpoint state exists, shards discovered later - rotation children found by the periodic refresh, and any checkpoint-less shard after a restart - always start at trim_horizon so their backlog is never skipped. In practice a restart under latest therefore replays from each shard’s oldest retained record rather than only new records; at-least-once delivery takes precedence over the configured start position.

Type: string

Default: trim_horizon

Options: trim_horizon, latest

table_discovery_interval

Interval for rescanning and discovering new tables when using tag or includelist mode. Set to 0 to disable periodic rescanning.

Requires version 4.83.0 or later.

Type: string

Default: 5m

table_discovery_mode

single: Streams from tables specified in the tables list. tag: Auto-discovers tables by tags (ignores the tables field). includelist: Streams from tables in the tables list. Use single instead; includelist is kept for backward compatibility.

Requires version 4.83.0 or later.

Type: string

Default: single

Options: single, tag, includelist

table_tag_filter

Multi-tag filter in the format key1:v1,v2;key2:v3,v4. Matches tables where (key1=v1 OR key1=v2) AND (key2=v3 OR key2=v4). Required when table_discovery_mode is tag.

Requires version 4.83.0 or later.

Type: string

Default: ""

tables[]

List of table names to stream from. For single table mode, provide one table. For multi-table mode, provide multiple tables.

Requires version 4.83.0 or later.

Type: array<string>

Default: []

tcp

Configure TCP socket-level settings to optimize network performance and reliability. These low-level controls are useful for:

  • Unresponsive hosts: Set connect_timeout to limit how long a connection attempt can take (the default 0s sets no limit)

  • Long-lived connections: Configure keep_alive settings to detect and recover from stale connections

  • Unstable networks: Tune keep-alive probes to balance between quick failure detection and avoiding false positives

  • Linux systems with specific requirements: Use tcp_user_timeout (Linux 2.6.37+) to control data acknowledgment timeouts

Most users should keep the default values. Only modify these settings if you’re experiencing connection stability issues or have specific network requirements.

Type: object

tcp.connect_timeout

Maximum amount of time a dial will wait for a connect to complete. Zero disables.

Type: string

Default: 0s

tcp.keep_alive

TCP keep-alive probe configuration.

Type: object

tcp.keep_alive.count

Maximum unanswered keep-alive probes before dropping the connection. Zero defaults to 9.

Type: int

Default: 9

tcp.keep_alive.idle

Duration the connection must be idle before sending the first keep-alive probe. Zero defaults to 15s. Negative values disable keep-alive probes.

Type: string

Default: 15s

tcp.keep_alive.interval

Duration between keep-alive probes. Zero defaults to 15s.

Type: string

Default: 15s

tcp.tcp_user_timeout

Maximum time to wait for acknowledgment of transmitted data before killing the connection. Linux-only (kernel 2.6.37+), ignored on other platforms. When enabled, keep_alive.idle must be greater than this value per RFC 5482. Zero disables.

Type: string

Default: 0s

throttle_backoff

Time to wait when applying backpressure due to too many in-flight messages.

Type: string

Default: 100ms

Examples

Consume CDC events

Read change events from a DynamoDB table with streams enabled.

input:
  aws_dynamodb_cdc:
    tables: [my-table]
    region: us-east-1

Start from latest

Only process new changes, ignoring existing stream data.

input:
  aws_dynamodb_cdc:
    tables: [orders]
    start_from: latest
    region: us-west-2

Snapshot and CDC

Scan all existing records, then stream ongoing changes.

input:
  aws_dynamodb_cdc:
    tables: [products]
    snapshot_mode: snapshot_and_cdc
    snapshot_segments: 5
    region: us-east-1

Auto-discover tables by tag

Automatically discover and stream from all tables with a specific tag.

input:
  aws_dynamodb_cdc:
    table_discovery_mode: tag
    table_tag_filter: "stream-enabled:true"
    table_discovery_interval: 5m
    region: us-east-1

Auto-discover tables by multiple tags

Discover tables matching multiple tag criteria with OR logic per key, AND logic across keys.

input:
  aws_dynamodb_cdc:
    table_discovery_mode: tag
    table_tag_filter: "environment:prod,staging;team:data,analytics"
    table_discovery_interval: 5m
    region: us-east-1
    # Matches tables with: (environment=prod OR environment=staging) AND (team=data OR team=analytics)

Share a checkpoint table across pipelines

Give each pipeline that reads the same stream its own checkpoint_namespace so that they can share one checkpoint table without overwriting each other’s positions. A second pipeline uses the same configuration with a different namespace, such as dev-bob.

input:
  aws_dynamodb_cdc:
    tables: [orders]
    checkpoint_table: shared_dynamodb_checkpoints
    checkpoint_namespace: dev-alice
    start_from: trim_horizon
    region: us-east-1

Stream from multiple specific tables

Stream from an explicit list of tables simultaneously.

input:
  aws_dynamodb_cdc:
    table_discovery_mode: includelist
    tables:
      - orders
      - customers
      - products
    region: us-west-2

Suggested reading

For common patterns including filtering events, routing to Kafka or S3, and detecting changed fields, see the DynamoDB CDC Patterns cookbook.