Understanding S3 Costs: What Determines Your AWS Storage Bill
S3 costs are known for being simple. A couple cents per gigabyte, a couple storage classes to choose from, and you’re done. That reputation lasts until the first monthly invoice arrives that is two or three times higher than expected, and no one on the team can explain why right away.
Thank you for reading this post, don't forget to subscribe!The truth is, AWS storage billing is simultaneously a multi-dimensional affair. One is storage. Requests, data retrieval, egress, lifecycle transitions and replication all pile up on top of each other, at the same time. Understanding each dimension is the difference between a predictable storage budget and a monthly bill that you didn’t expect.
This guide explains every component that makes up your AWS storage bill, where teams most commonly overspend, and actionable steps to take control.
The 6 Dimensions That Constitute S3 Costs
It helps to know that your bill is not a single number before looking at individual line items. AWS bills six independent dimensions each billing cycle:
Storage — the monthly rate per GB of storage for the storage class assigned to your objects.
Requests – There is a per-request charge for each API call to S3, whether it’s a PUT to upload a file, a GET to read a file, or a LIST of a bucket.
Retrievals — Some storage classes will charge a fee per GB for every time you read data back out of them. This is on top of the fee for the request.
Data Transfer Out (egress) – You are charged per GB when data is transferred out of S3 to the internet, another AWS Region, or services outside of your VPC.
Management features — such as S3 Storage Lens, S3 Inventory, and lifecycle transition rules – all add smaller but real costs.
Replication — cross-region or same-region replication doubles your storage footprint and adds transfer fees on top.
Most teams that are accurately tracking the storage line are ignoring the other five dimensions, and that’s where overages hide. Storage accounts for 25–40% of the overall AWS bill for data-heavy organizations, but requests and egress are where they are consistently surprised.
Storage Class: The Most Impactful Choice for S3 Costs
The storage class you assign to an object is the biggest variable in your S3 costs. That same byte of data can cost anywhere from $0.00099 per GB per month in S3 Glacier Deep Archive to $0.023 per GB per month in S3 Standard — a 23x spread between the cheapest and most expensive options.
Here’s how the main classes compare:
S3 Standard
The default is S3 Standard at $0.023 per GB for frequent access data. There are no retrieval fees and no minimum storage term. The right choice for active application data, content delivery and data lakes with frequent read traffic.
S3 Standard-IA (Infrequent Access)
S3 Standard-IA (Infrequent Access) costs $0.0125/GB, or about 46% less than Standard, but has a $0.01/GB retrieval fee and a minimum 30-day storage period. If you store something for 10 days and delete it, you still pay for 30. Standard-IA can actually be more expensive than Standard for workloads with high object churn.
S3 Intelligent-Tiering
S3 Intelligent-Tiering automatically moves objects between access tiers based on how often they are accessed. Standard (hot data) $0.023/GB Objects that transition to the Deep Archive Access tier fall to $0.00099 per GB. There is a $0.0025 monthly monitoring fee per 1,000 objects, but no retrieval charges, so it’s a good choice for unpredictable access patterns.
S3 Glacier Instant Retrieval
S3 Glacier Instant Retrieval costs $0.004 per GB with millisecond access, but charges $0.03 per GB when you retrieve data. The same goes for the minimum storage period of 90 days.
S3 Glacier Deep Archive
S3 Glacier Deep Archive is the cheapest option in S3, at $0.00099 per GB. Retrieval Time: Up to 12 hours Cost: $0.02/GB It’s for information that you want to keep for a long time but never actually access regulatory archives, compliance records, old backup sets.
The number one way to blow up your bill is to choose the wrong storage class. If your data is accessed less than once a month, Standard-IA reduces your storage bill by 46%. If access is rare, glacier classes can reduce access by 80–95%.
Request Fees: The S3 Costs That Grow With Traffic
Request charges are usage based, which means they’re easy to ignore at low volumes, and impossible to ignore at scale.
PUT, COPY, POST and LIST requests are around $0.005 per 1,000.
GET and all other retrieval requests are about $0.0004 per 1,000.
For Infrequent Access and Glacier classes, these rates are multiplied by two to ten times.
At a small scale, pricing requests seem trivial. It isn’t at large scale. A data pipeline that handles millions of GET requests per day, a media platform serving images directly from S3, or an analytics workload that does lots of LIST operations can quickly run up against request charges that are on par with or exceed the storage line.
Automated jobs and analytics tools are common offenders here. Scanning S3 Costs every few minutes with an ETL pipeline doesn’t sound expensive per run until you multiply that by 24 hours and 30 days. Often, reducing request volume results in faster savings than changing storage classes.
Data Transfer: The S3 Cost Multiplier You Didn’t Know About
There is no charge for inbound data transfer to S3 Costs. Outbound transfer is where your bill can go up without any change to what you’re storing.
Data leaving S3 to the internet — $0.09 per GB for the first 9.9 TB per month, stepping down to $0.085 per GB for the next 40 TB, $0.07 per GB for the next 100 TB, and $0.05 per GB above that.
Data leaving S3 for another AWS region — costs $0.02 per GB.
To serve 1 TB to end users, there is an additional $90 egress cost, plus storage and request charges.
One of the most common and avoidable transfer surprises is NAT Gateway routing. Traffic from EC2 to S3 via a NAT Gateway incurs NAT Gateway data processing charges, which do not appear on the S3 line of your bill, but are directly attributable to access to S3. Instead, routing the same traffic through a VPC Gateway Endpoint is free and eliminates this charge completely.
If teams are publicly hosting static content or media assets, Amazon CloudFront can be used to completely eliminate S3 Costs egress fees. CloudFront transfer rates are typically cheaper than direct S3 egress, and the latency benefit for global users is a bonus.
S3 Costs Inflate Due to Hidden Fees
A few less obvious charges, other than the main dimensions, catch teams off guard:
Lifecycle transition fees moving objects between storage classes via lifecycle policies saves money on storage but charges a per-request fee for each transition. Too aggressive lifecycle rules, frequently moving millions of small objects, can result in transition costs that are greater than storage savings.
Early deletion fees — objects deleted from Standard-IA before 30 days or from Glacier before 90 or 180 days are still charged for the full minimum storage duration. Teams using archival classes for short-lived files are paying for storage they no longer can access.
Versioning overhead enabling versioning means that every overwrite creates a new stored version of the object. AWS bills you for every version stored, not just the current object. A bucket with versioning enabled that does not have a lifecycle rule to expire older versions will silently accrue storage costs over time.
Cross-region replication — When you create a copy from one region to another, you pay for storage in each region and you pay for data transfer on each replicated object. This is often an underestimated addition to their monthly bill for teams setting up replication for compliance or disaster recovery.
How To Reduce S3 Costs In Real Life
Examine storage class assignments. Use S3 Storage Lens or AWS Cost Explorer to find objects in Standard that have not been accessed in 60, 90, or 180 days. Good candidates for Intelligent-Tiering or Glacier are:
Create lifecycle policies. After 30 days, transition to Standard-IA . After 90 days, transition to Glacier Instant Retrieval . After a year, transition to Glacier Deep Archive . Automate this transition from Standard to Standard-IA to Glacier Instant Retrieval to Glacier Deep Archive . Set once and costs automatically change as data ages.
Use VPC Gateway Endpoints. No configuration cost. Use AWS internal network instead of the public internet to route EC2-to-S3 traffic to avoid NAT Gateway data processing charges.
Route assets public through cloudfront. If you have data that you serve to external users, CloudFront in front of S3 removes egress charges from the S3 bill, and improves delivery performance worldwide.
Expire old versions of objects. If versioning is enabled, add a lifecycle rule to expire old versions after a number of days. Without this rule old versions pile up forever and silently add storage charges over time.
Merge small files. File bundling reduces total request count on both writes and reads for workloads with many tiny objects. Millions of small objects per request are more expensive than storage per GB.