← All Insights

AWS Free Tier: What's Actually Free (And What Quietly Costs You Money)

· 6 min read · CostPulse Team

You signed up for AWS, launched a few services, and assumed everything stays free. Then the first bill arrives — $47 for services you thought were covered.

This happens to almost everyone. AWS markets the Free Tier prominently, but the boundaries between “free” and “billing starts now” are surprisingly easy to cross. Here’s exactly what the Free Tier includes, where the common traps are, and how to avoid them.

What the AWS Free Tier Actually Gives You

AWS structures its Free Tier into three categories, and understanding the difference matters:

Always Free — Services with permanent free allocations that never expire. These are genuinely free as long as you stay within the limits:

ServiceFree Allowance
Lambda1M requests + 400,000 GB-seconds/month
DynamoDB25 GB storage + 25 WCU/RCU
SNS1M publishes/month
SQS1M requests/month
CloudWatch10 custom metrics, 10 alarms

12-Month Free — Available for 12 months after account creation. Once the year is up, full pricing kicks in automatically with no warning:

ServiceFree Allowance
EC2750 hours/month (t2.micro or t3.micro)
RDS750 hours/month (db.t2.micro or db.t3.micro)
S35 GB storage + 20,000 GET + 2,000 PUT
CloudFront1 TB data transfer out

Trials — Short-term trial access to specific services. These are one-time allowances that vanish quickly (30–60 days or a fixed number of API calls).

The critical distinction: “Always Free” limits reset monthly. “12-Month Free” limits also reset monthly but only for 12 months. “Trials” are a fixed amount — once used, they’re gone.

Where It Gets Expensive Fast — Real Examples

The SQS + Lambda Trap

Imagine a straightforward event-driven setup: an SQS queue triggers a Lambda function. Both services have generous Free Tier limits — SQS gives you 1 million requests/month, Lambda gives you 1 million invocations.

But here’s the catch: Lambda polls SQS using long-polling, and every poll counts as an SQS request, even if the queue is empty. With the default configuration, Lambda spawns 5 polling threads that each make a request every 20 seconds:

5 pollers × 3 requests/min × 60 min × 24 hours × 30 days = ~648,000 SQS requests/month

You haven’t sent a single message, and you’ve already consumed 65% of your SQS Free Tier just from polling. Add a second queue, and you’ve exceeded the free limit before doing any actual work.

At $0.40 per million requests beyond the Free Tier, the absolute cost is small — but it’s a cost you didn’t expect, for a service you assumed was free.

Cost Explorer API: $0.01 Per Request Adds Up

AWS Cost Explorer is the primary way to query your spending data programmatically. Each API call costs $0.01 — no Free Tier, no discounts.

If you build a dashboard that refreshes cost data every hour across 5 service dimensions, that’s:

24 requests/day × 30 days × 5 queries = 3,600 requests = $36/month

That’s $36/month just to look at your own bill.

CostPulse approaches this differently: by batching queries and caching results server-side, the typical monitoring cost comes down to around $0.31/month per account — roughly one query per day with smart caching.

Quick-Hit Gotchas

Some services are designed to be cheap at scale but can catch you off guard at small scale:

  • NAT Gateway — Charges $0.045/hour regardless of traffic, plus $0.045/GB processed. A NAT Gateway running 24/7 costs ~$32/month before any data even flows through it. This is one of the most common “forgot to delete it” costs.

  • CloudWatch Logs — Ingestion costs $0.50/GB. If your Lambda functions log verbose output, even moderate traffic generates several GB/month. A function logging 1 KB per invocation at 1M invocations/month = 1 GB = $0.50 in log ingestion alone — and that’s before storage costs.

  • S3 Request Pricing — Storage is cheap ($0.023/GB), but PUT/POST requests cost $0.005 per 1,000. Uploading 100,000 small files costs $0.50 in requests — the storage itself might only be pennies.

  • Elastic IP Addresses — Since February 2024, AWS charges $0.005/hour for every public IPv4 address — whether attached or not. That’s ~$3.60/month per address. The 12-month Free Tier covers 750 hours/month of in-use public IPv4, effectively one attached address. But unattached EIPs are charged from hour one, even on Free Tier accounts. Forgetting about one is pure waste.

  • Data Transfer — The first 100 GB/month to the internet is free (as of 2024), but cross-region transfers and transfers between services in different AZs are billed separately and easy to overlook.

The Core Problem: Complexity Without Visibility

AWS pricing isn’t designed to trick you. But it is designed for enterprises with dedicated FinOps teams who can navigate hundreds of service-specific pricing pages, each with their own unit of measurement.

For individual developers and small teams, the real risk isn’t any single expensive service — it’s the accumulation of small costs across services you forgot about. A stopped-but-not-terminated RDS instance here, an idle NAT Gateway there, CloudWatch logs silently growing — they add up.

The AWS Billing Dashboard shows you totals after the fact. By the time you see the number, the money has already been spent.

How CostPulse Helps

CostPulse was built for developers and small teams who don’t have time to babysit the AWS console. Instead of logging in once a month and hoping for the best, you get:

  • Daily cost summaries pushed to your phone — see what changed overnight without opening a browser
  • Budget thresholds with instant push alerts when spending approaches a limit you’ve set
  • Anomaly detection that flags unusual spending patterns before they become expensive
  • Service-level breakdowns showing exactly which services are driving costs

Setup takes under two minutes: one CloudFormation stack, no credentials shared, least-privilege IAM roles only.

Quick Checklist: Staying Within Free Tier

Use this as a monthly review:

  • Check your account age — 12-month Free Tier services expire silently. Set a calendar reminder for month 11.
  • Review running resources — Look for stopped EC2 instances, unattached Elastic IPs, and idle NAT Gateways.
  • Set log retention policies — CloudWatch Logs default to “never expire.” Set retention to 7 or 14 days on all log groups.
  • Set a billing alert — Even a simple $10 budget catches most surprises early. AWS Budgets lets you create basic alerts at no cost.
  • Tune SQS polling — If you use Lambda with SQS, set MaximumBatchingWindowInSeconds to reduce empty polling requests.
  • Monitor data transfer — Cross-region and internet-bound data transfer is charged separately from the services generating it.

Start Monitoring Before the Bill Arrives

The best time to start tracking AWS costs is before you get an unexpected bill. Download CostPulse and set up monitoring for your AWS account in under two minutes — free plan included, no credit card required.

Stop guessing. Start tracking.

Know exactly what your AWS infrastructure costs — before the bill arrives.

Download on the App Store