Skip to main content
rightsizing · aws

DynamoDB Read-Heavy Table -- Consider DAX

resource types
1
rule IDs covered
1
severity
low

What does ZopNight detect here?

Read-heavy DynamoDB tables (80% or more of consumed capacity over 30 days) are DAX candidates, but ZopNight abstains on every one today. The net saving needs a cache-hit ratio, and a table without DAX has no AWS/DAX series to measure one from. Modeling it would be fabrication.

Signal and threshold

How ZopNight evaluates DynamoDB Read-Heavy Table -- Consider DAX.
Field Value
Rule IDsRC-1516
Categoryrightsizing
Severitylow
Metricnone — pure configuration read
Sourcedynamodb_dax.go

The read share that makes a table a DAX candidate

  • metric-backed read-heaviness: read.Average/(read+write) ≥ 0.80 (replaces the dead read_heavy tag)

Why cache hit ratio cannot be derived here

concrete-or-abstain: it abstains (returns nil) even when read-heavy. DAX is a cost lever (offload read-through lookups to cut provisioned read capacity), so it must be concrete or abstain. The net saving of ADDING DAX is cache_hit_ratio × current_read_cost − DAX_cluster_ADD_cost. Both prices are authoritative: the DAX add-cost is priced (AmazonDAX serviceCode → dax.* node-hour × nodes × 730) and the DynamoDB read price is priced off the same per-request and per-RCU rates AWS publishes (dynamodb-rru $0.000000125 / dynamodb-rcu). The blocker is cache_hit_ratio, which is not authoritatively derivable for RC-1516’s candidate (a table with no DAX), for three structural reasons:

  1. No metric by construction: the only authoritative cache-hit source is the AWS/DAX CloudWatch series (ItemCacheHits/QueryCacheHits, harvested on the dax resource type, dim ClusterId). It exists only for a table that already fronts a DAX cluster; RC-1516’s candidate has none, so there are zero datapoints to read.
  2. No cluster→table join even when DAX exists: AWS/DAX metrics key on ClusterId (attach to the dax resource); the dynamodb set keys on TableName. DescribeClusters exposes no table association (DAX is a transparent read-through cache; the table↔cluster mapping lives only in app config), so a dynamodb rule cannot join any DAX series to the table it evaluates.
  3. Cannot be modeled from consumed-read volume: ConsumedReadCapacityUnits, one of the consumed-capacity series in the AWS/DynamoDB metric set, is read volume; cache effectiveness depends on key-access repetition (hot-key skew), which the volume series does not carry. Converting volume→hit-ratio assumes a cache-friendliness factor = fabrication (forbidden).

Trialling a single-node DAX cluster

  1. Review read/write ratio in CloudWatch (ConsumedReadCapacityUnits vs Write)
  2. Evaluate if read patterns are cache-friendly (repeated key lookups)
  3. Deploy a DAX cluster with 1 node (dax.t3.small) for testing
  4. Update application to use DAX SDK client

The read and write capacity series behind the ratio

ConsumedReadCapacityUnits, ConsumedWriteCapacityUnits (30-day lookback, full-window coverage gate)

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·