Skip to content
AWS aws cost 6 min read

Staying Within the Free Tier

The AWS Free Tier lets you learn cloud computing for little or no money, but only if you understand its limits. The biggest source of “I did nothing and got charged” stories is not the Free Tier failing you, it is a forgotten resource that was never free in the first place. This page shows you the exact guardrails to set up on day one and the specific resources that quietly bill you by the hour. Set these up before you launch anything and you can experiment for months without a surprise invoice.

How the Free Tier actually works

The AWS Free Tier comes in three flavors, and mixing them up is where beginners get burned.

TypeWhat it meansExampleRisk
12-month freeFree for 12 months from signup750 hours/month of a t2.micro or t3.micro EC2 instanceExpires silently after a year
Always freeFree forever, up to a monthly cap1 million AWS Lambda requests/monthCharged once you exceed the cap
Free trialShort-term trial of a specific service30-day trial of Amazon InspectorAuto-converts to paid

EC2 (Elastic Compute Cloud, AWS virtual servers) gives you 750 instance-hours per month. That is enough to run exactly one small instance 24/7 for a whole month (a month is about 730 hours). Run two at once and you blow the limit in roughly half the month.

Free Tier limits are measured per AWS account, not per service instance. Two t3.micro instances share the same 750-hour pool.

Set a zero-spend budget alert first

Before you create a single resource, create an AWS Budget. A budget is a spending threshold that emails you when crossed. The “zero-spend” template alerts you the moment your bill goes above $0.01 over what the Free Tier covers, so you find out in hours, not at the end of the month.

Console steps:

  1. Sign in and open the Billing and Cost Management console.
  2. In the left menu choose Budgets, then Create budget.
  3. Select the Zero spend budget template.
  4. Enter your email address under Email recipients.
  5. Choose Create budget.

Equivalent AWS CLI (v2):

aws budgets create-budget \
  --account-id 123456789012 \
  --budget '{
    "BudgetName": "ZeroSpend",
    "BudgetLimit": {"Amount": "1", "Unit": "USD"},
    "TimeUnit": "MONTHLY",
    "BudgetType": "COST"
  }' \
  --notifications-with-subscribers '[{
    "Notification": {
      "NotificationType": "ACTUAL",
      "ComparisonOperator": "GREATER_THAN",
      "Threshold": 1,
      "ThresholdType": "ABSOLUTE_VALUE"
    },
    "Subscribers": [{"SubscriptionType": "EMAIL", "Address": "[email protected]"}]
  }]'

Output:

(no output on success; the command returns exit code 0)

When to use this: always, on every account, as the very first thing you do. There is no downside. The only “when not to” is if you already have a stricter budget covering the same account.

Turn on Free Tier usage alerts

Separately from budgets, AWS can warn you as you approach a Free Tier limit (for example, when you hit 85% of your 750 EC2 hours). This catches overuse inside the Free Tier before it converts to charges.

Console steps:

  1. Open the Billing and Cost Management console.
  2. Choose Billing preferences in the left menu.
  3. Under Alert preferences, enable Receive AWS Free Tier alerts.
  4. Enter an email address and choose Save preferences.

This is a global setting, so there is no per-resource CLI equivalent; it is configured once via the Billing preferences API or console.

Stop or terminate what you are not using

A running EC2 instance burns Free Tier hours whether you use it or not. Know the difference:

  • Stop an instance to pause it. You keep the disk (and its data) but stop paying for compute hours. EBS (Elastic Block Store, the attached disk) still counts against the 30 GB Free Tier storage limit.
  • Terminate an instance to delete it permanently. This frees compute and, usually, the attached disk.

Stop an instance (CLI):

aws ec2 stop-instances --instance-ids i-0a1b2c3d4e5f

Output:

{
    "StoppingInstances": [
        {
            "InstanceId": "i-0a1b2c3d4e5f",
            "CurrentState": {"Name": "stopping"},
            "PreviousState": {"Name": "running"}
        }
    ]
}

Find every running instance across a region (CLI):

aws ec2 describe-instances \
  --filters "Name=instance-state-name,Values=running" \
  --query "Reservations[].Instances[].[InstanceId,InstanceType]" \
  --output table

When to use stop vs terminate: stop when you will come back to the same setup tomorrow. Terminate when you are done with an experiment for good. Always terminate scratch resources you spun up for a tutorial.

The services that are NOT free (the real trap)

Many common services have no meaningful Free Tier, so leaving them running bills you continuously. These are the classic surprise charges.

ResourceWhy it chargesRough cost (us-east-1)
NAT GatewayA NAT Gateway (lets private subnets reach the internet) bills hourly plus per-GB, with no Free Tier$0.045/hour ($32/month) plus data
Application/Network Load BalancerBilled per hour the moment it exists$0.022/hour ($16/month) plus capacity units
Public IPv4 addressSince Feb 2024 every public IPv4 address bills hourly, even one attached to a running instance$0.005/hour ($3.60/month) each
Elastic IP (a static public IP you reserve)Always billed at the public IPv4 rate, whether attached or not$0.005/hour ($3.60/month)
RDS beyond limitsRDS (Relational Database Service, managed databases) is free only for 750 hours of a db.t3.micro for 12 months; extra instances or storage costvaries

The single most common surprise bill is a NAT Gateway or load balancer created by a “quick start” tutorial or a VPC wizard and then forgotten. At roughly $16-$32 per month each, they keep charging long after you stopped paying attention. Always check the VPC and EC2 consoles for these before you log off.

Release a forgotten Elastic IP (CLI):

aws ec2 release-address --allocation-id eipalloc-0a1b2c3d

Output:

(no output on success; exit code 0)

Delete a NAT Gateway you no longer need (CLI):

aws ec2 delete-nat-gateway --nat-gateway-id nat-0a1b2c3d4e5f

Output:

{
    "NatGatewayId": "nat-0a1b2c3d4e5f"
}

Watch the usage-hour limits

The 750-hour EC2 and RDS allowances are the easiest to overrun. A few rules keep you safe:

  • Run one Free Tier instance at a time, not several.
  • Remember that a stopped instance uses zero compute hours, so stop instances overnight if you only use them during the day.
  • Watch storage: the Free Tier covers 30 GB of EBS. Old volumes from terminated instances and EBS snapshots both count, so delete orphaned volumes.

Check your current month-to-date usage from the Free Tier page in the Billing console, which shows a percentage bar for each tracked service.

Best practices

  • Create a zero-spend AWS Budget and enable Free Tier usage alerts before launching anything.
  • Use one Region for learning so you do not lose track of resources scattered across the globe.
  • Terminate, do not just stop, scratch resources from tutorials once you are finished.
  • Before logging off, scan the VPC console for NAT Gateways and the EC2 console for load balancers and unattached Elastic IPs.
  • Delete orphaned EBS volumes and old snapshots to stay under the 30 GB storage cap.
  • Tag everything you create (for example Project=learning) so you can find and clean up resources later.
  • Set a calendar reminder for month 11 after signup, when the 12-month Free Tier is about to expire.
Last updated June 15, 2026
Was this helpful?