io2 vs gp3: you are paying 6.7x for durability, not IOPS
One terabyte at 10,000 provisioned IOPS costs $115 a month on gp3 and $775 on io2. Same capacity, same provisioned IOPS, 6.7 times the bill.
The extra $660 buys the guarantee attached to those numbers. You provision 10,000 IOPS (read and write operations per second) on both volumes, and both charge you for the bytes. io2 is rated for 99.999% durability, the odds your data survives a year, and delivers its provisioned IOPS 99.9% of the time. gp3 is rated for 99.8% to 99.9% durability and is designed to deliver provisioned performance 99% of the time. The $660 is the premium on that promise.
That is a legitimate product. It’s also one that most volumes will never use. A volume that never misses its gp3 IOPS target is paying for insurance against a failure it will not see.
gp3 is the cheapest volume that can do 10,000 IOPS at 1 TB
Here is the same 1 TB, 10,000 IOPS profile priced across every current volume type, in us-east-1:
| Type | Storage $/GB‑mo | IOPS price | 1 TB at 10,000 IOPS | Max IOPS/volume |
|---|---|---|---|---|
| gp3 | $0.0800 | $0.005 above 3,000 | $115.00 | 80,000 |
| io2 | $0.1250 | $0.065, tiered | $775.00 | 256,000 |
| io1 | $0.1250 | $0.065 | $775.00 | 64,000 |
| gp2 | $0.1000 | included, 3 per GB | $333.40 at 3,334 GB | 16,000 |
| st1 | $0.0450 | included | $45.00, max 500 IOPS | 500 |
| sc1 | $0.0150 | included | $15.00, max 250 IOPS | 250 |
gp2 cannot reach 10,000 IOPS at 1 TB. Its baseline is 3 IOPS per GB, so the row shows the 3,334 GB the volume would need to provision 10,000 IOPS at all, and its 16,000-IOPS ceiling requires 5,334 GB ($533.40). st1 and sc1 are HDD volumes that top out at 500 and 250 IOPS; their rows price the capacity, not the profile.
The table prices storage plus separately billed IOPS; gp2, st1, and sc1 include performance in the storage rate. gp3 also bills throughput above 125 MiB/s at $40.96 per GiB/s-month (the CSV’s GiBps-mo unit), which is $0.04 per MiB/s-month. At 8 KiB random I/O, 10,000 IOPS needs 78 MiB/s, so the baseline covers it.
The two formulas behind the table:
gp3 = 0.080 * GB + max(0, IOPS - 3,000) * 0.005
io2 = 0.125 * GB
+ 0.065 * min(IOPS, 32,000)
+ 0.0455 * max(0, min(IOPS, 64,000) - 32,000)
+ 0.03185 * max(0, IOPS - 64,000)
93% of the $660 is the IOPS line
Split the difference at 1 TB and 10,000 IOPS:
- Storage: 1,000 GB × ($0.125 − $0.080) = $45.00
- IOPS: 10,000 × $0.065 − 7,000 × $0.005 = $650 − $35 = $615.00
- Total: $660.00 a month, $7,920 a year
Both volumes provision the same 10,000 IOPS, and nearly all of the gap still lands on that line. The io2 IOPS rate is 13 times gp3’s marginal rate for the same 10,000 operations. Our read is that the rate carries the delivery guarantee, since nothing else about the operation differs.
io2’s volume discounts never get close to gp3
Only io2 has volume-level tiering (the IOPS rate falls as a single volume provisions more). The boundaries are 32,000 and 64,000 provisioned IOPS per volume, per AWS’s price list; our dataset carries the three rates ($0.0650, $0.0455, $0.03185) but no ranges. The tiers apply progressively, with only the IOPS above each threshold billed at the lower rate.
At 1 TB, the bill at each step:
| Provisioned IOPS | gp3 | io2 | io2 / gp3 |
|---|---|---|---|
| 3,000 | $80.00 | $320.00 | 4.0x |
| 10,000 | $115.00 | $775.00 | 6.7x |
| 16,000 | $145.00 | $1,165.00 | 8.0x |
| 32,000 | $225.00 | $2,205.00 | 9.8x |
| 48,000 | $305.00 | $2,933.00 | 9.6x |
| 64,000 | $385.00 | $3,661.00 | 9.5x |
| 80,000 | $465.00 | $4,170.60 | 9.0x |
| 256,000 | not available | $9,776.20 | — |
Tiering starts to bite at 32,000 IOPS. The blended io2 rate falls from $0.065 to $0.05525 at 64,000 and $0.0377 at 256,000, so the ratio peaks around 9.8x and drifts down. The dollar gap does not: $1,980 at 32,000 IOPS, $3,276 at 64,000, $3,706 at 80,000.
The lowest marginal rate io2 ever charges is $0.03185, which is 6.37 times gp3’s $0.005. io2’s storage is $0.125 against gp3’s $0.080, a 1.56x multiple. Both line items are strictly more expensive per unit, so no combination of capacity and provisioned IOPS makes io2 cheaper than gp3. The smallest multiple at 1 TB is 4x, at 3,000 IOPS: $320 against $80.
The tier is also applied per volume, not per account or fleet. Eight 1 TB volumes at 10,000 IOPS each cost 8 × $775 = $6,200 a month and pay tier-1 rates on all 80,000 IOPS, because no single volume crosses 32,000. Consolidating onto one 8 TB volume at 80,000 IOPS costs $1,000 + $4,045.60 = $5,045.60, a saving of $1,154.40 that comes purely from the tier. The same consolidation on gp3 raises its bill from $920 to $1,025, because each separate volume collects its own 3,000 free IOPS. The pricing shapes point in opposite directions, and io2 loses either way.
What io2 adds is a narrower tail, not more capacity
Here is what the guarantee covers. These are AWS’s published specifications, not dataset rows:
| gp3 | io2 (Block Express) | |
|---|---|---|
| Annual durability | 99.8% to 99.9% | 99.999% |
| Annual failure rate | 0.1% to 0.2% | 0.001% |
| Provisioned performance delivery | 99% of the time | 99.9% of the time |
| Average latency, 16 KiB I/O | single-digit milliseconds | under 500 microseconds |
| Max IOPS per volume | 80,000 | 256,000 |
| Max throughput per volume | 2,000 MiB/s | 4,000 MiB/s |
| Max volume size | 64 TiB | 64 TiB |
| Multi-Attach | no | yes, 16 Nitro instances in one AZ |
io2 does not buy a larger maximum volume; both cap at 64 TiB. And its 256,000-IOPS ceiling requires Nitro instances: other instance types can provision 64,000 IOPS but achieve at most 32,000. Since April 30, 2025, every io2 volume is a Block Express volume, so the five-nines durability and sub-500-microsecond latency apply to the volume you create today, not to an opt-in tier.
What io2 adds over gp3 is a narrower tail: a lower annual failure rate, a tighter delivery percentage, lower latency, and a volume that up to 16 instances can attach at once for clustered file systems. gp3 now provisions up to 80,000 IOPS and 2,000 MiB/s per volume on Nitro instances, so the old argument that io2 is the only way past 16,000 IOPS no longer holds. Above 80,000 IOPS io2 is the only single-volume option, and the comparison stops being about price.
The insurance breaks even at about $4M of data per terabyte
The whole premium at 1 TB and 10,000 IOPS is $7,920 a year. Set that against the risk it removes. At gp3’s worse durability figure, the annual failure probability drops by 0.199 percentage points. In plain terms, the question is how much a lost terabyte would have to be worth before the premium is a fair price for the lower failure rate. Divide the premium by the reduction and you get the answer:
break-even data value = premium / risk reduction
= $7,920 / 0.00199 = $3.98M per TB
At gp3’s better figure (0.1% AFR), the same premium implies $8.0M per TB. This charges the whole premium to durability and gives no credit for the latency or delivery guarantees, so it is the strict version of the test. On a terabyte worth $1M, the expected annual loss avoided is $990 to $1,990, or 12% to 25% of the bill. That arithmetic ignores risk tolerance and the tail: a single failure that ends a business is not priced correctly by an average. If that is the exposure, io2 is a rational purchase regardless of the expected value.
Two practical checks come before the durability rating. Snapshot storage costs $0.05/GB-month in our data, so one full 1 TB copy runs $50 a month and protects against deletion, corruption, and operator error, failure modes durability does not cover. And the performance guarantee only matters if you have measured gp3 missing it. CloudWatch VolumeQueueLength and VolumeThroughputPercentage on the volume, plus the instance’s EBS bandwidth ceiling, will tell you whether the queue is backing up. If the 99th-percentile (p99) latency is fine, the 99.9% line is an invoice for a problem you do not have.
io1: io2 prices, gp3 durability
io1 and io2 carry identical storage and IOPS rates in all 36 regions where both are priced. In us-east-1 that is $0.125 per GB-month and $0.065 per IOPS-month; the regional pairs move together. io1 does not have io2’s durability. AWS rates io1 at 99.8% to 99.9% annual durability with an annual failure rate up to 0.2%, the same class as gp3 and gp2.
So io1 is the older Provisioned IOPS product sold at io2 prices. Its remaining technical differences are a 64,000-IOPS ceiling and a 50 IOPS per GiB ratio, both below io2’s. It still supports Multi-Attach, as does io2. If a Terraform module, AMI, or RDS storage setting still creates io1, that system is paying io2 prices for gp3 durability.
gp2 is still 25% more
gp2 at $0.10/GB-month costs 25% more than gp3 at $0.08. For that premium you get IOPS tied to volume size, a 16,000-IOPS ceiling that needs 5,334 GB, and burst credits that run out under sustained load. The migration is online and the arithmetic is in the gp2 to gp3 post. It belongs here only because it sets the floor for the comparison: the cheapest way to buy this profile is $115, not $775, and the gap to gp2 is a separate, older problem.
What to buy
- Boot volumes: gp3. A 100 GB root disk costs $8 a month with 3,000 IOPS and 125 MiB/s. The same size on io2 at 3,000 IOPS costs $207.50, 26x more for a volume that serves an OS and a package manager.
- Log and streaming volumes: st1 at $0.045/GB when the access is sequential, with a 500 MiB/s ceiling and a 125 GiB minimum size. sc1 at $0.015/GB for cold data. Neither can be a boot volume. gp3 if the writes are small and random. io2 has no role here.
- Databases: gp3 until you can show it falling short. At 1 TB and 20,000 IOPS, gp3 costs $165 and io2 costs $1,425, an 8.6x premium for a guarantee your measured p99 may not need. The cases that justify io2 are a single volume above 80,000 IOPS or 2,000 MiB/s, a verified latency SLO miss on gp3, Multi-Attach with a clustered file system, or a contractual durability requirement that snapshots cannot satisfy.
- Anything with a replica or a restore path: gp3. If the data exists on a replica or in snapshots, the volume’s durability is not the thing standing between you and loss.
The multiple is not constant across geography. At 1 TB and 10,000 IOPS the io2-to-gp3 ratio runs from 5.25x in sa-east-1 to 6.86x in eu-central-2, because the io2 IOPS rate is 9.6 to 13.4 times gp3’s depending on region. The direction does not change. Check the block storage hub for your region before quoting a number, and the volume-type guide for the full decision tree.
The quickest audit is a list of every io1 and io2 volume with more than 4,000 provisioned IOPS, next to the 99th percentile of IOPS consumed:
aws ec2 describe-volumes \
--filters Name=volume-type,Values=io1,io2 \
--query "Volumes[*].{id:VolumeId,type:VolumeType,size:Size,iops:Iops}" \
--output table
A volume provisioned at 20,000 IOPS that never sustains 5,000 is paying for a guarantee it never exercises. On io2 at 1 TB, dropping from 20,000 to 5,000 IOPS takes the bill from $1,425 to $450. That is the same volume, the same data, and a much smaller insurance policy.