AWS DynamoDB is one of those services that engineers adopt fast and audit late. It's fully managed, scales automatically, and delivers single-digit millisecond latency without a server to touch. But the billing model is genuinely complex, and the gap between "we're paying for DynamoDB" and "we know exactly what we’re paying for and why" is wider than most teams expect.
The complexity often compounds silently, in the background. A table gets created, a capacity mode gets picked, a few Global Secondary Indexes get added, and Point in Time Recovery (PITR) gets enabled as a precaution. Each decision is reasonable in isolation, but those small choices here and there build up, and the bill that results six months later reflects all of them at once. Without a clear model for how each dimension drives cost, it's hard to know which decision to revisit first.
And the problem isn't just technical. DynamoDB spend is notoriously difficult to attribute. Tables are often shared across services and teams, tags are inconsistently applied, and index costs roll up into base table metrics in ways that obscure the real source of a spike. Visibility is easy to get. Understanding what's actually driving the number is the hard part.
This guide breaks down how DynamoDB costs accumulate, where bills grow faster than workloads justify, and what gives you the most control over spend.
Key Takeaways
Amazon DynamoDB is a fully managed, serverless NoSQL database that handles key-value and document data. AWS provisions, patches, and scales the underlying infrastructure automatically. There's no instance to size, no read replica to configure, and no maintenance window to plan around.
For teams who need single-digit millisecond latency at any scale, DynamoDB delivers without requiring deep database administration expertise. It's a natural fit for applications with unpredictable traffic, high-throughput event processing, user session storage, and any workload where access patterns favor lookups by a known key over complex relational queries.
But the billing model doesn't match the operational simplicity. DynamoDB pricing involves three core billing dimensions, two capacity modes, and a set of optional features that each carry their own cost structures. Those elements interact in ways that aren't obvious when a table is first created, and the configuration decisions made then compound over the life of the workload.
DynamoDB cost is determined by three core factors: reads, writes, and storage. The capacity mode you choose determines how all three translate into charges. On-demand bills per request. Provisioned bills for capacity reserved in advance, regardless of whether it's consumed.
But those three factors are just the foundation. The real complexity comes from the optional features layered on top. Global tables, point-in-time recovery, DynamoDB Streams, and DAX each generate charges on their own billing dimensions, independent of base table costs. And because most of these features are enabled per table rather than per account, costs accumulate across your table inventory in ways that are easy to miss until the bill arrives.
Beyond the base table billing, a range of optional features generate additional charges:
|
Billing Dimension |
Unit |
Applies To |
Description / Context |
|
Read Request Units (RRUs) |
Per request |
On-demand |
Billed per read request (4 KB increments). |
|
Write Request Units (WRUs) |
Per request |
On-demand |
Billed per write request (1 KB increments). |
|
Read Capacity Units (RCUs) |
Per unit-hour |
Provisioned |
Billed for reserved read throughput, whether used or not. |
|
Write Capacity Units (WCUs) |
Per unit-hour |
Provisioned |
Billed for reserved write throughput, whether used or not. |
|
Storage |
Per GB-month |
Both modes |
Billed for data stored in the base table and secondary indexes. |
|
On-Demand Backup |
Per GB-month |
Optional |
Cost for storing manual, point-in-time snapshots. |
|
Continuous Backup (PITR) |
Per GB-month |
Optional |
Cost for a rolling 35-day recovery window to protect against accidental overwrites. |
|
Replication Write Units |
Per unit / unit-hour |
Global Tables |
Replicated writes (rWRUs/rWCUs) billed on top of base table writes to sync regions. |
|
Streams Read Request Units |
Per unit |
DynamoDB Streams |
Billed against the change log (first 2.5 million units are free). |
|
DAX Node-Hours |
Per node-hour |
DAX |
Continuous cost for running an in-memory cache cluster. |
|
Data Export / Import |
Per GB |
Optional |
Billed for moving data to and from Amazon S3. |
|
Change Data Capture (CDC) |
Per million units |
Optional |
Billed for streaming changes to Kinesis or AWS Glue. |
|
Data Transfer Out |
Per GB |
Optional |
Standard AWS data egress rates apply when moving data out of the region. |
Choosing a capacity mode is the single most consequential DynamoDB pricing decision. Both modes cover reads, writes, and storage but bill those dimensions differently. The right choice depends on your traffic pattern.
On-demand capacity bills per request with no pre-provisioning required. DynamoDB scales automatically and you're charged only for what you use. It fits two situations: new tables without usage history, and workloads with genuinely unpredictable or spiky traffic.
Read billing uses Read Request Units (RRUs). The rate depends on consistency:
Write billing uses Write Request Units (WRUs). A standard write of up to 1 KB consumes 1 WRU. Transactional writes cost 2 WRUs, making transactions a meaningful cost multiplier for write-heavy workloads.
In November 2024, AWS reduced on-demand pricing, shifting the breakeven point between on-demand and provisioned and making on-demand competitive for a wider range of workloads. Teams who set capacity modes before that change should revisit them.
|
Table Class |
Per Million RRUs |
Per Million WRUs |
|
Standard |
$0.125 |
$0.625 |
|
Standard Infrequent Access |
$0.156 |
$0.78 |
US East (Ohio) region. Verify current rates in AWS documentation.
Provisioned capacity bills for RCUs and WCUs reserved in advance, charged hourly regardless of actual consumption. One RCU covers one strongly consistent read per second (up to 4 KB), or two eventually consistent reads. One WCU covers one write per second (up to 1 KB).
Provisioned mode works best for steady-state workloads with predictable traffic. Per-unit provisioned rates are lower than on-demand rates at sustained throughput.
Auto scaling adjusts allocations within bounds you define, but it has latency. Reserved capacity, available as a 1-year or 3-year commitment, provides the largest discounts and is worth evaluating for any mature table with a stable baseline.
|
Table Class |
RCU per unit-hour |
WCU per unit-hour |
|
Standard |
$0.00013 |
$0.00065 |
|
Standard Infrequent Access |
$0.0001625 |
$0.0008125 |
Reflecting the 25% throughput premium on Standard-IA. US East (Ohio) region. Verify current rates in AWS documentation.
The answer depends on the workload. And the right answer for one table in your account may not be the right answer for the table next to it.
|
Factor |
On-Demand |
Provisioned |
|
Traffic pattern fit |
Spiky, unpredictable, new workloads |
Steady, predictable workloads |
|
Billing predictability |
Variable, tied to actual usage |
Fixed hourly, easier to forecast |
|
Idle cost risk |
None. No requests means no charge |
High. Billed whether used or not |
|
Auto-scaling behavior |
Instant, fully managed |
Available but has latency |
The risk in provisioned mode is over-provisioning. Teams that set allocations conservatively to avoid throttling often pay for capacity that's consistently underutilized. That idle capacity doesn't generate an alert. It just keeps billing at the hourly rate while CloudWatch shows the gap between provisioned and consumed capacity.
DynamoDB storage cost is calculated per GB-month and applies to all live data stored within your table and its secondary indexes.
The first 25 GB of storage per month is free, but only for the Standard table class. The free tier does not apply if you choose the Standard-Infrequent Access (Standard-IA) class.
The total storage footprint of a table includes the raw data values plus the structural overhead of your schema:
Note: Table backups (PITR and on-demand snapshots) are billed as separate line items at lower per-GB rates; they are not billed at the live table's storage rate.
|
Table Class |
Storage Cost per GB-month |
Best Used For |
|
Standard |
$0.25 |
Active tables with high read/write volume. |
|
Standard-IA |
$0.10 |
Tables with massive data volume but low operational traffic. |
Rates based on US East (Ohio) region.
While base tables handle your core data, enabling optional features introduces distinct pricing dimensions. Managing these features carefully is the key to preventing cloud bill shock.
|
Feature |
Billing Unit |
Price (US East Ohio) |
Typical Use Case |
|
On-Demand Backup |
Per GB-month |
$0.10 / GB-month |
Manual snapshots, long-term archiving |
|
Continuous Backup (PITR) |
Per GB-month |
$0.20 / GB-month |
Regulatory compliance, disaster recovery |
|
Global Tables (On-Demand) |
Per million rWRUs |
$0.625 / million |
Multi-region active-active apps |
|
DynamoDB Streams |
Per million stream RRUs |
$0.20 (after 2.5M free) |
Event-driven triggers (Lambda) |
|
Data Export to S3 |
Per GB exported |
$0.10 / GB |
Bulk analytics, data lake archiving |
|
DAX Caching |
Per node-hour |
From $0.04 / hr (dax.t3.small) |
Microsecond latency for extreme read volume |
DynamoDB charges appear in AWS Cost Explorer under the Amazon DynamoDB service line. To make sense of a bill, you must group the data by usage type to separate core operations: reads (ReadRequestUnits / HeavyUsage:Read), writes (WriteRequestUnits / HeavyUsage:Write), and total storage (TimedStorage-ByteHrs).
It’s important to remember that while a cost spike in daily reads is instantly visible in Cost Explorer, identifying which specific application, team, or microservice caused it is a notoriously difficult problem.
Manual, tag-based cost allocation rarely solves this problem at scale for three reasons:
When the bill spikes, tracing the root cause traditionally requires digging into application logs or checking CloudWatch metrics and DynamoDB Contributor Insights to see which specific access patterns or data keys blew up the budget.
Don't apply the same capacity mode across your entire stack by default. Evaluate each table's traffic pattern independently.
Every time you write to a base table, DynamoDB must replicate that write to all of its Global Secondary Indexes (GSIs). If your GSI is improperly configured, you pay a steep "write amplification" penalty.
DynamoDB Standard-Infrequent Access (Standard-IA) drops storage costs by 60% but increases read/write request costs by 25%.
The golden rule is to only move a table to Standard-IA if storage makes up more than 50% of that table's total monthly cost. It is ideal for application logs, audit trails, and data kept strictly for regulatory compliance.
Time-to-Live (TTL) is a free background process. By defining a timestamp attribute, DynamoDB automatically wipes out expired items from your base table and all associated indexes without consuming any of your billable write capacity. Use it aggressively for session data, short-term logs, and transient data cache layers.
If you have stable, predictable tables in Provisioned mode, do not pay standard hourly rates.
Use Database Savings Plans to commit to a consistent hourly spend across your account. This grants up to an 18% discount on on-demand throughput (12% on provisioned throughput) and remains flexible if your database architecture changes over time. For massive, permanent, single-region tables, traditional Reserved Capacity offers the deepest discounts (up to 77%).
DynamoDB includes a free tier of 25 GB of storage per month and 25 RCUs and 25 WCUs of provisioned capacity. The free tier applies to Standard table class tables using provisioned capacity, and is granted per Region, per payer account, so it's available in every Region DynamoDB runs in rather than a fixed set of Regions. For most production workloads, usage exceeds the free tier, and standard charges apply above those limits.
It depends on the workload. Write amplification from GSIs dominates on write-heavy tables with multiple indexes. RRU or RCU charges dominate on high-read workloads. Storage becomes the primary driver on tables with large item sizes or high cardinality. Identifying the source requires the breakdown in Cost Explorer, not just the total service line.
Use provisioned when you have several months of stable usage data and can define throughput bounds with confidence. Use on-demand when the workload is new or variable. After the November 2024 pricing reduction, on-demand is now competitive for a broader range of workloads.
DynamoDB storage costs are $0.25 per GB-month on the Standard class, which is higher than Amazon S3 but lower than RDS provisioned storage. Teams who store infrequently accessed data in DynamoDB when S3 or a cheaper tier would serve the access pattern are paying for capabilities they don't use.
Yes. A table can be switched to on-demand once per 24 hours, with the same constraint on switching back. The switch doesn't require a rebuild or downtime and takes effect immediately.
Understanding what drives DynamoDB cost is straightforward once you've worked through the pricing model. The harder problem is getting the right engineer to make the right change.
Most teams can identify the cost drivers. Cost Explorer shows which tables consume capacity. CloudWatch shows whether provisioned capacity is underutilized. But that information lives in AWS tooling, and the engineers who can act on it work in Jira and GitHub.
DynamoDB spend is also hard to attribute accurately. Tables are shared infrastructure, tags are incomplete, and ownership isn't always clear from the table name alone. A recommendation to right-size a table or audit its GSIs is only actionable if it reaches the team who owns it, with enough context to act.
CxM surfaces DynamoDB optimization opportunities across the usage and configuration levers, assigns ownership automatically using CxM Attribution, and routes recommendations into Slack, Jira, and GitHub. A finding about over-provisioned capacity on a specific table goes to the engineer who owns it, with the context needed to act confidently.
The result is DynamoDB cost reduction that ships as tracked, verified work rather than a line item on a dashboard no one acts on.
Ready to see what DynamoDB optimization opportunities exist in your environment? Book a demo to learn how CxM identifies and closes cloud cost gaps across your AWS infrastructure.