Your autoscaling groups are spinning up new EC2 machines, scaling in and out beautifully, handling traffic masterfully; S3 lifecycle rules are transitioning objects to their appropriate storage classes with surgical precision, optimizing storage costs of every single bit in your custody; everything is going well (at least that's what you think), so you go to sleep safe and sound. The month rolls over, you wake up, open your email, then take a look at the AWS invoice and there are so many digits that it feels like you're Seto Kaiba being obliterated by Exodia. After that, there's nothing much left to do but hope for AWS to accept your billing waiver request. However, if you haven't reached that point yet, AWS has quite a few tools for you to keep an eye on your spending so that you get to live another day with a roof over your head.
Billing and cost management dashboards with scheduled email reports
Billing and Cost Management Dashboards lets you build a single page of widgets showing your cost and usage data the way you want to see it: by service, by account, by tag, you name it. Also, you can have a dashboard come to you instead of the other way around, because they support scheduled email reports.
You create a dashboard (or duplicate a managed one), choose Manage email reports from the Actions menu, and set it to be delivered daily, weekly or monthly. Recipients get an email with a secure link to a password-protected PDF snapshot of the dashboard, which is great for securely giving the CFO a Monday-morning heart attack without ever having to move a single finger to send or build the report yourself.
Worth knowing
- It reports what already happened (obviously). Since there's no threshold, nothing will scream at you if, for instance, the spending goes nuts on a Tuesday, but your report is scheduled for Thursday. You'll just see the costs report on Thursday;
- Recipients need to verify their email address the first time before they start receiving reports.
Billing metrics and a CloudWatch estimated charges alarm
AWS publishes a metric with your estimated charges for the month so far, and you can set a CloudWatch alarm on it to get notified when it goes past a number you consider "too much". It isn't fancy, but it's been around forever and it works. But such alarms aren't free (beyond the free tier), so you might end up paying just to know if the amount you're estimated to pay to AWS by the end of the month is crossing a line.
Turning it on
Before the metric even exists, you have to opt in, but this one, surprisingly, is really free. In the Billing and Cost Management console go to Billing Preferences, edit Alert preferences and check Receive CloudWatch Billing Alerts. If you use consolidated billing, keep in mind that member account metrics are only captured when the payer account enables the preference.
Creating the alarm
Billing metrics live exclusively in us-east-1, no matter where your resources are running, so everything below has to be created there. We need an SNS topic to deliver the notification, a subscription for your email (which you must confirm by clicking the link you'll receive) and the alarm itself:
aws sns create-topic --name billing-alerts --region us-east-1 aws sns subscribe \ --topic-arn arn:aws:sns:us-east-1:123456789012:billing-alerts \ --protocol email \ --notification-endpoint you@example.com \ --region us-east-1 aws cloudwatch put-metric-alarm \ --region us-east-1 \ --alarm-name estimated-charges-100-usd \ --alarm-description "Estimated charges reached 100 USD" \ --namespace AWS/Billing \ --metric-name EstimatedCharges \ --dimensions Name=Currency,Value=USD \ --statistic Maximum \ --period 21600 \ --evaluation-periods 1 \ --threshold 100 \ --comparison-operator GreaterThanOrEqualToThreshold \ --alarm-actions arn:aws:sns:us-east-1:123456789012:billing-alerts The period of 21600 seconds is six hours, which is the suggested period by AWS, otherwise you'll see on the console: "Warning! Your billing alarm may be set up incorrectly...". You can also add the ServiceName dimension or the LinkedAccount one, if you have consolidated billing, to watch the charges of a single service, like EC2 or RDS, instead of the whole account. Also, you can choose among other actions for your alarm.
Worth knowing
- The alarm compares against the month-to-date total, so it's a ceiling alarm. It tells you "you crossed $100", not "you're on track to cross $100";
- You might want a few alarms at different thresholds (50%, 80%, 100% of what you expect to spend) so you can safely ignore all of them until shit hits the fan;
- It's the simplest of the bunch, with no forecasting and no filters beyond the service and linked account.
AWS Budgets and Budgets Reports
Instead of watching one metric, AWS Budgets lets you define an actual budget (a cost or usage amount, or coverage and utilization targets for Reserved Instances and Savings Plans), filter it by several options and get notified when your actual or forecasted spending crosses a percentage of it. That forecast bit is the killer feature, since it warns you while there's still hope.
A budget can be fixed, planned (different values for different months) or auto-adjusting based on your past usage. Here's a simple monthly cost budget of 100 USD that emails you when the forecast says you'll go over it:
{ "BudgetName": "monthly-cost-budget", "BudgetType": "COST", "TimeUnit": "MONTHLY", "BudgetLimit": { "Amount": "100", "Unit": "USD" } } [ { "Notification": { "NotificationType": "FORECASTED", "ComparisonOperator": "GREATER_THAN", "Threshold": 100, "ThresholdType": "PERCENTAGE" }, "Subscribers": [ { "SubscriptionType": "EMAIL", "Address": "you@example.com" } ] } ] aws budgets create-budget \ --account-id 123456789012 \ --budget file://budget.json \ --notifications-with-subscribers file://notifications.json On top of alerts, Budgets can also run actions when a threshold is crossed, like applying an IAM or service control policy, or stopping EC2 and RDS instances. That's the equivalent of "I'd rather pay for an outage than pay AWS".
There's also Budgets Reports, which are emailed on a daily, weekly or monthly basis and summarize how your whole portfolio of budgets is doing, so you don't have to open each one to find out. And in case you're already using the dashboards from earlier, there's a Budgets widget so you can see them right there.
Worth knowing
- Budgets with no actions are free. The first two action-enabled budgets are free too, but beyond that they cost $0.10 per day each (of course);
- Each Budgets Report delivered costs $0.01, which is peanuts, but it adds up if you send multiple reports. So send a few reports to many recipients;
- Forecasts need about 5 weeks of usage data to work. So don't expect them to be accurate right away.
AWS Data Exports
Everything so far gives you summaries, but AWS Data Exports is for when they aren't enough (for the really paranoid ones) and you want to know exactly how much which resource, on which day, under which tag, cost you. It delivers your billing data to an S3 bucket, where you can query it with Athena or Redshift, visualize it with QuickSight, or feed it to whatever BI tool your company likes to complain about.
The most important dataset is the Cost and Usage Report 2.0 (CUR 2.0), which is the most detailed cost data AWS gives you. The other data exports available are FOCUS 1.2 (or 1.0), an open standard for billing data that's handy when you have more than one cloud, cost optimization recommendations, carbon emissions and Cost and Usage Dashboard. You can also write a bit of SQL (ask Claude) to pick the columns and filter the rows before they're delivered, and since this year you can send them directly to an S3 bucket in another account, which means you no longer need replication to get everything centralized.
Before creating the export, the destination bucket needs a policy allowing Data Exports to write to it. Then it's just a matter of telling AWS what you want:
aws bcm-data-exports create-export --region us-east-1 --export '{ "Name": "cur2-daily", "DataQuery": { "QueryStatement": "SELECT line_item_usage_account_id, line_item_product_code, line_item_resource_id, line_item_usage_start_date, line_item_unblended_cost FROM COST_AND_USAGE_REPORT", "TableConfigurations": { "COST_AND_USAGE_REPORT": { "TIME_GRANULARITY": "DAILY", "INCLUDE_RESOURCES": "TRUE", "INCLUDE_MANUAL_DISCOUNT_COMPATIBILITY": "FALSE", "INCLUDE_SPLIT_COST_ALLOCATION_DATA": "FALSE" } } }, "DestinationConfigurations": { "S3Destination": { "S3Bucket": "example-cur-bucket", "S3Prefix": "cur2", "S3Region": "us-east-1", "S3OutputConfigurations": { "OutputType": "CUSTOM", "Format": "PARQUET", "Compression": "PARQUET", "Overwrite": "OVERWRITE_REPORT" } } }, "RefreshCadence": { "Frequency": "SYNCHRONOUS" } }' With INCLUDE_RESOURCES set to TRUE every line item comes with the resource ID, which is how you finally find out exactly which one of your resources is causing your ruin.
Worth knowing
- The export itself is not an alert. It's raw data, so you'll need to build (or buy) the analysis part, and nothing here will notify you of anything;
- You pay for the S3 storage and for whatever you use to query it. Parquet and sensible partitioning keeps Athena costs low;
- The table configuration, such as the time granularity and whether resource IDs are included, can't be changed after creation, so give it some thought before hitting enter.
AWS FinOps Agent
The newest kid on the block. The AWS FinOps Agent was announced in June 2026 and, as of now, it's still in preview. It's an AI agent built on Amazon Bedrock that sits on top of the cost services you may already have, namely Cost Explorer, Cost Anomaly Detection, Cost Optimization Hub, Compute Optimizer and CloudTrail, and lets you just ask questions about your spending in plain language: "Why did my bill go up last week?"; "Which resources are idle?"; "What would I save with a Savings Plan?". You get the idea: AWS wouldn't be able to explain your bill anyway, but at least the bot replies faster.
Beyond chatting, it can do a few things on its own.
- Investigate cost anomalies automatically when Cost Anomaly Detection flags one, finding the service and the activity behind the spike, and post the findings on Slack or open a Jira ticket for the team responsible;
- Run recurring tasks on a schedule you define, like generating cost reports for finance and engineering;
- Surface rightsizing, idle resource and Savings Plans recommendations coming from Cost Optimization Hub and Compute Optimizer.
Setting it up means creating an agent in the FinOps Agent console, choosing the IAM roles it'll assume and optionally connecting Slack and Jira. Cost Optimization Hub and Compute Optimizer should be enabled beforehand, otherwise there won't be any recommendations to show.
Worth knowing
- It's a preview, so things are subject to change. At the moment the agent itself is free of charge during the preview, which, if you know AWS, won't last forever. However, it still calls AWS APIs on your behalf at their standard per-request rates, so asking why your bill went up can make it go up;
- It's only as good as the data behind it, so if you haven't enabled the services it reads from, it'll have little to work with;
- Treat what it tells you as a very smart starting point and not as gospel, especially before you go deleting resources because a chatbot said so.
Wrap-up
Forget everything you've learned with Yu-Gi-Oh and do not believe in the Heart of the Cards! Start keeping track of your costs, set up alerts and define thresholds, so you can have some peace of mind when the month rolls over. Or don't, aim for the skies, apply for a new record at the Guinness World Records, let it rip, do it for the plot. After all, you can only be sure if AWS is using int or bigint for bill amounts after 4 bytes.



