RDS Extended Support: how to lower the bill while you wait for the upgrade
RDS Extended Support charges per vCPU per hour and stacks on every replica and standby. Here's how to lower the bill while the upgrade is still on your roadmap.

Nishant Thorat
Founder

Almost every team I talk to with an aging RDS cluster on Extended Support has the same story: the upgrade is on the roadmap, blocked by application work, and AWS is charging a per-vCPU surcharge that compounds while they wait. Most of those teams either don't know about the levers that work without the upgrade, or assume they have already been pulled. They usually haven't. Here is what the bill actually looks like, and what you can do about it before the upgrade lands.
What you are paying for, exactly
The fee itself is straightforward on paper. For RDS for MySQL and PostgreSQL on provisioned instances, AWS charges $0.10 per vCPU per hour during years one and two of Extended Support, and that doubles to $0.20 per vCPU per hour in year three. For Aurora Serverless v2, it is priced per Aurora Capacity Unit per hour at $0.085 in years one and two and $0.17 in year three (us-east-1 and us-east-2; rates vary slightly by region). It is an additive surcharge on top of your normal instance cost, billed for every hour the cluster is running, and it shows up as its own line item in your Cost and Usage Report under something like Region-ExtendedSupport:Yr1-Yr2:PostgreSQL12.
If you are on MySQL 5.7 or PostgreSQL 11, you have been getting hit at the year 1-2 rate since 2024, and as of March 1 2026, both versions rolled into year 3 pricing, which means the surcharge on those clusters doubled overnight. PostgreSQL 12 entered year 1 pricing in March 2025, so customers running that version are currently in the year 1-2 band. PostgreSQL 13 joined the year 1 band on March 1, 2026, so if you are running 13 the surcharge has been on your bill for the last two months and most teams have not noticed yet. After three years on Extended Support, the version is automatically force-upgraded.
The multiplier most teams underestimate
Here is where almost every team I talk to underestimates the size of the bill, including teams that already know about Extended Support and have factored it in.
The per-vCPU charge applies to every running database instance in the cluster. Not just the primary. That means the Multi-AZ standby is charged for its full vCPU count, every read replica is charged for its full vCPU count, and they all stack on the same Extended Support line in your CUR.
Take a fairly ordinary production setup. A 16 vCPU primary, one read replica at the same instance class, and Multi-AZ enabled. The instance count from the team's mental model is one. The vCPU count being billed on Extended Support is 48, because all three running instances carry the charge independently. At the year 1-2 rate, that is roughly $3,500 a month in surcharge alone, before any compute, before storage, before backups. At the year 3 rate, it is $7,000. None of it discounted by any commitment you might have signed.
What about RIs and Database Savings Plans?
Neither covers Extended Support. The surcharge is a separate CUR line billed independently of any commitment you have signed. RIs lock in compute, not the surcharge. Database Savings Plans, which AWS launched in December 2025, apply to instance usage in the same way and leave the surcharge at full rate.
There is also a quieter catch with DBSP that hurts Extended Support customers specifically. The plan covers eligible RDS usage on whatever instance you run, but the deepest combined savings come from running Graviton3 instances (M7g, R7g), which stack hardware price-performance gains on top of the DBSP discount. Graviton3 RDS classes require MySQL 8.0.28 or higher and PostgreSQL 13.4 or higher. If you are on Extended Support, your engine version is by definition too old for Graviton3, which means the most valuable form of DBSP coverage is locked behind exactly the upgrade you are trying to delay.
The levers that work without the upgrade
OK, so the bill is bigger than the version-upgrade timeline. What can actually be pulled while the upgrade is still on the roadmap? These are in rough order of impact-to-effort, but every cluster is different and the order of operations depends on your topology.
Right-size the cluster, but honestly

The instinct here is to look at CPU on the primary and call it a day. CPU alone is a bad signal. The right diagnostic is sustained peak across four dimensions: CPU, memory pressure (freeable memory and buffer cache hit ratio together), IOPS utilization, and connection count against max_connections. If all four sit comfortably below the instance ceiling over a full month, including the edge cases that do not show up at the P99 mark but do show up at month-end batch, backup windows, schema migrations, and any quarterly reporting workload, there is room. If any one of them is touching the ceiling, leave the primary alone.
The replicas are usually where this lever has more give. A read replica sized at the same class as the primary, serving a subset of read queries, with no failover responsibility, does not need to match the primary's compute. The catch is two-fold. Replication apply is single-threaded on PostgreSQL standbys and constrained on MySQL replicas even with multi-threaded replication enabled, so an undersized replica can fall behind on write-heavy workloads, and that lag becomes its own problem. And if the replica is a failover target, you need to size it for full primary write absorption on takeover, otherwise you are quietly breaking your HA plan until the day you actually need it.
Dev and test environments are usually the opposite story, and the assumption that they are overprovisioned and ready for a right-size is mostly wrong. Engineering tends to keep these small from the start because the budget conversation makes them small. Where the non-prod waste actually compounds is not the instance class. It is Multi-AZ, which is the next lever.
A note for teams holding RDS Reserved Instances. For the size-flexible engines (MySQL, MariaDB, PostgreSQL, Aurora, and Oracle BYOL), the RI discount applies across instance sizes within the same family and across both Single-AZ and Multi-AZ deployments. Dropping from db.r5.2xlarge to db.r5.xlarge keeps the RI's normalization units in use on the smaller footprint, and turning Multi-AZ off in non-prod does not strand the reservation either. The exception is SQL Server, which has no size flexibility and locks the RI to one specific instance size (a tradeoff we unpacked in the SQL Server BYOL decision guide). For the engines most likely to be on Extended Support, the lever and the commitment co-exist cleanly.
Audit Multi-AZ in non-production
Multi-AZ left on in non-prod environments is, in my experience, the single most common waste pattern in production-grade RDS estates. Someone enables it once for an environment that briefly mattered, the project moves on, and it never gets turned off. Each standby is being charged for its full vCPU count on Extended Support, plus the doubled compute, plus the doubled storage. For a dev cluster that exists so a few engineers can run integration tests, this is pure leak. The fix is one console click.
Storage type, gp2 to gp3
If the cluster is still on gp2, gp3 is a one-step migration that runs as an online modification on RDS with no real downtime, and lands roughly a 20 percent storage cost reduction at the same or better IOPS profile, depending on how you provision the gp3 baseline. It does not compound with Extended Support since the storage line is not per vCPU, but money is money, and this is one of the cleanest, lowest-risk savings moves still available in RDS today. There is no reason a production cluster should be on gp2 in 2026 unless someone has a very specific reason and has written it down.
io1 to gp3 is a different conversation. It can save real money, but the IOPS sizing has to be done properly, and on high-write workloads gp3 with under-provisioned IOPS can underperform io1 in ways that are hard to diagnose after the fact. I would not lump the two migrations together.
Storage allocation that grew but never shrank
RDS will autoscale your storage allocation up during a burst, but it does not shrink back down on its own. Ever. If you hit 4 TB three months ago during a backfill or an unusually large import, and you have been sitting at 1.5 TB ever since, you are still being billed for 4 TB. Every month. The only way back down is a Blue/Green Deployment or a dump-and-restore migration to a smaller volume, which is real work, but for a cluster with significant allocation slack it usually pays for itself within a quarter. This one shows up in the data when you actually look at provisioned versus used storage over time, and almost never shows up when you do not.
Snapshot retention review
Backup storage above your free allocation, which equals your provisioned database storage, is billed separately. Teams set up a 35-day automated backup retention years ago and have not revisited it. For a cluster with frequent schema changes and large tables, that is a lot of snapshot storage paying for itself in compliance theater rather than recovery utility. Most production workloads do not actually need 35 days of point-in-time recovery, but they keep it because nobody questioned the default. Worth a five-minute conversation with whoever owns the disaster recovery policy. If the conversation gets serious, we covered six ways to cut backup cost without touching the cold tier separately.
Extended Support is a tax on time
The frame I find useful here is that Extended Support is a tax on time. You are paying AWS for the right to keep running an older engine version while you finish the work to move off it. For legitimate reasons, the upgrade cannot land today. The tax does not go away while you are paying it.
The levers in this post do not require the upgrade to land. They are database-side configuration changes the platform team can execute without involving the application team and without a release window. Every one of them reduces what you pay AWS today, and every one of them translates directly into a smaller cluster the day you finally land the upgrade. It is not throwaway work. It is the work you would do anyway, done now, when leaving it undone is most expensive. (If you also run on Azure, the same dynamic exists in a quieter, more dangerous form, which we covered separately.)
If the cluster you are looking at right now is on Extended Support and the bill has been quietly growing while the upgrade has been quietly slipping, the worst move is to keep waiting for the version change before you start optimizing. The version change might still be six months out. The surcharge is being billed by the hour.
Pull what you can pull today. The upgrade will land when it lands.
See your RDS Extended Support exposure in five minutes. CloudYali stitches your RDS utilization, CUR line items, and instance configuration into a single view so the levers in this post become a list you can sort by dollars, not a half-day spreadsheet project. Book a 20-minute cost audit.
Frequently Asked Questions
Related Articles

Claude Platform on AWS vs Bedrock: A FinOps Reality Check on the Single-Bill Promise
Claude Platform on AWS gives AWS-heavy enterprises a single AWS Marketplace invoice for Anthropic Claude usage, billed in Claude Consumption Units (CCUs). Per-token cost is identical to Bedrock and...
Azure's extended support "penalty" is quieter than AWS — and that's what makes it dangerous
AWS charges you the moment your RDS instance or EKS cluster slips into extended support. It shows up on your bill. You see it. You react.

SQL Server on AWS: A Practical BYOL Decision Guide
BYOL vs License Included for SQL Server on AWS — a decision tree, real cost math, and the caveats that change everything.