Almost everyone who uses AWS has opened a bill and thought "wait, what is that?". AWS charges for exactly what you use, which is wonderful when you use little and painful when something keeps running that you forgot about. The good news: most waste comes from the same handful of causes, and a few habits prevent nearly all of it.
Step zero: find out where the money goes
Open Cost Explorer, group by Service for the last three months, then by Usage type for the top services. Usage types are precise: NatGateway-Bytes, EBS:SnapshotUsage, DataTransfer-Out-Bytes, TimedStorage-ByteHrs. Most mysteries end here.
The usual suspects
| Line on the bill | Typical cause |
|---|---|
| EC2 | Forgotten instances, oversized instances, dev environments running 24/7 |
| EC2-Other | Unattached EBS volumes, old snapshots, Elastic IPs and public IPv4 addresses, NAT gateways |
| VPC / NAT gateway | Private subnets sending S3 or container image traffic through NAT |
| RDS | Multi-AZ on dev databases, oversized instances, old manual snapshots |
| CloudWatch | Log groups with no retention, verbose debug logs, high-cardinality custom metrics |
| Data transfer | Cross-AZ chatter, serving large files without CloudFront, cross-Region replication |
| S3 | Everything in Standard forever, old object versions, incomplete multipart uploads |
12 habits that keep costs down
- Set up AWS Budgets on day one. A monthly budget with alerts at 50%, 80% and 100% turns surprises into emails. Add Cost Anomaly Detection to catch sudden spikes.
- Tag everything with owner, environment and project, and activate those tags as cost allocation tags so you can see spend per team and environment.
- Turn off non-production at night. Scheduled scaling for Auto Scaling groups, Instance Scheduler, or stopping dev databases can cut non-prod compute by 60–70%.
- Right-size. Use Compute Optimizer recommendations after two weeks of data. Most instances are larger than they need to be.
- Move to current generations and Graviton for better price-performance.
- Commit where load is steady. Savings Plans or Reserved Instances for the baseline you will run for one to three years; On-Demand for the rest.
- Use Spot for fault-tolerant work: batch, CI runners, stateless workers, part of an Auto Scaling group.
- Add S3 and DynamoDB gateway endpoints to every VPC. They are free and remove NAT processing charges for that traffic.
- Clean up storage: delete unattached EBS volumes, set snapshot retention with Data Lifecycle Manager or AWS Backup, migrate gp2 volumes to gp3.
- Apply S3 lifecycle rules: transition cold data, expire old versions, abort incomplete multipart uploads after seven days.
- Set log retention on every CloudWatch log group and keep production logs at info level.
- Review monthly. Thirty minutes in Cost Explorer each month, checking the top five services and anything that grew, catches problems while they are small.
Architecture choices that save money
- Serve static content through CloudFront; its data transfer is often cheaper than serving directly from EC2 or S3 and it reduces origin load.
- Keep chatty services in the same AZ where availability allows, or accept cross-AZ cost consciously.
- Prefer serverless and on-demand capacity for spiky, low-volume workloads; prefer provisioned or committed capacity for steady high volume.
- Use Auto Scaling instead of sizing for peak all year.
Guardrails for teams and learners
For organizations, add service control policies that restrict Regions and expensive instance families in sandbox accounts, and require tags at creation. For people learning AWS, the cheapest habit of all is not having to clean up: practicing in a managed sandbox where everything is deleted automatically means no forgotten NAT gateway billing you for a month.
Practice it
Cloud Arena labs run in AWS accounts we manage and clean up automatically, so you can experiment freely. To learn cost control hands-on, try Right-Size and Schedule Non-Prod with Budgets, Cut Data Transfer Cost with VPC Endpoints, Mixed Instances ASG with Spot and S3 Data Lifecycle Project. New to AWS? Read How to Practice AWS Without Paying for AWS.
FAQ
Can I set a hard spending limit on AWS?
AWS does not stop resources when a budget is exceeded by default, but Budgets actions can apply restrictive IAM or SCP policies or stop specific EC2 and RDS instances when a threshold is reached.
What is the quickest win in most accounts?
Deleting idle resources (unattached volumes, old snapshots, unused Elastic IPs, forgotten instances) and adding S3 gateway endpoints. Then scheduling non-production environments.