Global Tables: the basics
What is a DynamoDB Global Table and why does it get flagged?
A DynamoDB Global Table is a single logical table replicated across two or more AWS Regions, with every replica being a full read/write copy. Write to the table in us-east-1 and the change asynchronously propagates to us-west-2 (and any other replica Region) within typically a second or two. There's no designated primary — every replica accepts both reads and writes, which is why it's called active-active. Applications in each Region talk to their local replica and get local-Region latency on both reads and writes.
That design buys you two things at once. First, disaster recovery: if an entire Region becomes unavailable, the other replicas keep serving reads and writes with effectively no data-loss window and an RTO measured in seconds — there's no failover to trigger, the other Regions were already live. Second, low-latency global access: a user in Frankfurt hits the eu-central-1 replica instead of crossing the Atlantic to us-east-1. Conflicts between concurrent writes in different Regions are resolved with last-writer-wins, reconciled by a per-item timestamp.
The check flags, with LOW severity, a table identified as business-critical that has no Global Tables replica — it lives in exactly one Region. The severity is intentionally low because this is not a defect for most tables. Global Tables roughly multiplies the table's write and storage cost by the number of Regions, so it is the right answer only when you genuinely need multi-Region resilience or global low latency. The check exists to make you decide deliberately, not to push every table toward multi-Region by default.
In this lesson you'll learn how Global Tables actually work — active-active replication, asynchronous propagation, and last-writer-wins conflict resolution — and exactly what they cost (replicated write request units in every Region, full storage per Region, and cross-Region transfer). You'll see the CLI to detect a single-Region table and to add a replica, the consistency caveats that force you to design for idempotency, and the decision framework for when Global Tables is warranted versus when point-in-time recovery plus AWS Backup in one Region is the cheaper, correct answer.
The 2.0 rewrite that changed the bill
DynamoDB's original Global Tables (version 2017.11.29) required you to provision identical write capacity in every Region up front and reconciled conflicts with a separate coordination table — clunky, and easy to mis-size. The current version (2019.11.21) replaced that with on-demand-friendly replicated write request units billed per Region and built-in last-writer-wins conflict resolution. The practical upshot: you can add a replica Region to an existing table with a single API call and no downtime — but you also can't see the cost coming as easily, because there's no separate provisioned line to stare at. The bill simply grows by roughly the table's write-and-storage cost for each Region you add.
Adding a Global Table replica in action
Priya owns the platform data layer at a payments company. The reliability check has flagged their wallet-balances table — single-Region in us-east-1, and it's on the critical-systems list because a Region outage there means customers can't transact. It's an on-demand table doing ~3,000 writes/second at peak and holding 400 GB, costing roughly $5,200/month single-Region.
She doesn't reach for Global Tables reflexively. First she confirms the requirement: the company has a contractual 99.99% availability SLA on the wallet service, and the last regional event in the industry cost a competitor a multi-hour outage. That's a genuine multi-Region case. She also checks the application can tolerate eventual consistency across Regions and that balance updates are already idempotent (every write carries a transaction ID) — so last-writer-wins won't silently corrupt a balance.
She inspects the current table, confirms it has no replicas, then adds a us-west-2 replica. She knows the bill will roughly double to ~$10,000/month — replicated writes billed in us-west-2, a full second copy of the 400 GB, plus cross-Region transfer — and she's already cleared that with finance against the cost of an SLA breach. After the replica reaches ACTIVE she runs a game-day: blackhole us-east-1 at the application layer and confirm us-west-2 keeps serving with no data loss.
First, confirm the table is single-Region — no Replicas listed and no GlobalTableVersion means it has no Global Tables replica.
Single-Region table. A null Replicas/GlobalTableVersion is the signal the check fires on.
After confirming the table genuinely needs multi-Region resilience, add a us-west-2 replica. This converts it to a Global Table; both Regions become full read/write replicas.
Adding a replica Region converts the table to a Global Table — and roughly doubles its write and storage cost from here on.
How Global Tables actually workdeep dive
Each replica in a Global Table is a complete, independent DynamoDB table in its own Region — same items, same indexes, fully readable and writable. When you write to one Region, DynamoDB asynchronously ships that change to every other replica, usually within a second or two over AWS's backbone. There's no leader and no failover step: all replicas are always live, which is what gives you a seconds-level RTO. The flip side is that reads are eventually consistent across Regions — a strongly-consistent read only guarantees the latest write within the same Region, never across Regions. A read in us-west-2 may briefly miss a write that just landed in us-east-1.
Conflicts are resolved with last-writer-wins. If the same item is written in two Regions at nearly the same moment, DynamoDB compares a per-item timestamp and the most recent write survives; the other is silently discarded. That's fine for many workloads but dangerous for any read-modify-write pattern (incrementing a counter, decrementing a balance) where a lost write means lost data. The design rule is to make cross-Region writes idempotent and conflict-tolerant — carry your own version or transaction ID, write whole items rather than blind increments, and never assume both Regions see the same state at the same instant.
The cost model follows directly from "each replica is a full table." Writes are billed as replicated write request units (rWCUs) in each replica Region — a single application write becomes a billed write in every Region it lands in. Storage is charged in full per Region because each holds a complete copy. And replication traffic crosses Regions, billed as cross-Region data transfer (~$0.02/GB outbound). Roughly: a table's write and storage cost is multiplied by the number of Regions, plus transfer. The current version is 2019.11.21; the older 2017.11.29 version used a different, provisioned-capacity model and a separate metadata table — avoid creating new tables on it.
# Inspect the replication status and per-Region state of a Global Table.
aws dynamodb describe-table \
--table-name wallet-balances \
--query 'Table.{Version:GlobalTableVersion,Replicas:Replicas[].{Region:RegionName,Status:ReplicaStatus}}' \
--output json
# Watch cross-Region replication latency to confirm replicas are keeping up.
aws cloudwatch get-metric-statistics \
--namespace AWS/DynamoDB \
--metric-name ReplicationLatency \
--dimensions Name=TableName,Value=wallet-balances \
Name=ReceivingRegion,Value=us-west-2 \
--start-time $(date -u -d '1 hour ago' +%FT%TZ) \
--end-time $(date -u +%FT%TZ) \
--period 60 --statistics Average Maximum What is the impact of running a critical table single-Region?
The headline risk is Region-failure survivability. A single-Region table has no warm copy anywhere else — if the Region has a control-plane or availability event, the table is unreadable and unwritable until the Region recovers or you restore from backup in another Region. Restoring a large table from a point-in-time backup into a new Region is a minutes-to-hours operation, and the data is as fresh as your last recovery point. For a revenue-critical or SLA-bound workload, that recovery window can be the difference between a non-event and a contractual breach.
The second impact is latency for globally distributed users. With one Region, every user worldwide pays the round-trip to that Region — a user in Singapore hitting a us-east-1 table sees 200+ ms of network latency on every call. Global Tables puts a local replica near them and cuts that to single-digit or low-tens-of-ms. For latency-sensitive interactive workloads serving multiple continents, single-Region isn't just a DR gap, it's a daily user-experience tax.
But the inverse impact matters just as much: enabling Global Tables on a table that doesn't need it is pure waste. It roughly doubles (or triples, for three Regions) the write and storage cost forever, plus transfer, for resilience the workload never exercises. An internal analytics table, a dev table, or anything where hours of recovery from backup is acceptable gains nothing from active-active replication — it just costs more every month. The reliability check is LOW severity precisely because the wrong fix here is more expensive than the finding.
Finally, there's a correctness impact that single-Region hides. The moment a table goes multi-Region, eventual consistency and last-writer-wins become real concerns the application must handle. A team that flips on Global Tables without auditing read-modify-write paths can introduce silent data loss — a lost balance decrement, a dropped counter increment — that's far worse than the outage they were guarding against. The cost of Global Tables isn't only on the invoice; it's also the engineering work to make the data model conflict-safe.
How do you decide on and enable Global Tables safely?
This is a decide-first loop. The order matters: qualify the requirement before spending, make the data model conflict-safe before replicating, add the replica, then rehearse the Region-failure path you're paying for.
1. Qualify the requirement before reaching for the feature
Global Tables is justified only when the workload genuinely needs multi-Region resilience (a Region outage breaches an SLA or stops revenue) or global low latency (interactive users on multiple continents). If hours of recovery from a point-in-time backup is acceptable, the correct answer is single-Region with PITR and AWS Backup — far cheaper. Don't enable it because the check fired; enable it because the table's failure mode is genuinely unacceptable.
2. Make the data model conflict-tolerant before you replicate
Active-active means concurrent cross-Region writes resolve last-writer-wins, and reads are eventually consistent across Regions. Audit every read-modify-write path — counters, balances, anything that increments — and replace blind updates with idempotent, version-stamped writes or DynamoDB conditional expressions. A table that's safe single-Region can silently lose writes the moment it goes multi-Region if this step is skipped.
3. Add the replica and verify replication health
Use update-table --replica-updates Create={RegionName=...} to add the replica Region; the table converts to Global Tables version 2019.11.21 with no downtime. Wait for the new replica to reach ACTIVE, then watch the ReplicationLatency CloudWatch metric for the receiving Region under representative load. Sub-second to low-single-digit-second latency is normal; sustained higher latency means the replica can't keep up and needs investigating before you rely on it for failover.
4. Rehearse the Region-failure path you're paying for
A multi-Region table you've never failed over is a premium you're paying for an untested guarantee. Run a periodic game-day: simulate the loss of one Region at the application layer (DNS or endpoint cutover, not by deleting anything), confirm the other replica serves reads and writes cleanly, measure the actual RTO, and verify no data was lost. Document the cutover runbook so the failover is a known procedure, not an improvisation during a real incident.
# Add a second Region to make this a Global Table (no downtime; converts to 2019.11.21).
aws dynamodb update-table \
--table-name wallet-balances \
--replica-updates 'Create={RegionName=us-west-2}'
# Poll until the new replica reports ACTIVE before relying on it for failover.
aws dynamodb describe-table \
--table-name wallet-balances \
--query 'Table.Replicas[?RegionName==`us-west-2`].ReplicaStatus' \
--output text
# To back out: remove the replica Region (stops the replicated write + storage cost).
aws dynamodb update-table \
--table-name wallet-balances \
--replica-updates 'Delete={RegionName=us-west-2}' Quick quiz
Question 1 of 5A business-critical payments table runs single-Region with a 99.99% availability SLA, on-demand capacity, and read-modify-write balance updates. The reliability check flags it for having no Global Tables replica. What's the right move?
You scored
0 / 5
Keep learning
Dig deeper into Global Tables mechanics, the cost model, and multi-Region DR strategy.
- Amazon DynamoDB Global Tables documentation Authoritative source on active-active replication, version 2019.11.21, and the conflict-resolution model.
- Amazon DynamoDB pricing Replicated write request units, per-Region storage, and the rates behind the multi-Region cost math.
- Global Tables: how it works (consistency and conflict resolution) Eventual consistency across Regions and the last-writer-wins behaviour you must design around.
- AWS Well-Architected — Reliability Pillar RPO, RTO, and multi-Region DR framing for deciding when active-active replication is warranted.
You've completed Enable DynamoDB Global Tables. You now know how active-active multi-Region replication works, the last-writer-wins and eventual-consistency caveats you have to design around, and exactly what it costs — replicated writes per Region, full per-Region storage, and cross-Region transfer. Most importantly, you know it's a deliberate choice for genuinely multi-Region needs, not a default: the next time the check flags a single-Region table, you'll have a decide-first loop that qualifies the requirement before spending a dollar of the premium.
Back to the library