The RDS premium: what managed MySQL costs over the box it runs on
AWS sells the same hardware twice. db.m5.xlarge runs MySQL on 4 vCPUs and 16 GiB for $0.342 an hour. m5.xlarge is the same 4 vCPUs and 16 GiB on EC2 for $0.192. Same Nitro generation, one hypervisor tick up the stack, a 78% markup.
That gap pays for a wrapper: automated backups, failover, patching, and no shell. Some of it is money well spent. Some you can replace with an afternoon of Terraform. And in three places the sticker math flips: Multi-AZ, the engine choice, and provisioned IOPS. Everything below is us-east-1, priced from our dataset.
The managed fee is 78% on compute and 44% on storage
The closest apples-to-apples pairing is 4 vCPU, 16 GiB, 500 GB of gp3, and the cheapest license model (“No license required”, which is what MySQL costs):
| Component | Self‑managed EC2 | RDS MySQL |
|---|---|---|
| Compute | $0.192/hr = $140.16/mo | $0.342/hr = $249.66/mo |
| 500 GB storage | EBS gp3: $40.00/mo | RDS gp3: $57.50/mo |
| Total | $180.16/mo | $307.16/mo |
That is $127 a month more, a 70% premium on the whole stack. Compute is the flat 78% we opened with. Storage adds its own 44% because RDS gp3 lists at $0.115/GB-month against EBS gp3’s $0.08.
One oddity in the data: RDS charges $0.115 for gp2 and gp3 alike. On EBS, gp3 was the 20%-off migration story. On RDS the newer generation arrived at the old price, so there is no gp2-to-gp3 win waiting in your database bill.
The ratio holds up the size ladder. db.m5.24xlarge runs $8.208/hour against m5.24xlarge’s $4.608, the same markup to the decimal. The fee scales with the box.
What the $127 buys
- Point-in-time recovery to any second in the retention window, up to 35 days, with backups shipped to S3. On EC2 that is a snapshot schedule, binlog shipping, and a restore runbook you rehearse.
- Multi-AZ failover, covered next. This is the big one.
- Patching on a maintenance window, applied to a fleet without logging into anything.
- About 50 CloudWatch metrics included. On EC2 you pay for an agent or for detailed monitoring.
- No shell. No superuser, no arbitrary extensions, no colocating Redis on the same box, a 64 TiB storage ceiling, and performance that rides on AWS’s virtualization layer instead of your kernel tuning.
That last bullet is the honest debit side. If your database is small enough to be one of several things on a $140 box, RDS’s model costs you the box, not just the fee.
Multi-AZ doubles the bill and is still the fair one
RDS Multi-AZ doubles everything: db.m5.xlarge goes to $0.684/hour and storage to $0.23/GB-month. The 500 GB example runs $614.32/month.
Build the equivalent on EC2: two m5.xlarge instances, two gp3 volumes, MySQL replication between them.
| Component | RDS Multi‑AZ | Self‑managed pair |
|---|---|---|
| Compute | $499.32/mo | 2 x $140.16 = $280.32/mo |
| Storage | $115.00/mo | 2 x $40.00 = $80.00/mo |
| Replication traffic | included | $0.02/GB cross-AZ |
| Total | $614.32/mo | $360.32/mo + traffic |
Self-managed wins on paper by $254 a month. The break-even is replication volume: at $0.02/GB ($0.01 out of the primary, $0.01 into the standby, the same inter-AZ meter behind our cross-AZ transfer post), you would need about 12,700 GB a month, or 420 GB a day of replicated binlog, before doing HA yourself costs the same. Few databases write that much.
Traffic is the wrong way to score it. Async replication, the default you would run, loses the last few seconds of committed transactions when a primary dies mid-write. Matching RDS’s failover means a synchronous standby, a 60-120 second cutover, no committed-transaction loss, and either semi-synchronous replication with its write latency or a quorum system with a failover mechanism you wrote. For production OLTP, $254 over two vanilla instances is defensible. For the single-node case there is no such defense: you pay the same fee for a standby you do not have.
The engine costs more than the management
Every price above is MySQL or MariaDB, the cheapest engines on RDS. The managed markup is the same across all of them, so the license is what moves the number. Same db.m5.xlarge, Single-AZ:
| Engine | $/hour | vs MySQL | License rent per month |
|---|---|---|---|
| MySQL / MariaDB | $0.342 | baseline | none |
| PostgreSQL | $0.356 | +4% | none |
| SQL Server Web | $0.54 | +58% | $144.54 |
| Oracle Standard Two (license included) | $0.876 | +156% | $389.82 |
| SQL Server Standard (license included) | $1.224 | +258% | $643.86 |
| SQL Server Enterprise (license included) | $2.336 | +583% | $1,455.62 |
SQL Server Enterprise costs 6.8x what MySQL costs on identical hardware, and $1,455 a month of that is license rent on a box AWS manages for a $115 compute markup. Same dynamic as the Windows tax on EC2, with database licensing stacked on top.
Two escape hatches exist. Bring-your-own-license rows drop Oracle back to $0.342-$0.41 on this instance, which tells you exactly how much of the Oracle sticker is the license rather than the management. And license-included has real value at low utilization: it turns a per-core license audit into a flat hourly rate. But if a workload can run on Postgres, the engine choice alone is worth more than everything else in this post combined.
Provisioned performance is where the markup hides
RDS charges more for every performance unit it provisions, and the multipliers are not the ones you would guess from the storage price:
| Performance unit | EBS gp3 | RDS gp3 | Markup |
|---|---|---|---|
| Additional IOPS | $0.005/IOPS-mo | $0.02/IOPS-mo | 4x |
| Additional throughput | $0.04/MBps-mo | $0.08/MBps-mo | 2x |
| io1/io2 provisioned IOPS | $0.065/IOPS-mo | $0.10/IOPS-mo | +54% |
Rerun the baseline with a heavy profile: 500 GB provisioned to 16,000 IOPS and 1,000 MB/s, both ceilings for gp3, and both with the same 3,000 IOPS / 125 MB/s included baseline on each side. Self-managed costs $140.00 of EBS on top of the instance, $280.16 all in. RDS costs $387.50 of storage charges on top of the instance, $637.16 all in. The stack premium grows from 70% to 128%, and four-fifths of the growth is the 4x IOPS fee. If your workload is IOPS-bound, the managed fee is the smaller of your two RDS problems.
Aurora breaks the pattern for exactly these workloads: $0.10/GB-month for storage with no per-IOPS charge.
Percentages versus dollars
The premium percentage is largest at the bottom of the size range. db.t4g.micro runs MySQL at $0.016/hour against t4g.micro’s $0.0084, a 90% markup on a difference of $5.55 a month. Nobody rearchitects a stack to save $5.55, and the automation is worth more than that at 3 a.m. At db.m5.24xlarge the same 78% is $2,628 a month, which funds a part-time DBA who can also fix your queries.
Graviton does not rescue the ratio. m7g.xlarge costs 15% less than m5.xlarge on EC2, but db.m7g.xlarge at $0.337 is only 1.5% under db.m5.xlarge. AWS keeps most of its own silicon’s discount when it sells you the managed wrapper.
What to do
Pay the 78% without regret when the alternative is asynchronous self-managed HA pretending to be durable, and skip it for single-node databases where $127 a month buys patching you would do anyway. Price the engine before the instance: a license-included Oracle or SQL Server choice can dwarf everything else on the bill. And if the workload is IOPS-bound, price the IOPS first, because at 4x per provisioned unit that is where the RDS premium actually lives.
Both sides of the pairing are in the databases section if you want to rerun the math on your own size and region.