Free Tier, Budgets & Billing Alarms

AWS · Lesson 5 of 30 8 min read Updated

Meera practised with AWS for a weekend, forgot one database running, and found a bill a month later. Nothing was hacked; she simply did not know that AWS bills for what is running, not for what is used. The fix is simple: understand the billing model, know what the Free Tier covers, and set alerts before you build anything.

In this lesson you will learn how AWS pricing works in general, how the current Free Tier is structured, and how to create a budget and a billing alarm with the console and the CLI.

How AWS charges

AWS uses pay-as-you-go pricing. Each service has its own price list, but most charges fall into a few kinds:

  • Compute time: servers and databases are billed for the time they run, whether busy or idle.
  • Storage: billed per gigabyte per month, for files, disks and backups.
  • Requests: many serverless services bill per request or per million requests.
  • Data transfer: data going out of AWS to the internet is usually charged; data coming in usually is not.

Prices differ between Regions and change over time, so this course never quotes them. Look them up on each service's pricing page or estimate a whole design with the AWS Pricing Calculator. Accounts with an Indian address see INR invoices: AWS computes charges in US dollars and AWS India converts them to rupees.

The Free Tier today

AWS changed its Free Tier for new accounts in mid-2025. When you sign up, you choose a plan:

Free planPaid plan
CreditsSign-up credits, plus more you can earn by trying key servicesThe same credits
ChargesNone; you cannot be chargedUsage beyond your credits is billed
ServicesA selected set of services and featuresAll services and features
How longUp to six months, or until credits run outNo end date
When it endsThe account closes; you have 90 days to upgrade before data is deletedNothing closes

Both plans also include always-free offers: more than 30 services have monthly usage that is free within set limits, with no end date. The exact amounts and the list of services change, so read the official AWS Free Tier page rather than any blog post, including this one.

The Free plan is a safe way to learn, because it cannot surprise you with a bill. Its limits are that some services are not available, and certain actions (such as joining AWS Organizations) upgrade it to the Paid plan automatically.

Track your usage

Open Billing and Cost Management in the console. The home page shows your plan, remaining credits and month-to-date charges. The Free Tier page shows how much of each free offer you have used, and AWS emails Free Tier usage alerts to the account's email address. Check this page after every practice session.

Cost Explorer shows charges by service and by day, and Cost Anomaly Detection can warn you when spending jumps unusually. You will use them in Cost Optimisation.

Set up AWS Budgets

AWS Budgets sends alerts when actual or forecast costs cross a limit that you choose. In the console, choose Budgets, then Create budget, then Use a template. Two templates suit beginners:

  • Zero spend budget: alerts you as soon as spending goes above zero, for example when you go beyond free usage.
  • Monthly cost budget: alerts you when you exceed, or are forecast to exceed, a monthly amount that you set.

The same budget can be created with the CLI using two small JSON files. First the budget itself, budget.json:

JSON
{
  "BudgetName": "monthly-learning-limit",
  "BudgetLimit": { "Amount": "5", "Unit": "USD" },
  "TimeUnit": "MONTHLY",
  "BudgetType": "COST"
}

The amount is your own limit, not an AWS price. Then the alerts, notifications.json: one email at 80% of actual spend and one when the forecast passes 100%:

JSON
[
  {
    "Notification": {
      "NotificationType": "ACTUAL",
      "ComparisonOperator": "GREATER_THAN",
      "Threshold": 80,
      "ThresholdType": "PERCENTAGE"
    },
    "Subscribers": [{ "SubscriptionType": "EMAIL", "Address": "meera@example.in" }]
  },
  {
    "Notification": {
      "NotificationType": "FORECASTED",
      "ComparisonOperator": "GREATER_THAN",
      "Threshold": 100,
      "ThresholdType": "PERCENTAGE"
    },
    "Subscribers": [{ "SubscriptionType": "EMAIL", "Address": "meera@example.in" }]
  }
]

Create the budget and check it:

Terminal
aws budgets create-budget --account-id 111122223333 \
  --budget file://budget.json \
  --notifications-with-subscribers file://notifications.json

aws budgets describe-budgets --account-id 111122223333 \
  --query "Budgets[].{Name: BudgetName, Limit: BudgetLimit.Amount, Unit: BudgetLimit.Unit}"
Output
[
    {
        "Name": "monthly-learning-limit",
        "Limit": "5.0",
        "Unit": "USD"
    }
]

create-budget prints nothing when it succeeds. The file:// prefix tells the CLI to read the parameter from a file. Budgets can also run actions, such as applying a restrictive IAM policy or stopping EC2 and RDS instances, when a threshold is crossed.

A CloudWatch billing alarm

A second, older safety net is a billing alarm in Amazon CloudWatch. Billing metrics are stored only in US East (N. Virginia), us-east-1, in US dollars, and they cover your worldwide charges. First, as an admin with billing access, open Billing preferences, edit Alert preferences and turn on Receive CloudWatch Billing Alerts. Then create an email topic and an alarm:

Terminal
aws sns create-topic --name billing-alerts --region us-east-1

aws sns subscribe --region us-east-1 \
  --topic-arn arn:aws:sns:us-east-1:111122223333:billing-alerts \
  --protocol email --notification-endpoint meera@example.in

aws cloudwatch put-metric-alarm --region us-east-1 \
  --alarm-name estimated-charges-over-10 \
  --namespace AWS/Billing --metric-name EstimatedCharges \
  --dimensions Name=Currency,Value=USD \
  --statistic Maximum --period 21600 --evaluation-periods 1 \
  --threshold 10 --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:us-east-1:111122223333:billing-alerts
Output
{
    "TopicArn": "arn:aws:sns:us-east-1:111122223333:billing-alerts"
}
{
    "SubscriptionArn": "pending confirmation"
}

The first two commands print the topic ARN and a pending subscription; put-metric-alarm prints nothing. Open the confirmation email from Amazon SNS and click the link, or you will never receive alerts. The period of 21600 seconds is 6 hours, because billing data is updated a few times a day, not every minute.

Things that bill while idle

When you finish practising, delete these, because they keep charging even when nobody uses them: running EC2 instances, EBS volumes and snapshots, public IPv4 addresses (including unattached Elastic IPs), NAT gateways, load balancers and RDS databases. Tag your practice resources (for example project=learning) so you can find them later.

Common mistakes

  • Waiting for the first bill to learn about costs. Create a budget on day one.
  • Never confirming the SNS subscription email, so the alarm fires silently.
  • Creating the billing alarm in Mumbai. Billing metrics exist only in us-east-1.
  • Stopping an EC2 instance and thinking the cost is zero. Its disks and public IP addresses can still be charged.
  • Trusting old blog posts about free limits. Always check the official Free Tier page.

Key points

  • AWS charges mainly for running time, storage, requests and outbound data transfer; prices vary by Region, so use official pricing pages and the Pricing Calculator.
  • New accounts choose a Free plan (no charges, limited services, up to six months) or a Paid plan; both get credits and always-free offers.
  • Track usage on the Billing and Cost Management home and Free Tier pages.
  • AWS Budgets alerts on actual and forecast spend; a zero spend budget is a good first step.
  • CloudWatch billing alarms use the EstimatedCharges metric in us-east-1 and need billing alerts turned on.

Exercise

Write the two JSON files and the CLI command for a budget called diwali-sale-test with a monthly limit of 20 USD that emails kabir@example.in when actual spend reaches 50% and again at 100%.

Show solution
JSON
{
  "BudgetName": "diwali-sale-test",
  "BudgetLimit": { "Amount": "20", "Unit": "USD" },
  "TimeUnit": "MONTHLY",
  "BudgetType": "COST"
}
JSON
[
  {
    "Notification": { "NotificationType": "ACTUAL", "ComparisonOperator": "GREATER_THAN", "Threshold": 50, "ThresholdType": "PERCENTAGE" },
    "Subscribers": [{ "SubscriptionType": "EMAIL", "Address": "kabir@example.in" }]
  },
  {
    "Notification": { "NotificationType": "ACTUAL", "ComparisonOperator": "GREATER_THAN", "Threshold": 100, "ThresholdType": "PERCENTAGE" },
    "Subscribers": [{ "SubscriptionType": "EMAIL", "Address": "kabir@example.in" }]
  }
]
Terminal
aws budgets create-budget --account-id 111122223333 \
  --budget file://budget.json \
  --notifications-with-subscribers file://notifications.json

Each notification is a separate object in the list, with its own threshold and subscribers.

Quick Quiz

1. What happens when a Free plan reaches six months or uses all its credits?

2. In which Region must you create a CloudWatch billing alarm?

3. Which budget template alerts you as soon as you spend anything?

4. You stopped an EC2 instance. Which charge can continue?

Learn AWS with a mentor

Free lessons get you started. Our Full Stack Web Development training adds real projects and code reviews from working developers.

  • Project-based learning
  • Mentor code reviews
  • Free counselling call