If your AWS bill feels higher than it should, you're probably right. Most AWS accounts — including well-run ones — carry 20–40% of unnecessary spend. It accumulates through normal growth: resources provisioned for a peak that never arrived, experiments that became permanent, reserved capacity that no longer matches actual usage.
This post covers the 8 changes that reliably move the needle. Not theoretical savings — specific, actionable interventions that AWS teams actually implement and measure.
1. Right-size your EC2 instances
Over-provisioned instances are the single largest source of waste in most AWS accounts. Use AWS Compute Optimizer (free, available in the console) to get instance type recommendations based on actual CPU, memory, and network utilization over the previous 14 days.
Target: any instance running below 20% average CPU utilization is a right-sizing candidate. The typical outcome is 20–40% instance cost reduction with no performance impact. Run this quarterly — usage patterns change.
2. Reserved Instances vs Savings Plans — choosing correctly
On-demand pricing is a significant premium over committed pricing. If you have predictable baseline compute usage (and most organizations do), you should be on either Reserved Instances or Savings Plans.
- Compute Savings Plans — the most flexible option. Applies automatically to any EC2, Fargate, or Lambda usage regardless of instance type or region. Good default choice.
- EC2 Reserved Instances — higher discount (up to 72%) but locked to a specific instance family and region. Worth it for stable, predictable workloads you're confident won't change.
- RDS Reserved Instances — database costs are often overlooked in savings plan reviews. RDS RIs can reduce database costs by 40–60%.
The 1-year No Upfront Savings Plan is typically the best starting point — meaningful savings with no cash commitment and flexibility to adjust.
3. Find and kill zombie resources
Zombie resources are provisioned infrastructure that's no longer serving a purpose: unattached EBS volumes from terminated instances, idle load balancers with no targets, forgotten Elastic IPs, snapshots from decommissioned databases, unused NAT Gateways.
AWS Cost Explorer and the AWS Trusted Advisor can surface these, but a targeted audit is faster. Check: EBS volumes not attached to any instance, Elastic IPs not associated with a running instance, load balancers with zero healthy targets, RDS snapshots older than your retention policy, and S3 buckets with minimal access over the past 90 days.
{ quick win }
Unattached EBS volumes and idle Elastic IPs are low-risk to delete and often represent $500–$2,000/month in avoidable spend for a medium-sized account. Run this audit first — it pays for the rest of the review.
4. S3 storage class tiering
S3 Intelligent-Tiering automatically moves objects between access tiers based on usage patterns, with no retrieval fees for objects that move to infrequent access. For buckets with unpredictable access patterns, enabling Intelligent-Tiering on objects larger than 128KB typically reduces S3 costs by 30–50%.
For buckets with predictable patterns (logs, backups, archives), explicit lifecycle policies are more cost-effective than Intelligent-Tiering: move to S3 Standard-IA after 30 days, S3 Glacier after 90 days, delete after your retention period.
5. Data transfer costs — the hidden bill
Data transfer is often the most surprising line on an AWS bill because it's invisible until it's large. Key sources of unexpected data transfer cost:
- Cross-AZ traffic — data moving between availability zones is charged. Ensure application tiers in the same region are in the same AZ where latency allows.
- NAT Gateway traffic — every byte through a NAT Gateway is charged at $0.045/GB. Use VPC Endpoints for services like S3 and DynamoDB to eliminate NAT Gateway costs for those services.
- CloudFront origin traffic — traffic from CloudFront back to your origin is charged. Maximize cache hit rates to reduce origin fetches.
- EC2 to internet — outbound internet traffic from EC2 is charged. Route traffic through CloudFront where possible — CloudFront's egress pricing is lower than EC2's.
6. RDS: right-size and consider Aurora Serverless
RDS instances are frequently over-provisioned — databases are often provisioned for peak load that rarely occurs. Check CloudWatch metrics for CPU, connection count, and IOPS utilization over 30 days. An RDS instance running below 20% CPU on average is a right-sizing candidate.
For databases with variable or unpredictable traffic — development environments, scheduled batch jobs, seasonal workloads — Aurora Serverless v2 eliminates the cost of idle capacity. It scales to near-zero during periods of inactivity and scales up automatically under load. The per-ACU pricing is higher than reserved instances, but total cost is often lower for workloads that aren't running at consistent high utilization.
7. Auto Scaling — stop paying for peak 24/7
Flat-capacity infrastructure sized for peak load pays for that peak capacity around the clock, even when traffic is low. Auto Scaling groups tied to actual demand metrics (CPU, request count, queue depth) allow you to match capacity to load dynamically.
The immediate opportunity: non-production environments. Development, staging, and QA environments running 24/7 at production capacity are common. Schedule-based scaling that shuts down non-production environments outside business hours typically saves 40–65% of those environment costs.
8. Tagging: you can't optimize what you can't attribute
Cost optimization is impossible without cost attribution. Without tags, you can see your total AWS bill but not which team, project, application, or environment is driving costs. A consistent tagging strategy — enforced via Service Control Policies in AWS Organizations — is the foundation of ongoing cost management.
Minimum useful tag set: Environment (prod/staging/dev), Team, Project, CostCenter. Enable AWS Cost Allocation Tags in the Billing console so these appear in Cost Explorer. Set up budget alerts per team and per project — the first time a team sees their individual spend, consumption behavior changes.