Skip to main content
emnode / learn
Cost

Purchase OpenSearch Reserved Instances

No Savings Plan touches OpenSearch — Reserved Instances are the only commitment lever, and they pay back up to ~50% if you right-size the domain and tier the data first.

14 min·10 sections·AWS

Last reviewed

OpenSearch Reserved Instances: the basics

Why your search and logging cluster needs its own commitment strategy

An OpenSearch Reserved Instance (OpenSearch RI) is a billing commitment, not a resource you launch. You promise AWS that you'll run a particular data-node shape — a specific instance type in a specific region — for one or three years, and in exchange AWS discounts the hourly rate by up to roughly 50% versus On-Demand. Nothing about the running domain changes; the discount is applied behind the scenes against any matching data-node hours you happen to be running.

The reason OpenSearch gets its own lesson is that it falls outside Savings Plans entirely. Compute Savings Plans and EC2 Instance Savings Plans cover EC2, Fargate, and Lambda — they do not cover OpenSearch, RDS, ElastiCache, or Redshift. For an Amazon OpenSearch Service domain, the Reserved Instance is the only commitment lever you have. If your search and log-analytics tier 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.

OpenSearch RIs come in just three payment shapes — No Upfront, Partial Upfront, and All Upfront — and unlike EC2 there are no convertible RIs for OpenSearch. Every OpenSearch RI is a standard RI scoped to an exact instance type and region, with no size flexibility: a reservation for an r6g.large.search covers only r6g.large.search data nodes, never an r6g.xlarge.search or a different family. That rigidity is the whole game. Commit to the right shape and it's free money; commit to a node type you outgrow and you've stranded a multi-year reservation paying for capacity no node consumes.

In this lesson you'll learn why OpenSearch sits outside Savings Plans and needs its own Reserved Instance strategy, how OpenSearch RIs are scoped (instance type and region, no size flexibility, standard only), and the sequence that protects you — right-size the node count and instance type, design the hot/UltraWarm/cold tier strategy, and decide whether OpenSearch Serverless fits a spiky workload, then commit. You'll see the AWS CLI calls that surface available offerings, that purchase against an offering, and that list what you already own, plus the trap that everyone forgets: the RI covers data-node hours only, not the EBS or UltraWarm storage that quietly dominates the bill as retention grows.

Fun fact

The reservation that couldn't follow the logs

OpenSearch Reserved Instances have no size flexibility whatsoever — a reservation for an r6g.large.search covers only that exact instance type, never the next size up and never a different family. A platform team committed three years to a fleet of x86 r5.2xlarge.search data nodes carrying their entire log estate. Eight months later they moved to Graviton r6g.2xlarge.search for the ~20% better price-performance and added UltraWarm to push old indices to cheaper storage, shrinking the hot tier. The new Graviton nodes ran On-Demand at full price while the old r5 reservation kept billing against nothing — they paid for both. The migration that was supposed to save money cost them double until the original reservation finally expired more than two years later.

Buying OpenSearch reservations in action

Lena runs the platform team at a B2B SaaS company. The FinOps dashboard shows $22k of monthly OpenSearch spend, almost entirely On-Demand, on a domain that's been ingesting application logs at a steady rate for over a year. The Compute Savings Plan the company bought last quarter covers their EKS nodes beautifully — and does nothing for the search cluster.

Before committing a dollar, Lena does the unglamorous work first. She right-sizes the hot tier from six r5.2xlarge.search nodes down to four after moving 90 days of older indices to UltraWarm and pushing anything past a year to cold storage. She confirms the remaining hot fleet is genuinely steady-state — these nodes will still be running this shape in a year — and rules out OpenSearch Serverless because the ingest is constant, not spiky. Only then does she look at offerings.

The pricing math is clear: an r6g.2xlarge.search runs roughly $1,000/month On-Demand, and a three-year Partial Upfront reservation drops the effective rate by around 48%, to roughly $520/month. Across the four-node hot baseline that's ~$1,900 a month saved. Lena buys to cover the four steady hot nodes, deliberately leaving headroom On-Demand so a future right-size doesn't strand a reservation, and notes that the EBS and UltraWarm storage stays On-Demand because no RI covers it. She sets a calendar reminder for month 30 to plan the renewal.

First, list the available Reserved Instance offerings for the data-node shape you've settled on. Each offering is one exact instance type in one region.

$ aws opensearch describe-reserved-instance-offerings --query 'ReservedInstanceOfferings[?InstanceType==`r6g.2xlarge.search` && PaymentOption==`PARTIAL_UPFRONT` && Duration==`94608000`].{Id:ReservedInstanceOfferingId,Type:InstanceType,Term:Duration,Fixed:FixedPrice,Hourly:UsagePrice,Pay:PaymentOption}' --output table
-------------------------------------------------------------------------------------------------
| DescribeReservedInstanceOfferings |
+--------------------------------------+--------------------+----------+--------+--------+--------+
| Id | Type | Term | Fixed | Hourly | Pay |
+--------------------------------------+--------------------+----------+--------+--------+--------+
| 1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d | r6g.2xlarge.search | 94608000 | 6480.0 | 0.182 | PARTIAL|
+--------------------------------------+--------------------+----------+--------+--------+--------+
# Term 94608000s = 3 years. This offering ID is one exact type in one region — no size flex.

Offerings are scoped to one exact instance type and region — that exact shape is what you're locking in for three years.

Buy against the chosen offering ID — this is the irreversible step — then list what you already own so you don't double-buy and can see what's expiring.

$ aws opensearch purchase-reserved-instance-offering --reserved-instance-offering-id 1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d --reservation-name os-ri-r6g-2xl-2026 --instance-count 4 && aws opensearch describe-reserved-instances --query 'ReservedInstances[?State==`active`].{Name:ReservationName,Type:InstanceType,Count:InstanceCount,Term:Duration,Start:StartTime,State:State}' --output table
{
"ReservedInstanceId": "f0e1d2c3-b4a5-6789-0abc-def012345678",
"ReservationName": "os-ri-r6g-2xl-2026"
}
-----------------------------------------------------------------------------------------------
| DescribeReservedInstances |
+----------------------+--------------------+-------+----------+----------------+------------+
| Name | Type | Count | Term | Start | State |
+----------------------+--------------------+-------+----------+----------------+------------+
| os-ri-r6g-2xl-2026 | r6g.2xlarge.search | 4 | 94608000 | 2026-05-26 | active |
| os-ri-r5-2xl-old | r5.2xlarge.search | 6 | 31536000 | 2025-09-01 | active |
+----------------------+--------------------+-------+----------+----------------+------------+
# os-ri-r5-2xl-old is the x86 shape you migrated off — stranded until it expires 2026-09-01.

Listing active reservations exposes both double-buy risk and the stranded r5 nodes nobody runs anymore.

OpenSearch reservations under the hooddeep dive

An OpenSearch Reserved Instance is matched against your running domains by just two attributes: AWS region and data-node instance type (for example r6g.2xlarge.search). Both must line up for the discount to apply to a given node-hour. There is no convertible RI for OpenSearch — every reservation is a standard RI — and, unlike EC2 and RDS, there is no size flexibility and no normalized-unit pooling. A reservation for r6g.large.search does not partially cover an r6g.xlarge.search, and it certainly doesn't cover a different family like r5 or m6g. The match is exact-type-or-nothing, which makes the instance-type decision the entire commitment.

Critically, the reservation covers data-node instance hours only. It does not cover the EBS volumes attached to your hot nodes, the UltraWarm node hours and their managed S3-backed storage, the cold-storage data sitting in S3, or any per-request and data-transfer charges. On a log-heavy domain the storage tier often grows faster than the compute tier as retention climbs, so a reservation can be doing exactly what it should on the data nodes while the total OpenSearch bill still rises — because the part the RI doesn't touch is the part that's growing. Track compute and storage as separate meters or the coverage number will mislead you.

This is exactly why right-sizing and tier design must come before the commitment. Decide the hot-node count and instance type, push older indices to UltraWarm and cold storage so the hot tier shrinks to its true steady-state, and rule on whether the workload is spiky enough that OpenSearch Serverless (which has no RIs — you pay per OCU) is the better fit. If you commit to a hot-tier shape and then move to Graviton, change node count after a tiering exercise, or migrate to Serverless, the reservation bills against thin air while the new capacity pays On-Demand — you pay twice until it expires. Sequence the architecture decisions first; buy the reservation against the shape you'll still be running in three years.

# Inspect available offerings for the exact type and region before buying, so you
# know the upfront and hourly figures across payment options.
aws opensearch describe-reserved-instance-offerings \
  --query 'ReservedInstanceOfferings[?InstanceType==`r6g.2xlarge.search` && Duration==`94608000`].{Id:ReservedInstanceOfferingId,Pay:PaymentOption,Fixed:FixedPrice,Hourly:UsagePrice}' \
  --output table

# Purchase against the chosen offering ID (this is the irreversible step).
aws opensearch purchase-reserved-instance-offering \
  --reserved-instance-offering-id 1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d \
  --reservation-name os-ri-r6g-2xl-2026 \
  --instance-count 4

# List what you already own so you don't double-buy and can spot stranded reservations.
aws opensearch describe-reserved-instances \
  --query 'ReservedInstances[?State==`active`].[ReservationName,InstanceType,InstanceCount,StartTime]' \
  --output table

What is the impact of leaving OpenSearch uncommitted?

The direct impact is paying full On-Demand rates on a stable, steadily growing cost category. An r6g.2xlarge.search data node runs roughly $1,000/month On-Demand; a three-year Partial Upfront reservation drops the effective rate by around 45–50%, to roughly $520/month. Across a four-node hot baseline that's ~$1,900 a month — over $20k a year — of discount that exists, is offered by AWS, and is simply not being claimed because no one owns the OpenSearch commitment decision. On larger log estates with dozens of nodes the uncollected figure runs into six figures annually.

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 OpenSearch sits entirely outside that program and is invisible on the Savings Plan dashboard. The result is a blind spot: a large, committable, stable cost running at sticker price while everyone congratulates themselves on compute coverage. OpenSearch coverage has to be tracked on its own meter or it disappears.

Then there's the stranding risk, which runs the opposite direction. Because OpenSearch RIs are standard-only, non-convertible, and have zero size flexibility, a premature or oversized commitment is unusually unforgiving. Commit before right-sizing and you lock in the oversized node count. Commit to x86 and then migrate to Graviton (r6g), shrink the hot tier after adding UltraWarm, or move a spiky workload to Serverless, and the reservation bills against nothing while the new capacity pays On-Demand — you pay twice for the remaining term. The discount and the trap are two sides of the same rigidity, and OpenSearch's lack of size flexibility makes the trap sharper than it is for RDS.

Finally, the reservation covers only data-node hours, so it's easy to misread success. A domain can be fully covered on compute while the EBS and UltraWarm storage attached to it keeps climbing with retention — meaning the total OpenSearch bill rises even as coverage looks perfect. Leaving OpenSearch uncommitted is also a maturity signal: an organisation that covers EC2 with Savings Plans but leaves OpenSearch, RDS, and ElastiCache uncommitted has a commitment program that stops at the easy, well-marketed instrument and doesn't reach the rest. The search cluster is usually among the most predictable spend in the estate — if it's uncommitted, the commitment strategy isn't finished, it's just started.

How do you commit to OpenSearch reservations safely?

Buying OpenSearch reservations is a four-step sequence, and the order is the whole point: right-size and tier the domain, decide whether Serverless fits, commit only to the stable hot baseline with the payment option chosen deliberately, and review coverage and utilisation every month.

1. Right-size the domain and design the tier strategy BEFORE you commit

Reservations lock in an exact instance type with no size flexibility, so fix the shape first. Right-size over-provisioned data nodes down, push older indices to UltraWarm and anything past your active-query window to cold storage so the hot tier shrinks to its true steady-state, and resolve any planned x86-to-Graviton (r5r6g) move. A reservation bought against a hot-node count you're about to shrink — or a family you're about to leave — is stranded waste for the full term, with no convertible escape hatch and no size flex to soak up the difference.

2. Decide whether OpenSearch Serverless fits the workload

Reserved Instances only make sense for steady-state, always-on domains. If the workload is spiky or intermittent — bursty ingest, periodic analytics, dev/test that idles — OpenSearch Serverless (priced per OCU, with no Reserved Instances at all) may be cheaper and is the wrong thing to reserve against. Make the provisioned-vs-Serverless call first; only commit RIs to the provisioned domains whose baseline you're confident will persist for the full term.

3. Commit to the stable hot baseline and choose the payment option as a cash decision

Look at the trailing 60–90 days of data-node hours and find the floor — the hot capacity that is always running. Commit to that steady baseline and leave headroom On-Demand so a future right-size doesn't strand a reservation. No Upfront, Partial Upfront, and All Upfront trade cash-now for discount-depth, and term length (1 vs 3 years) is the other lever — 3-year deepens the discount but extends the lock-in. Match term and payment to how confident you are the shape will persist and to the cost of capital. Remember the reservation covers node hours only; EBS and UltraWarm storage stays On-Demand.

4. Review coverage, utilisation, and storage on every FinOps cadence

Track three numbers monthly: coverage (share of OpenSearch node-hours covered by a reservation; target 80–95% on stable domains), utilisation (share of reserved capacity actually consumed; must stay near 100%), and storage cost (EBS + UltraWarm + cold, which no RI covers and which grows with retention). Watch expirations 60–90 days out so renewals are deliberate, not lapses. If utilisation drops, a migration, a tiering exercise, or a Serverless move has stranded a reservation — investigate before buying anything new.

# Compare offerings across payment options for the exact type you've settled on.
for opt in NO_UPFRONT PARTIAL_UPFRONT ALL_UPFRONT; do
  echo "== $opt =="
  aws opensearch describe-reserved-instance-offerings \
    --query "ReservedInstanceOfferings[?InstanceType=='r6g.2xlarge.search' && PaymentOption=='$opt' && Duration==\`94608000\`].{Fixed:FixedPrice,Hourly:UsagePrice}" \
    --output table
done

# List active reservations to confirm coverage and catch stranded shapes before buying more.
aws opensearch describe-reserved-instances \
  --query 'ReservedInstances[?State==`active`].[ReservationName,InstanceType,InstanceCount,StartTime]' \
  --output table

Quick quiz

Question 1 of 5

You have a stable log domain on x86 r5.2xlarge.search data nodes, fully On-Demand, and the team is planning both a Graviton migration to r6g.2xlarge.search and an UltraWarm rollout that will shrink the hot tier next quarter. What's the right move on OpenSearch reservations?

Keep learning

Dig deeper into OpenSearch reservation mechanics, data tiering, and how managed search fits the broader commitment strategy.

You've completed Purchase OpenSearch Reserved Instances. You now know why OpenSearch sits outside Savings Plans and needs its own commitment lever, how reservations are scoped by instance type and region with no size flexibility and no convertible option, that the RI covers data-node hours only and not EBS or UltraWarm storage, and the sequence that protects you — right-size and tier the domain first, decide on Serverless, commit to the stable hot baseline second. The next time the bill shows a large, uncommitted search cluster, you'll have a defensible path from On-Demand to a sound multi-year commitment without stranding a dollar.

Back to the library