AWSCost

AWS cost · S3 storage

Why your S3 bill keeps growing - and how to stop it

In every AWS account I have looked at, the storage bill only goes up. Data goes in and nothing comes out. Backups from months ago, snapshots from a migration that is long done, exports nobody opened twice - it all lands in the default storage class and stays there. Nobody decided to keep this data hot. It just never moved. You end up paying for data you will never open again, at the price of data you use every day.

S3 storage grows because data goes in at the Standard rate of $0.023/GB-month and never leaves. Cold backups sit at the same price as data you use daily. Move them to Glacier Deep Archive at $0.00099/GB-month - 2 TB drops from ~$46/month to ~$2 - with one lifecycle rule that runs on a schedule.

How much cheaper are the archival storage classes?

The same 2 TB of backups, priced across the S3 storage classes (us-east-1 list pricing):

Storage classPer GB-month2 TB / month
S3 Standard$0.023~$46/month
Standard-IA$0.0125~$25/month
Glacier Instant Retrieval$0.004~$8/month
Glacier Flexible Retrieval$0.0036~$7/month
Glacier Deep Archive$0.00099~$2/month

Over a year, that 2 TB is about $552 in Standard against about $25 in Deep Archive. Same files. The only difference is the storage class nobody changed.

How do I move cold data to cheaper storage?

One S3 lifecycle rule. Point it at the bucket or prefix where your backups live, and transition objects older than, say, 30 days to Glacier Deep Archive. From then on the move happens automatically - anything you back up and never read again ages into cheap storage on a schedule, without anyone remembering to do it. The same applies to logs you route to S3 instead of CloudWatch. One command sets the rule - point it at the right bucket:

# move objects older than 30 days to Glacier Deep Archive
aws s3api put-bucket-lifecycle-configuration \
  --bucket my-backup-bucket \
  --lifecycle-configuration '{
    "Rules": [{
      "ID": "archive-old-backups",
      "Status": "Enabled",
      "Filter": { "Prefix": "" },
      "Transitions": [{ "Days": 30, "StorageClass": "DEEP_ARCHIVE" }]
    }]
  }'

What are the catches with Glacier?

Cheap storage trades away instant access. Glacier retrieval takes hours, not milliseconds, and carries a per-GB retrieval fee, and Deep Archive has a 180-day minimum storage duration. That is exactly why it fits backups and archives and not anything you serve to users: the data you will not need on demand is the data that belongs there. Send cold data to Glacier, keep anything you might read quickly in Standard or Standard-IA.

Want to know how much of your S3 bill is cold data at hot prices? Connect your account read-only and see what it is wasting, in real dollars.

Connect your AWS

The role can only read - Get, Describe, List, nothing else. Read the exact permissions before you deploy it, and delete the stack whenever you want.

Frequently asked questions

Why does my S3 bill keep growing?+

Because data goes in and nothing comes out, all of it at the S3 Standard rate of $0.023/GB-month. Backups, snapshots, exports - they land in the default storage class and stay there, so you keep paying full price for data you will never open again.

How much does S3 Standard cost?+

$0.023 per GB-month in us-east-1. That is about $23/month per terabyte, or ~$46/month for 2 TB - regardless of whether you ever read the data again.

What is the cheapest S3 storage class?+

Glacier Deep Archive at $0.00099/GB-month - roughly one twenty-third the price of Standard. The same 2 TB that costs ~$46/month in Standard costs ~$2/month in Deep Archive.

How do S3 lifecycle rules work?+

A lifecycle rule transitions objects to a cheaper class automatically after a set age - for example, move anything older than 30 days from Standard to Glacier Deep Archive, and optionally expire it later. You set it once and it runs on a schedule.

What is the catch with Glacier Deep Archive?+

Retrieval is slow (hours, not milliseconds) and has a per-GB retrieval fee, and there is a 180-day minimum storage duration. So Deep Archive is for data you genuinely will not need on demand - backups and archives, not anything you serve to users.

Standard-IA vs Glacier - which should I use?+

Standard-IA ($0.0125/GB-month) keeps data instantly available for a smaller discount, which suits files you rarely touch but might need fast. Glacier classes are far cheaper but add retrieval time and fees, so they suit truly cold data you can wait for.

Does moving data to Glacier have a minimum storage duration?+

Yes. Standard-IA and Glacier Flexible have a 30 to 90-day minimum, and Deep Archive has 180 days. If you delete or move data before the minimum, you are still billed for the remainder - which is why lifecycle rules should target data that is genuinely cold.

Related cost breakdowns

More AWS cost breakdowns