AWS OpenSearch Serverless — When to Use It and When to Avoid It
AWS OpenSearch Serverless has gotten complicated with all the marketing noise flying around. The official docs give you a beautifully polished non-answer, and most blog posts just restate the feature list. As someone who has deployed both provisioned OpenSearch domains and serverless collections in production, I learned everything there is to know about where this product actually saves you money — and where it quietly destroys your AWS bill. Today, I will share it all with you.
The honest version: I migrated a log analytics pipeline to serverless and watched the monthly cost climb to nearly triple what we were paying on provisioned. That was painful. This article is the breakdown I wish had existed before I made that call.
OpenSearch Serverless in 60 Seconds
But what is OpenSearch Serverless? In essence, it’s AWS’s attempt to remove cluster management from the OpenSearch experience entirely. But it’s much more than that — it’s also a fundamentally different billing model that will reward some workloads and quietly punish others.
If you’ve used provisioned OpenSearch before — or Elasticsearch back before AWS rebranded everything — you know the routine. Pick an instance type, something like an r6g.large.search or m6g.xlarge.search. Configure your node count. Set shard counts. Then hope your capacity estimates still make sense in three months. You’re also managing upgrades, watching JVM heap pressure, and babysitting blue/green deployments on a Tuesday night when you’d rather be doing literally anything else.
Serverless throws all of that out. No nodes. No clusters. No instance types. You create a collection — AWS’s abstraction layer over whatever infrastructure is running underneath — and it auto-scales based on demand. Shards and replica counts aren’t your problem anymore.
Under the hood, everything runs on OpenSearch Compute Units, or OCUs. Two separate pools exist: one handles search (query execution), one handles indexing (ingestion). AWS manages allocation dynamically, scaling up during demand spikes and back down during quiet periods. The two pools scale independently — a heavy indexing workload won’t starve your search capacity. That’s actually a nice architectural detail worth appreciating.
Collections come in two flavors. Search collections handle full-text search use cases. Time series collections handle log analytics and observability workloads. Different underlying behavior in terms of storage and querying. You pick one at creation time and you cannot change it later — worth knowing before you build anything on top of it.
Security runs through data access policies, network policies, and encryption policies managed at the collection level rather than domain level. Cleaner model in some ways. Does require you to think about access control differently than you would on a provisioned domain, though.
When Serverless Saves You Money and Time
There are legitimate scenarios where serverless is the right call. Not hedging here — it genuinely wins in specific situations. That’s what makes it endearing to us infrastructure folks who usually distrust “serverless” as a marketing word. So, without further ado, let’s dive in.
Unpredictable or Spiky Workloads
If your search traffic looks like a flatline Monday through Thursday and then a mountain on Friday afternoon, provisioned clusters force an uncomfortable choice: over-provision (expensive) or under-provision (slow and potentially broken during your peak). Serverless just handles the spike. You pay for what you actually consume during that mountain and almost nothing during the flatline.
The classic example is an e-commerce site running weekly sale events. Or a media platform that gets walloped with traffic when a story goes viral at 11pm on a Wednesday. Standing up a provisioned cluster large enough to absorb that peak means you’re paying for that capacity on Tuesday at 3am when nobody is searching for anything at all.
Development and Staging Environments
Probably should have opened with this section, honestly. This is the single most common recommendation I’ve given to teams that actually resulted in a thank-you message later.
Frustrated by an oversized dev cluster burning money 24/7 for six months before anyone noticed, I started defaulting to serverless for every non-production environment. The economics work cleanly here. Dev environments run low, inconsistent traffic. With provisioned, you’re paying for idle compute around the clock. With serverless, idle periods cost dramatically less because you’re billed for active OCU time, not reserved capacity.
Stop running a three-node r6g.large.search cluster for a dev environment that processes 50 test queries a day. Don’t make my mistake.
Low-Traffic Internal Search
Internal tools — document search, employee directories, knowledge base search — tend to run low query volumes with no strict SLA requirements attached. Serverless handles these without any cluster management overhead, and costs stay reasonable given the low utilization. No one needs to own OpenSearch operations for an internal wiki search that gets 200 queries a day.
No Ops Capacity
Some teams simply don’t have anyone who wants to own cluster operations. Version upgrades, rolling restarts, monitoring node health — it’s not glamorous work. Serverless offloads all of it to AWS. If your team is small and search is secondary to your core product, that operational relief is a real value proposition — one worth paying a premium for, depending on your eng team’s hourly cost.
When Serverless Costs 3–5x More Than Provisioned
Here’s where I’ll say what the AWS documentation won’t.
The OCU Minimum Charge Problem
AWS charges a minimum of 2 OCUs for search capacity and 2 OCUs for indexing capacity per collection. Always. Even when your collection is completely idle. At current US East (N. Virginia) pricing, each OCU runs $0.24 per hour. That’s 4 OCUs minimum at $0.24 — $0.96 per hour just to exist. Roughly $691 per month per collection before you’ve indexed a single document or run a single query.
For a workload genuinely saturating those OCUs, that’s potentially fine. For a workload averaging 20% utilization, you’re paying for 80% of nothing. Every month.
Sustained High-Throughput Indexing
Log analytics pipelines pushing a consistent stream of data — CloudTrail logs, VPC flow logs, application logs from a mid-size production system — require sustained indexing OCU capacity. The auto-scaling works, but it scales to meet actual demand. And actual demand for these workloads is significant. A provisioned cluster with dedicated master nodes and data nodes properly sized for that throughput will almost always be cheaper at steady state than the equivalent serverless collection. I’m apparently wired to run the math on everything, and the math here is consistent across every scenario I’ve modeled.
Predictable Search Patterns
If your search traffic is flat and predictable — an internal analytics dashboard queried continuously during business hours, five days a week — the auto-scaling benefit disappears entirely. You’re not spiky. You’re just consistently busy. That’s exactly the scenario where reserved instances on a provisioned cluster save you 30–40% compared to on-demand provisioned pricing, which already beats serverless at sustained load.
Pricing Math — Serverless vs Provisioned Side by Side
Let me put actual numbers on this. All figures use US East (N. Virginia) pricing as of this writing.
Serverless OCU Pricing
Each OpenSearch Compute Unit costs $0.24 per OCU-hour for both search and indexing capacity. Storage is billed separately at $0.024 per GB-month for managed storage.
Minimum monthly cost with a single collection sitting at the floor: 4 OCUs × $0.24 × 730 hours = $700.80/month, plus storage.
A medium-traffic log analytics workload scaling to an average of 8 OCUs across search and indexing: 8 × $0.24 × 730 = $1,401.60/month, plus storage.
Equivalent Provisioned Cluster
A provisioned OpenSearch cluster sized for equivalent throughput — three r6g.large.search data nodes plus three r6g.medium.search dedicated master nodes — runs approximately:
- 3×
r6g.large.searchat $0.167/hour each = $0.501/hour - 3×
r6g.medium.searchat $0.074/hour each = $0.222/hour - Total: $0.723/hour × 730 hours = $527.79/month
Add EBS storage at $0.10/GB-month for 500GB across the cluster: $50/month. Total comes to roughly $578/month.
Switch to a 1-year reserved instance commitment and that provisioned cluster drops to approximately $370–390/month all-in. That was the number that made me wince when I finally ran it post-migration.
The Break-Even Calculation
Serverless wins when your workload uses less than roughly 60–70% of the minimum OCU allocation on average — OR when traffic spikes are severe enough that provisioning for peak means you’re paying for idle capacity most of the time. Pull out a spreadsheet, estimate your average OCU consumption based on indexing throughput and query rate, and run the math for your specific situation before committing to anything.
The exact break-even shifts depending on your data node instance type, EBS configuration, and reserved instance usage. But the directional conclusion holds across almost every scenario I’ve run: sustained, predictable, medium-to-high workloads are cheaper on provisioned. Full stop.
Storage Costs — A Hidden Variable
Serverless managed storage at $0.024/GB-month is actually cheaper per GB than EBS gp3 on provisioned clusters, which runs $0.10/GB-month. If you’re running a very storage-heavy workload with relatively light compute needs — large cold data archives, for example — serverless can look better on the storage line even when OCU costs are working against you. Model both sides before deciding.
Migration Considerations
If you’re evaluating a move between provisioned and serverless in either direction, the differences extend well beyond pricing and will shape your entire migration plan.
API Compatibility
Serverless exposes the standard OpenSearch REST API, so at the application layer most things translate cleanly. Queries, indexing operations, search templates — these work. The gaps appear at the administrative layer. You can’t call _cat/nodes, _cluster/health, or a range of other cluster-level APIs you might be using for monitoring or operational tooling. Scripts and dashboards relying on those endpoints need to be rewritten or removed before you cut over.
Index Mapping Differences
Serverless imposes constraints on index mappings that don’t exist on provisioned domains. Certain field types and mapping options behave differently or carry restrictions. Before migrating, run your index templates against a serverless collection in a dev environment — validate that mappings apply cleanly and that queries return expected results. Don’t assume compatibility. Test it explicitly. I’ve seen migrations stall for days on mapping issues that a two-hour dev test would have surfaced immediately.
Collection Limitations vs Domain Features
Provisioned OpenSearch domains support features serverless collections don’t — custom plugins, specific SQL query capabilities, anomaly detection configurations, certain security analytics features. ISM (Index State Management) policies behave differently in serverless environments. Cross-cluster search between a serverless collection and a provisioned domain isn’t currently supported the same way cross-cluster works between two provisioned domains.
The OpenSearch Dashboards experience also differs. Serverless collections have their own Dashboards endpoint, but administrative panels and developer tools that assume cluster-level visibility are absent or stripped down. Teams that rely on those panels heavily tend to notice immediately after cutover.
Data Migration Path
Moving data from a provisioned domain to a serverless collection — or the reverse — requires a reindex operation. Snapshot restore between the two deployment types isn’t directly supported. For large datasets, that reindex takes significant time and will consume OCU capacity if you’re indexing into serverless. Budget for that cost explicitly in your migration plan.
One approach that worked well on a pipeline migration I ran: stand up the serverless collection first, replay a few days of historical data to validate behavior, then cut over the live ingestion pipeline while backfilling the remainder in parallel. The provisioned domain stayed running in read-only mode during the transition — downstream consumers kept working, nothing broke, and we had a clean rollback option the whole time. That approach added about four days to the migration window but removed most of the risk.
The core question with serverless vs provisioned OpenSearch isn’t which one is better in the abstract. It’s whether your specific workload profile matches the economic model of serverless billing. Run the cost math honestly, test the API surface area thoroughly for anything non-standard in your implementation, and don’t let the appeal of “no cluster management” override a clear financial signal pointing the other way.
Stay in the loop
Get the latest team aws updates delivered to your inbox.