15 AWS Cost Savings We Find in Every Audit
The exact cost leaks PlatOps finds in every AWS environment—idle resources, oversized instances, NAT gateway waste, S3 lifecycle gaps, and more—with typical savings per item.
The average AWS bill contains between 20% and 35% in recoverable waste. That's not an estimate from a cloud vendor trying to sell you a commitment—it's the number that shows up consistently when we run a cost audit on a new client environment.
Not because engineers are careless. Because AWS pricing is genuinely complicated, accounts accumulate technical debt, and cost visibility degrades over time. A $50 instance that made sense 18 months ago is still running because nobody thought to check. A NAT gateway is routing traffic that could move through a VPC endpoint for free. A gp2 volume attached to a stopped instance charges the same per gigabyte whether it's in active use or sitting idle.
This post covers the 15 specific items we flag in nearly every AWS cost audit—with typical savings, the tools that surface them, and what remediation looks like. If you want to run this on your own account, everything here is actionable with native AWS tooling and a free Tier account for third-party tools.
Before You Start: Your Baseline Tools
Two tools give you most of the visibility you need before touching anything:
AWS Cost Explorer — built-in, free. Sorts spend by service, region, resource tag, and linked account. Surfaces the largest spend buckets and month-over-month trends. Start here for every audit.
AWS Compute Optimizer — free. Analyzes EC2, ECS, Lambda, and EBS metrics against actual utilization, then issues right-sizing recommendations. Connects to Cost Explorer to translate recommendations into dollar impact.
Trusted Advisor — free checks available on Business and Enterprise support plans. Covers low-utilization EC2, idle RDS, underutilized EBS volumes, and unassociated Elastic IPs.
For deeper analysis, Infracost and Spot.io (Elastigroup) are the third-party tools we reach for most often.
The 15 Findings
1. Idle EC2 Instances
Typical savings: $200–$4,000/month per environment
Instances that have been running for months with CPU utilization consistently under 5% and near-zero network I/O. Common causes: dev/test environments that never get torn down, staging servers that outlasted the feature they were staging, and forgotten proof-of-concept deployments.
AWS Compute Optimizer flags these automatically. The fix is either terminating the instance (after confirming with the owner) or snapshotting the EBS volume and stopping it. Stopped instances do not incur instance-hour charges—only EBS storage charges, which are typically 80–90% cheaper.
How to find: Cost Explorer → EC2-Instances service → filter by "Low Utilization" tag. Compute Optimizer → EC2 dashboard → look for "Terminate" recommendations.
2. Oversized EC2 Instance Types
Typical savings: 30–50% of EC2 line item
The most common pattern: an application was deployed on an m5.2xlarge because the engineer estimated headroom, it turned out not to need it, and nobody revisited the sizing. Compute Optimizer will show you the P99 CPU and memory utilization and recommend the smallest instance type that accommodates actual peak load with headroom.
A move from m5.2xlarge ($0.384/hr) to m5.large ($0.096/hr) for a single instance saves $2,100 per year. Multiply across a typical environment with 20–50 EC2 instances, and right-sizing is usually the single largest lever in an audit.
| Instance Type | Hourly Rate | Annual Cost |
|---|---|---|
| m5.2xlarge | $0.384 | $3,363 |
| m5.xlarge | $0.192 | $1,682 |
| m5.large | $0.096 | $841 |
| m5.medium | $0.048 | $420 |
How to find: AWS Compute Optimizer → EC2 instances → filter for "Over-provisioned" findings.
3. Missing Reserved Instances or Savings Plans
Typical savings: 30–60% on covered compute
Reserved Instances (RIs) and Compute Savings Plans are the highest-leverage cost control available on AWS—and the most consistently underused by teams that haven't made a deliberate commitment to FinOps.
If you have workloads with predictable, steady-state compute requirements (production APIs, data pipelines, always-on services), paying on-demand rates is leaving 30–60% of that spend on the table. A 1-year no-upfront Compute Savings Plan typically saves 30–37% versus on-demand. A 3-year partial-upfront RI on a stable instance type saves 50–60%.
A company running $20,000/month in on-demand EC2 for predictable workloads is overpaying by roughly $7,000–$10,000 per month versus a covered equivalent.
How to find: AWS Cost Explorer → Savings Plans → Recommendations. Look for coverage below 70% on stable services.
4. NAT Gateway Data Processing Charges
Typical savings: $500–$5,000/month
NAT gateways charge $0.045 per GB of data processed—in addition to the $0.045/hr per-AZ instance charge. In environments with high-volume egress traffic (log shipping, S3 backups, API calls to external services), this adds up fast. We regularly see NAT gateway processing fees exceeding the cost of the underlying EC2 instances.
The primary fix: move AWS service traffic to VPC endpoints, which bypass the NAT gateway entirely. S3 and DynamoDB gateway endpoints are free. Interface endpoints for other services (ECR, Secrets Manager, SSM) cost $0.01/hr per AZ—almost always cheaper than equivalent NAT gateway processing fees for those services.
A second fix: ensure traffic between resources in the same VPC routes internally rather than hairpinning through the NAT gateway. Misconfigured routing tables are a common cause.
How to find: Cost Explorer → VPC service → filter for NatGateway. If NAT gateway data processing exceeds $200/month, a routing audit is warranted.
5. Unattached EBS Volumes
Typical savings: $50–$500/month
When an EC2 instance is terminated, the default behavior depends on how the volume was created. Volumes created separately and attached to an instance persist after termination. Over time, environments accumulate detached volumes that haven't been accessed in months.
gp3 volumes cost $0.08/GB/month. A 500GB volume left detached costs $40/month indefinitely. A typical environment has between 5 and 30 orphaned volumes. Quick fix: snapshot and delete.
How to find: EC2 console → Volumes → filter for "Available" state. Trusted Advisor also surfaces this under Cost Optimization.
6. gp2 vs gp3 Volume Migrations
Typical savings: 20% of EBS costs, no performance loss
gp3 is AWS's current-generation general-purpose SSD volume type. It's 20% cheaper than gp2 per GB and delivers better baseline performance (3,000 IOPS vs 3,000 for gp2, but gp3 IOPS are provisioned independently of volume size). Migrating from gp2 to gp3 requires zero downtime and no data movement—it's a volume type change.
Despite this, most AWS environments created before 2022 still run significant EBS capacity on gp2. We've seen accounts with $8,000/month in gp2 volumes that could be $6,400/month on gp3 with a one-line Terraform change per volume.
How to find: EC2 console → Volumes → filter Type = gp2. Count the capacity and multiply by $0.016/GB to get the savings from switching to gp3 (which costs $0.08/GB vs $0.10/GB for gp2).
7. S3 Missing Lifecycle Policies
Typical savings: $300–$3,000/month
S3 Standard storage costs $0.023/GB/month. S3 Standard-IA costs $0.0125/GB/month. S3 Glacier Instant Retrieval costs $0.004/GB/month. S3 Glacier Deep Archive costs $0.00099/GB/month.
Data that was uploaded to Standard and never accessed again is incurring Standard pricing indefinitely. Common offenders: application logs, CloudTrail logs, archived database backups, old deployment artifacts, and infrequently accessed data lakes.
Lifecycle policies automate the tier transition. A typical policy: transition to Standard-IA after 30 days, Glacier Instant after 90 days, Deep Archive after 365 days, and delete after a defined retention window. A 10TB log archive on Standard ($230/month) drops to under $10/month on Deep Archive.
How to find: S3 Storage Lens → filter for buckets with zero lifecycle rules and large size. Cost Explorer → S3 → filter for "StandardStorage" class vs total spend.
8. RDS Instances Running Without Load
Typical savings: $200–$2,000/month
RDS instances charge by the hour whether they have active connections or not. Staging databases, QA environments, and development databases that run 24/7 but are only accessed during business hours are common candidates for scheduled stop/start automation.
Stopping an RDS instance for 16 hours per day (off-hours + weekends) reduces the instance cost by roughly 57%. An RDS db.m5.large at $0.19/hr costs $1,664/year running continuously; with off-hours shutdown it costs $714/year.
Note: RDS auto-stop (available for Aurora Serverless and supported instance types) will restart an instance automatically when connections arrive—so developer workflows don't break.
How to find: RDS → Enhanced Monitoring → look for instances with zero connections during off-hours for 30+ days. AWS Instance Scheduler can automate stop/start.
9. Unused Elastic IPs
Typical savings: $43–$150/month
AWS charges $0.005/hr for Elastic IP addresses not associated with a running EC2 instance. This is intentional—the charge is designed to discourage IP hoarding. What it means in practice: every time an instance is terminated and its EIP is left unattached, AWS starts charging $3.60/month for a resource doing nothing.
A typical environment has between 3 and 20 unassociated EIPs. The fix is immediate: release EIPs that aren't in active use.
How to find: EC2 console → Elastic IPs → filter for "Not associated." Trusted Advisor also surfaces this.
10. CloudWatch Log Group Retention Not Set
Typical savings: $100–$800/month
CloudWatch Logs storage costs $0.03/GB/month. By default, log group retention is set to "Never expire." Without retention policies, logs accumulate indefinitely. A high-volume application writing 10GB/day of logs with no retention policy is storing 300GB of logs per month—indefinitely. After 12 months, that's 3.6TB at $108/month, just for logs you probably don't need after 30 days.
Setting 30-day retention on non-compliance log groups is a five-minute change with immediate impact on the next billing cycle.
How to find: CloudWatch → Log Groups → filter for "Never expire" retention. AWS Config rule cw-loggroup-retention-policy-check will flag this automatically.
11. Lambda Functions Over-Provisioned for Memory
Typical savings: 20–40% of Lambda costs
Lambda pricing is calculated on GB-seconds: (memory allocated in GB) × (execution duration in seconds). A function allocated 1024MB that consistently uses 128MB is paying 8x what it needs to pay on the memory dimension.
AWS Lambda Power Tuning (an open-source tool deployed as a Step Functions state machine) runs your function at different memory configurations and reports the cost-per-invocation. Most functions land at 50–70% of their originally allocated memory. For high-volume Lambda workloads—event processing, API backends, ETL jobs—this is a meaningful reduction.
How to find: Lambda → filter by invocation count → cross-reference with CloudWatch Insights for max_memory_used vs memory_size. AWS Compute Optimizer also covers Lambda functions.
12. Data Transfer: Same-Region Cross-AZ Traffic
Typical savings: $200–$2,000/month
AWS charges $0.01/GB for traffic that crosses Availability Zone boundaries within a region—in both directions. This is widely understood but consistently underestimated. A microservices architecture with 10 services each calling 3 others, running across 3 AZs, can generate hundreds of GB per day in cross-AZ traffic.
The fix isn't always architectural—sometimes it's adding an AZ affinity annotation to Kubernetes pods or load balancer target groups to prefer same-AZ routing. For services where latency tolerance allows, deploying a cache layer that serves cross-AZ requests eliminates the traffic at the source.
How to find: Cost Explorer → EC2-Other service → filter for DataTransfer-Regional. VPC Flow Logs + Athena queries can identify the specific service pairs generating the traffic.
13. Idle Load Balancers
Typical savings: $20–$200/month per LB
ALBs and NLBs charge $0.008/hr (ALB) or $0.006/hr (NLB) plus a capacity unit charge based on traffic. An ALB with no healthy targets or zero traffic over 30 days costs $5.84/month in base charges—small per unit, but environments regularly accumulate 5–20 idle load balancers from deprecated services, abandoned feature branches, and migrated applications.
How to find: EC2 → Load Balancers → sort by "Active Flow Count" (NLB) or "RequestCount" (ALB). Look for zero or near-zero traffic over 30+ days. Trusted Advisor surfaces idle load balancers.
14. Oversized RDS Instance Types
Typical savings: 30–50% of RDS line item
RDS instance right-sizing follows the same logic as EC2 right-sizing but is often neglected because database sizing feels riskier to change. Compute Optimizer analyzes RDS instance metrics and issues recommendations—with the same "Over-provisioned" flag it uses for EC2.
A db.r5.2xlarge running at 15% CPU with 8GB of active memory usage should be a db.r5.large. The move saves $1,500–$2,500/year per instance. For environments running 5+ RDS instances, this is consistently a five-figure annual finding.
How to find: AWS Compute Optimizer → RDS instances → filter for "Over-provisioned."
15. ECR Images Never Cleaned Up
Typical savings: $50–$400/month
Amazon ECR charges $0.10/GB/month for private image storage. Container registries accumulate images aggressively: every CI build pushes a new image, tags pile up, and without a lifecycle policy, every image from the past two years is still in the registry. A registry with 500GB of accumulated images costs $50/month—for artifacts that are never pulled.
ECR lifecycle policies let you expire untagged images after N days and retain only the last N tagged images per repository. Setting expire untagged images after 7 days and keep last 10 tagged images reduces most registries to 10–20GB within a week.
How to find: ECR console → Repositories → check "Repository size" column. Any repository over 5GB without a lifecycle policy is worth reviewing.
Typical Total Savings by Environment Size
| Monthly AWS Spend | Typical Waste % | Recoverable Savings |
|---|---|---|
| $5,000–$15,000 | 25–35% | $1,250–$5,250/month |
| $15,000–$50,000 | 20–30% | $3,000–$15,000/month |
| $50,000–$150,000 | 18–25% | $9,000–$37,500/month |
| $150,000+ | 15–22% | $22,500–$33,000+/month |
The percentage decreases as spend increases because larger teams tend to have more FinOps maturity. But the absolute dollars at stake grow—and the items with the largest line-item impact (Savings Plans, right-sizing, NAT gateway routing) scale proportionally with spend.
Running This Audit Yourself
A DIY audit using native AWS tooling can surface most of these findings:
- Cost Explorer — identify largest service line items and month-over-month trends
- Compute Optimizer — pull EC2, EBS, RDS, and Lambda right-sizing recommendations
- Trusted Advisor — run the Cost Optimization category checks
- S3 Storage Lens — review bucket-level storage class and lifecycle policy coverage
- CloudWatch Logs — export a list of log groups sorted by stored bytes with no retention policy
Allow 8–12 hours for a thorough first pass on a mid-size environment. The primary time investment is triaging recommendations—some instances flagged as oversized are deliberately headroomed for burst handling; not every recommendation should be acted on without validating the use case with the service owner.
What a Managed Audit Adds
A self-service audit using Compute Optimizer and Cost Explorer will surface the obvious findings. What it misses:
- Architectural waste — cross-AZ traffic patterns, NAT gateway routing, data transfer optimization
- Reserved Instance strategy — coverage analysis, commitment risk modeling, portfolio optimization
- Tag hygiene and showback — identifying untagged resources whose costs can't be attributed to a team or service
- Right-sizing validation — distinguishing over-provisioned resources from deliberately headroomed ones without paging your engineers
Our AWS Cloud Cost Optimization service includes a 2-week audit covering all 15 categories above, plus a remediation plan with prioritized recommendations ranked by savings impact and implementation effort.
Most teams that go through this audit recover enough to pay for a managed cloud service—with budget left over. The question is usually not whether the savings exist, but how much engineer time you want to spend finding them.
Get a free cost assessment and we'll run the audit on your AWS account, identify the top 5 savings opportunities by dollar impact, and tell you exactly what it would take to capture them.
Questions about a specific AWS service or cost pattern in your environment? Reach out directly and we'll take a look.
Put this into practice
Get a free assessment of your current security and infrastructure posture, or check your email security in 30 seconds.
Related Services
Related Articles
Kubernetes Cost Optimization: How to Cut Your K8s Bill by 40%
A practitioner's guide to cutting Kubernetes costs by 40%—resource requests, right-sizing pods, spot nodes, cluster autoscaler, namespace quotas, idle workload detection, and cost monitoring tools.
AWS vs Azure vs GCP: Which Cloud is Right for Your Business?
An unbiased comparison of the major cloud providers, focusing on security features, compliance support, and total cost of ownership for SMBs.
AWS vs GCP vs Azure: Which is Best for HIPAA?
Comparing AWS, GCP, and Azure for HIPAA compliance: BAA availability, eligible services, real costs, and which cloud platform fits your company size.
Get articles like this in your inbox
Practical security, infrastructure, and DevOps insights for teams in regulated industries. Published weekly.