ElastiCache Reserved Nodes: the basics
Why your caching layer needs its own commitment strategy
An ElastiCache Reserved Node is a billing commitment, not a resource you launch. You promise AWS that you'll run a particular node shape — a specific node type like cache.r6g.large, in a specific region — for one or three years, and in exchange AWS discounts the hourly rate by up to roughly 55% versus On-Demand. Nothing about the running cluster changes; the discount is applied behind the scenes against any matching node you happen to be running, whether it's a Redis OSS, Valkey, or Memcached node.
The reason ElastiCache gets its own lesson is that, like RDS, it falls entirely outside Savings Plans. Compute Savings Plans and EC2 Instance Savings Plans cover EC2, Fargate, and Lambda — they do not cover ElastiCache, RDS, Redshift, or OpenSearch. For your caching tier, the Reserved Node is the only commitment lever you have. If ElastiCache is a meaningful slice of the bill and it's all running On-Demand, you're leaving the single largest structured discount on the table with nothing else able to capture it.
ElastiCache Reserved Nodes mirror the RI model: three payment shapes — No Upfront, Partial Upfront, and All Upfront — where more upfront buys a deeper discount. (The older Heavy/Medium/Light Utilization offering types are legacy; new purchases use the three payment options.) Every reserved node is scoped to an exact node type and region with no size flexibility — a cache.r6g.large reservation covers a cache.r6g.large and nothing else. That rigidity is the whole game: commit to the right shape and it's free money; commit to the wrong one and you've locked yourself into paying for a node you may not be running in eighteen months.
In this lesson you'll learn why ElastiCache sits outside Savings Plans and needs its own Reserved Node strategy, how reserved nodes are scoped (node type and region, with no size flexibility), why the node-based-versus-Serverless decision has to come first, and the sequence that protects you — right-size and consolidate clusters first, then commit. You'll see the AWS CLI calls that surface the offerings, make the purchase, and list what you already own, plus the traps that strand a reservation: moving node families, going to Graviton, or migrating a Redis cluster to Valkey on a different node type.
The reservation that didn't follow the migration
ElastiCache Reserved Nodes have no size flexibility at all — a reservation is pinned to one exact node type. Unlike RDS, you can't even flex up or down within a family using normalized units; a cache.r6g.large reservation covers a cache.r6g.large and nothing else. A team committed three years to a fleet of cache.r5 Redis OSS nodes, then took advantage of Graviton and migrated to cache.r6g six months later for ~20% better price-performance. The r6g nodes ran On-Demand at full price while the r5 reservation kept billing against nothing — they paid for both. The Graviton migration that was supposed to save money cost them double until the original reservation finally expired two and a half years later.
Buying ElastiCache reservations in action
Marco runs the platform team at a B2B SaaS company. The FinOps dashboard shows $12k of monthly ElastiCache spend, almost entirely On-Demand, across a Redis OSS fleet that's been stable for over a year. The Compute Savings Plan the company bought last quarter covers their EKS nodes beautifully — and does nothing for the caches.
Before committing a dollar, Marco does the unglamorous work first. He confirms these clusters are genuinely steady-state — not spiky enough to justify moving to ElastiCache Serverless — then right-sizes two over-provisioned cache.r6g.2xlarge nodes down to cache.r6g.xlarge, and reviews cluster-mode shard and replica counts to consolidate where read load no longer justifies the extra replicas. Only then does he look at offerings.
He prices a three-year Partial Upfront reservation against the right-sized cache.r6g.xlarge shape, projecting about 52% savings — roughly $6k a month off the steady baseline. Marco buys to cover ~85% of the stable baseline, deliberately leaving the top of the curve On-Demand so a future right-size or a Redis-to-Valkey move on a different node type doesn't strand a reservation. He sets a calendar reminder for month 30 to plan the renewal.
First, list the available reserved-node offerings for the exact node type and term you're considering, so you can see real fixed and recurring prices before committing.
The offering is scoped to one exact node type — that exact node type is what you're locking in for three years.
When you've chosen an offering, purchase against its ID — this is the irreversible step. Then list what you already own to avoid double-buying.
Purchasing then listing active reservations exposes both double-buy risk and the stranded cache.r5 nobody runs anymore.
ElastiCache reservations under the hooddeep dive
An ElastiCache Reserved Node is matched against your running cache nodes by just two attributes: AWS region and node type (cache.r6g.xlarge). The engine description on the offering (redis, valkey, or memcached) and the node type together identify the offering, but the discount applies per matching node-hour in that region. Unlike RDS there is no size flexibility and no normalized-unit math — a reservation for a cache.r6g.xlarge covers exactly a cache.r6g.xlarge, never a cache.r6g.large or a cache.r6g.2xlarge, and never another family. Every reserved node is effectively a standard, non-convertible commitment; once bought you cannot exchange the node type or region.
The offering types map to the familiar RI shapes: No Upfront, Partial Upfront, and All Upfront, trading cash-now for discount-depth. Older offering types named Heavy, Medium, and Light Utilization still appear in some documentation and historical reservations, but they're legacy — new purchases use the three payment options. A reserved node also doesn't change anything operationally: you keep running clusters exactly as before, and AWS simply applies the discounted rate to any node whose type and region match an active reservation, up to the reserved count.
This rigidity — no size flexibility, no convertibility — is exactly why the architecture and sizing decisions must come before the commitment. Three traps strand a reservation. First, moving node families: commit to cache.r5 x86 and later move to Graviton cache.r6g for its ~20% better price-performance, and the r6g nodes run On-Demand while the r5 reservation bills against thin air. Second, migrating a Redis OSS cluster to Valkey on a different node type changes the matching shape. Third — the decision that precedes all of this — ElastiCache Serverless: it's billed by data stored and ECPUs consumed, not by node-hours, so reserved nodes simply don't apply to it. Decide node-based versus serverless first; reserve only the node-based, steady portion of the fleet.
# Inspect the offerings for the exact node type and term before buying, so you
# know the fixed and recurring price and confirm there is no size flexibility.
aws elasticache describe-reserved-cache-nodes-offerings \
--cache-node-type cache.r6g.xlarge \
--product-description redis \
--offering-type "Partial Upfront" \
--duration 94608000 \
--query 'ReservedCacheNodesOfferings[0].{Id:ReservedCacheNodesOfferingId,Type:CacheNodeType,Fixed:FixedPrice,Recurring:RecurringCharges}'
# Purchase against the chosen offering ID (this is the irreversible step).
aws elasticache purchase-reserved-cache-nodes-offering \
--reserved-cache-nodes-offering-id 649fd0c8-cf6d-47a0-bfa6-060f8e75e95f \
--reserved-cache-node-id ec-ri-r6g-xl-2026 \
--cache-node-count 5 What is the impact of leaving ElastiCache uncommitted?
The direct impact is paying full On-Demand rates on a stable, continuously-running cost category. A cache.r6g.xlarge Redis node runs roughly $0.27/hour On-Demand — about $200/month — and a three-year Partial Upfront reservation drops the effective rate by around 50–55%, to roughly $95/month. Across a steady fleet of a few dozen nodes that's several thousand dollars a month of discount that exists, is offered by AWS, and is simply not being claimed because no one owns the caching commitment decision.
The second-order impact is the asymmetry with Savings Plans. Teams that have invested in Compute Savings Plans often believe their commitment coverage is healthy because the EC2 number looks great — but ElastiCache sits entirely outside that program and is invisible on the Savings Plan dashboard, exactly like RDS, Redshift, and OpenSearch. The result is a blind spot: a steady, committable cost running at sticker price while everyone congratulates themselves on compute coverage. ElastiCache coverage has to be tracked on its own meter or it disappears.
Then there's the stranding risk, which runs the opposite direction and is sharper here than almost anywhere because there is no size flexibility at all. An over-eager or premature commitment is expensive: commit before right-sizing and you lock in the oversized node type; commit to x86 and then migrate to Graviton (cache.r6g), or migrate Redis OSS to Valkey on a different node type, and the reservation bills against nothing while the new nodes pay On-Demand — you pay twice for the remaining term. Worse still, if the workload turns out to be spiky and the team moves it to ElastiCache Serverless, the reservation can't follow at all, because Serverless isn't billed by node-hours.
Finally, this category is a maturity signal. An organisation that covers EC2 with Savings Plans but leaves ElastiCache, RDS, and Redshift uncommitted has a commitment program that stops at the easy, well-marketed instrument and doesn't reach the rest. Caches are usually among the most predictable spend in the whole estate — if they're uncommitted, the commitment strategy isn't finished, it's just started.
How do you commit to ElastiCache reservations safely?
Buying ElastiCache reservations is a four-step sequence, and the order is the whole point: decide node-based versus serverless and clean up the fleet, commit only to the stable baseline, choose the payment option deliberately, and review coverage and utilisation every month.
1. Decide node-based vs Serverless, then right-size and consolidate BEFORE you commit
Reservations only apply to node-based clusters, so first decide whether each workload is steady (node-based, reservable) or spiky and unpredictable (a candidate for ElastiCache Serverless, which you can't reserve). For the node-based fleet, fix the shape before committing: right-size over-provisioned node types down, review cluster-mode shard counts and replica counts to consolidate, and resolve planned migrations — x86-to-Graviton (cache.r5 → cache.r6g) and Redis-OSS-to-Valkey moves that change node type. A reservation bought against a shape you're about to abandon is stranded waste for the full term, with no convertible escape hatch and no size flexibility.
2. Commit to the stable baseline, not the peak
Look at the trailing 60–90 days and find the floor — the cache node capacity that is always running. Commit to roughly 80–90% of that steady baseline and leave the variable top of the curve On-Demand. This deliberately under-covers so that a future right-size or migration doesn't strand a reservation. Because ElastiCache reservations have no size flexibility, under-covering is even more important than with RDS — it's better to leave a little discount uncaptured than to buy a node type you might stop running.
3. Choose the payment option as a cash decision
No Upfront, Partial Upfront, and All Upfront trade cash-now for discount-depth — All Upfront is deepest, No Upfront shallowest. (Ignore the legacy Heavy/Medium/Light Utilization types; new buys use the three payment options.) Term length (1 vs 3 years) is the other lever: 3-year deepens the discount but extends the lock-in. Match the term and payment to how confident you are the node type will persist and to the business's cost of capital — this is finance's call, with an explicit payback number, not a console default.
4. Review coverage and utilisation on every FinOps cadence
Track two numbers monthly: coverage (share of cache node-hours covered by a reservation; target 80–95% on stable fleets) and utilisation (share of reserved capacity actually consumed; must stay near 100%). Watch expirations 60–90 days out so renewals are deliberate, not lapses. If utilisation drops, a migration, right-size, or a move to Serverless has stranded a reservation — investigate before buying anything new.
# Compare offerings across payment options for the exact node type before buying.
for opt in "No Upfront" "Partial Upfront" "All Upfront"; do
echo "== $opt =="
aws elasticache describe-reserved-cache-nodes-offerings \
--cache-node-type cache.r6g.xlarge \
--product-description redis \
--offering-type "$opt" \
--duration 94608000 \
--query 'ReservedCacheNodesOfferings[0].{Id:ReservedCacheNodesOfferingId,Fixed:FixedPrice,Recurring:RecurringCharges}'
done
# List active reservations so you don't double-buy and can see what's expiring.
aws elasticache describe-reserved-cache-nodes \
--query 'ReservedCacheNodes[?State==`active`].{Id:ReservedCacheNodeId,Type:CacheNodeType,Count:CacheNodeCount,Offer:OfferingType,Start:StartTime}' \
--output table Quick quiz
Question 1 of 5You have a stable Redis OSS cache fleet on x86 cache.r5.xlarge nodes, fully On-Demand, and the team is planning a migration to Graviton cache.r6g next quarter for better price-performance. What's the right move on ElastiCache reservations?
You scored
0 / 5
Keep learning
Dig deeper into ElastiCache reserved-node mechanics, the node-based-versus-Serverless choice, and how caching fits the broader commitment strategy.
- Amazon ElastiCache Reserved Nodes documentation Authoritative reference on offering types, payment options, node-type scoping, and how reserved nodes match running clusters.
- Amazon ElastiCache pricing Current On-Demand and Reserved Node rates per node type, plus ElastiCache Serverless pricing — the numbers behind the savings math.
- AWS Cost Explorer reservation purchase recommendations How Cost Explorer generates reservation recommendations and reports coverage and utilisation across services including ElastiCache.
- FinOps Foundation — Cloud Rate and Usage Optimization Where commitment-based discounts like Reserved Nodes fit the broader FinOps lifecycle and operating model.
You've completed Purchase ElastiCache Reserved Nodes. You now know why ElastiCache sits outside Savings Plans and needs its own commitment lever, how reserved nodes are scoped by node type and region with no size flexibility, why the node-based-versus-Serverless decision comes first, and the sequence that protects you — decide the shape and right-size first, commit to the stable baseline second. The next time the bill shows a large, uncommitted caching fleet, you'll have a defensible path from On-Demand to a sound multi-year commitment without stranding a dollar.
Back to the library