AWS Pricing: What You're Actually Paying For

AWS sends you a bill at the end of the month. The number on that bill is the sum of dozens of individual usage meters running simultaneously, each tracking a different resource.

Understanding the structure — not every line item, just the main patterns — makes the bill comprehensible instead of alarming.

The core idea: you pay for what you use

Unlike traditional hosting, where you pay a flat monthly fee for a server, AWS charges by the hour, by the GB, by the request, or by some combination. This is powerful when your usage varies. It can be expensive when it doesn't, because the per-unit rates are higher than dedicated hosting.

The first major cost driver is usually EC2 — virtual servers.

EC2: paying for compute

EC2 instances are virtual servers. You're billed for the time they're running, regardless of whether you're actively using them.

Pricing varies by instance type (CPU/memory combination), region, and pricing model.

On-Demand: Pay by the hour, no commitment. Most flexible, most expensive. A t3.medium (2 vCPU, 4 GB RAM) in us-east-1 costs roughly $0.0416/hour — about $30/month if running 24/7.

Reserved Instances: You commit to 1 or 3 years in exchange for 40–60% off On-Demand rates. Same t3.medium on a 1-year reserved instance: roughly $18/month. The catch is you pay whether you use it or not.

Spot Instances: Spare AWS capacity sold at steep discounts (up to 90% off). The trade-off: AWS can reclaim the instance with a 2-minute warning. Good for batch processing, machine learning training, and anything that can checkpoint and restart.

S3: paying for storage and requests

S3 is object storage — files, images, backups, static websites. The pricing has two main components.

Storage: $0.023/GB per month for the first 50 TB in Standard storage (us-east-1). 100 GB of files = $2.30/month in storage costs.

Requests: PUT and COPY requests cost $0.005 per 1,000. GET requests cost $0.0004 per 1,000. These are small individually but add up fast at scale if your application makes many API calls.

Data transfer out: Transferring data from S3 to the internet costs $0.09/GB after the first GB (which is free). Transferring data between S3 and EC2 in the same region is free. This distinction matters — it's why architecture recommendations often say to keep your storage and compute in the same region.

Lambda: paying per invocation

Lambda runs your code without you provisioning a server. You write a function, upload it, and AWS executes it in response to events.

Pricing: $0.20 per million requests + $0.0000166667 per GB-second of compute time.

The free tier covers 1 million requests and 400,000 GB-seconds per month. For most small applications, Lambda is effectively free. It's only at significant scale that costs become meaningful.

Where Lambda surprises people: duration charges. If your function runs for 1 second using 512 MB of memory, that's 0.5 GB-seconds. Run it a million times and you've used 500,000 GB-seconds — well within the free tier. Run it 2 million times and you start paying.

RDS: managed databases

Running a database on EC2 is possible but tedious — you manage backups, patching, failover. RDS does this for you, at a premium.

An RDS db.t3.micro (1 vCPU, 1 GB RAM) running MySQL in us-east-1 costs about $0.017/hour On-Demand — roughly $12/month. Add 20 GB of storage at $0.115/GB = $2.30/month. Total: ~$14–15/month for a minimal managed database.

Data transfer: the cost people forget

Data transfer out of AWS to the internet is charged at $0.09/GB (first 100 TB, us-east-1). Data transfer in is free. Data transfer between services in the same region is free or very cheap.

For media-heavy applications — video streaming, image delivery — data transfer can become the largest line item on the bill, exceeding compute and storage.

CloudFront (AWS's CDN) reduces data transfer costs because it caches content at edge locations. CloudFront to internet is $0.085/GB vs $0.09/GB from EC2 directly — a small savings, but the caching benefit is the real value.

How to avoid surprises

Set up AWS Budgets with an alert when spending exceeds a threshold. The default free tier doesn't alert you automatically — you have to configure it.

The most common unexpected charges: EC2 instances left running after a project ends, Elastic IPs not attached to a running instance (small charge, easy to miss), and NAT Gateways ($0.045/hour + $0.045/GB of data processed).

Forgetting to terminate a NAT Gateway is one of the most reliable ways to find a $30–50 charge on your bill that you can't explain.

Use the free AWS Pricing Calculator

Open AWS Pricing Calculator →