Most companies overspend on AWS. Not by a little — by 30 to 40 percent. That is not a guess. Gartner, Flexera, and every FinOps report published in the last three years converge on the same number: roughly a third of cloud spend is waste.
For an Indian SaaS company running a monthly AWS bill of Rs 10,00,000, that translates to Rs 3,00,000 to Rs 4,00,000 per month going straight into the drain. That is Rs 36,00,000 to Rs 48,00,000 per year — enough to fund two senior engineers or an entire QA team.
The frustrating part? AWS cost optimization is not technically difficult. It is operationally neglected. Teams provision resources during a launch rush, never revisit them, and the bill compounds quietly month after month.
This guide covers the ten most common cost leaks we find during AWS audits, a step-by-step process to audit your own bill, and a framework for deciding when to handle optimization yourself versus bringing in a managed FinOps team.
The 10 Biggest AWS Cost Leaks (and How to Fix Each One)
1. Idle and Unused Resources
This is the lowest-hanging fruit. Every AWS account we audit has at least a few of these:
- Unattached Elastic IPs: AWS charges approximately Rs 300 per month (about $3.60) for each Elastic IP that is allocated but not associated with a running instance. One forgotten EIP is trivial. Fifteen of them across three accounts adds up to Rs 4,500 per month.
- Old EBS Snapshots: Snapshots accumulate silently. A typical production account generates snapshots daily via backup policies. If retention is not configured, you end up with hundreds of snapshots costing Rs 1.70 per GB per month. We have seen accounts with 5 TB of orphaned snapshots — that is Rs 8,500 per month for data nobody will ever restore.
- Unattached EBS Volumes: When an EC2 instance is terminated, its EBS volumes do not always go with it. An unattached 500 GB gp3 volume costs roughly Rs 3,400 per month.
- Stopped instances with attached storage: A stopped EC2 instance does not incur compute charges, but its EBS volumes still do. Teams often stop instances “temporarily” and forget about them for months.
Action: Open the AWS Cost Optimization Hub (available in the billing console since late 2023). It flags unused resources automatically. Community members on Reddit report that the Cost Optimization Hub alone has helped reduce costs by 20 percent just by surfacing resources that teams did not know existed.
2. Over-Provisioned EC2 Instances
This is the single largest source of waste in most accounts. The pattern is predictable: a developer provisions an m5.2xlarge for a workload that actually peaks at 15 percent CPU utilization. Nobody downsizes it because nobody is watching.
How to identify over-provisioned instances:
- Open AWS Compute Optimizer (free for the first 30 days of recommendations)
- Look at instances where peak CPU stays below 40 percent over a 14-day period
- Check memory utilization via CloudWatch (requires the CloudWatch agent — CPU alone is misleading)
- Review network throughput to ensure you are not bottlenecked there
How to right-size without breaking things:
The key rule from experienced AWS operators: resize cautiously, one step at a time. Do not jump from an m5.4xlarge to an m5.large in one move. Step down one size, monitor for a week, then reassess.
- m5.2xlarge to m5.xlarge saves roughly Rs 7,500 per month per instance (Mumbai region)
- Multiply that across ten over-provisioned instances and you are looking at Rs 75,000 per month
Consider switching to Graviton-based instances (m7g, c7g, r7g families). They offer 20 to 25 percent better price-performance than equivalent Intel instances for most workloads.
3. Missing Reserved Instances and Savings Plans
If you have stable, predictable workloads and you are paying On-Demand pricing, you are overpaying by 30 to 72 percent depending on the commitment term.
Quick comparison for an m5.xlarge in Mumbai (ap-south-1):
| Pricing Model | Monthly Cost (approx) | Savings vs On-Demand |
|---|---|---|
| On-Demand | Rs 12,500 | — |
| 1-Year No Upfront Savings Plan | Rs 8,750 | 30% |
| 1-Year All Upfront RI | Rs 7,500 | 40% |
| 3-Year All Upfront RI | Rs 4,400 | 65% |
When to use which:
- Savings Plans for flexibility across instance families and regions
- Reserved Instances for workloads locked to a specific instance type and region
- Neither for variable workloads — use Spot or On-Demand instead
Start by analyzing your On-Demand usage in Cost Explorer. Filter by instance type and look for instances that have been running continuously for 3 or more months. Those are candidates.
4. NAT Gateway Costs
NAT Gateway pricing is one of the most overlooked line items. AWS charges Rs 3.80 per GB of data processed through a NAT Gateway, plus Rs 375 per month per gateway for the hourly charge.
A moderately busy application pushing 500 GB per month through NAT Gateways pays roughly Rs 2,275 just in data processing charges. Some of our clients have been shocked to find NAT Gateway costs exceeding Rs 50,000 per month.
Fixes:
- Use VPC Endpoints for S3 and DynamoDB traffic. Gateway endpoints for these services are free. If your application frequently reads from or writes to S3 (logs, backups, data pipelines), this single change can cut NAT costs by 40 to 60 percent.
- Place resources in public subnets when they legitimately need internet access, rather than routing through NAT.
- Use a NAT Instance instead of a NAT Gateway for dev/staging environments. A t3.micro NAT instance costs roughly Rs 600 per month versus Rs 375 for the gateway alone (before data charges).
- Audit what is actually going through NAT. VPC Flow Logs can reveal surprising traffic patterns.
5. S3 Lifecycle Policies Not Configured
S3 Standard costs Rs 1.91 per GB per month in Mumbai. S3 Intelligent-Tiering, Glacier Instant Retrieval, and Glacier Deep Archive cost a fraction of that.
Most teams store everything in S3 Standard indefinitely. Application logs from two years ago, old deployment artifacts, database backups from six months ago — all sitting in the most expensive tier.
A sensible lifecycle policy for most applications:
- Days 0-30: S3 Standard (frequent access)
- Days 30-90: S3 Standard-IA (Rs 1.02 per GB per month)
- Days 90-180: S3 Glacier Instant Retrieval (Rs 0.34 per GB per month)
- Days 180+: S3 Glacier Deep Archive (Rs 0.08 per GB per month)
For an account with 10 TB of S3 data where 80 percent is older than 90 days, proper lifecycle policies can reduce S3 costs from approximately Rs 19,100 per month to under Rs 5,000 per month.
6. CloudWatch Log Retention Set to “Never Expire”
CloudWatch Logs charges Rs 4.24 per GB for ingestion and Rs 2.54 per GB per month for storage. The default retention is set to “Never expire.”
This is one of those costs that starts small and grows relentlessly. An application logging 5 GB per day accumulates 150 GB per month. After a year, you are storing 1.8 TB of logs at Rs 4,572 per month in storage alone — for logs that nobody will ever query beyond the last two weeks.
Fix retention policies immediately:
- Go to CloudWatch > Log Groups
- For each log group, set a retention period: 7 days for debug logs, 30 days for application logs, 90 days for audit logs
- For long-term log retention, export to S3 with lifecycle policies (dramatically cheaper than CloudWatch storage)
As seasoned AWS practitioners note: fix retention policies first. It is the one change that keeps saving money every single month going forward.
7. Data Transfer Costs
AWS data transfer pricing is, as many in the community describe it, intentionally confusing. Here are the key rules:
- Inbound traffic: Free
- Outbound to internet: Rs 7.65 per GB (first 10 TB per month in Mumbai)
- Cross-AZ traffic: Rs 0.85 per GB in each direction
- Cross-region traffic: Rs 1.70 per GB
- Same-AZ traffic (using private IPs): Free
The cross-AZ charges are the hidden killer. A microservices architecture where services communicate across availability zones can generate thousands of rupees in data transfer charges that never show up as a distinct line item.
Fixes:
- Use VPC Endpoints (mentioned above, but worth repeating — this eliminates data transfer charges for S3 and DynamoDB)
- Place communicating services in the same AZ when high availability is not critical (dev/staging environments)
- Use CloudFront for content delivery instead of serving directly from S3 or EC2. CloudFront data transfer is cheaper than direct EC2 egress.
- Compress API responses. Enabling gzip or brotli compression on your application reduces data transfer volume by 60 to 80 percent for text-based responses.
- Review cross-region replication. Is it actually needed for all data, or can you replicate selectively?
8. Unused Elastic Load Balancers
Each Application Load Balancer costs a minimum of Rs 1,875 per month (the hourly charge) plus LCU charges. Classic Load Balancers cost similarly.
Load balancers get created for testing, for staging environments that were decommissioned, or for services that were migrated elsewhere. They sit idle, processing zero requests, still billing.
Audit process:
- Go to EC2 > Load Balancers
- Check the “Healthy host count” metric for each ALB. If it is zero, the load balancer has no targets.
- Check “RequestCount” in CloudWatch. If an ALB has had zero requests for 30 days, it is a candidate for deletion.
- Verify that no DNS records point to the load balancer before deleting it.
Three unused ALBs cost Rs 5,625 per month — Rs 67,500 per year for doing nothing.
9. Over-Provisioned RDS Instances
RDS instances follow the same over-provisioning pattern as EC2, but the costs are higher because RDS pricing includes the database license (for commercial engines) and multi-AZ replication charges.
A db.r5.2xlarge Multi-AZ PostgreSQL instance in Mumbai costs approximately Rs 50,000 per month. If your database CPU averages 10 percent and you are using 40 GB of a 500 GB provisioned volume, you are paying for capacity you do not use.
Optimization steps:
- Check Performance Insights (free for 7 days of retention). Look at CPU, memory, and I/O wait. If none of these are bottlenecked, the instance is over-provisioned.
- Downsize the instance class. Moving from db.r5.2xlarge to db.r5.xlarge saves roughly Rs 25,000 per month.
- Switch to Aurora Serverless v2 for variable workloads. It scales from 0.5 ACU to your configured maximum, meaning you pay only for what you use during off-peak hours.
- Review Multi-AZ necessity. Dev and staging databases rarely need Multi-AZ. Disabling it halves the RDS cost for those environments.
- Right-size storage. If you provisioned 1 TB of gp3 storage but are using 100 GB, you are paying for 900 GB of unused capacity. RDS supports storage auto-scaling — enable it and start with a smaller allocation.
10. No Spot Instances for Dev/Test Workloads
Spot Instances offer 60 to 90 percent savings over On-Demand. The tradeoff is that AWS can reclaim them with a two-minute warning. This makes them unsuitable for production databases but perfectly fine for:
- Development and testing environments
- CI/CD build runners
- Batch processing and data pipeline jobs
- Load testing
- Machine learning training jobs
Example savings:
An m5.xlarge On-Demand in Mumbai costs approximately Rs 12,500 per month. The same instance as Spot costs roughly Rs 3,750 per month — a saving of Rs 8,750 per instance per month.
If your team runs five dev/test instances, switching to Spot saves Rs 43,750 per month or Rs 5,25,000 per year.
Best practices for Spot:
- Use Spot Fleet or EC2 Auto Scaling with mixed instance policies
- Diversify across at least three instance types to reduce interruption frequency
- Use Spot placement scores to find AZs with the lowest interruption rates
- Implement graceful shutdown handlers for the two-minute interruption notice

How to Audit Your Own AWS Bill: A Step-by-Step Process
Before applying any of the fixes above, you need a clear picture of where your money is going. The first step, as experienced practitioners consistently advise, is to study the AWS billing console to identify your most expensive services and API calls.
Step 1: Enable Cost Explorer (if Not Already Active)
Go to the AWS Billing Console > Cost Explorer. If it is not enabled, activate it. It takes 24 hours for data to populate on first activation.
Step 2: Identify Your Top Five Cost Drivers
In Cost Explorer, set the time range to the last three months. Group by “Service.” This gives you the high-level breakdown. For most accounts, the top five services account for 80 to 90 percent of the bill.
Common top services: EC2 (including EBS), RDS, S3, Data Transfer, and either Lambda, CloudFront, or ElastiCache.
Step 3: Drill Into Each Top Service
For each of the top five services:
- Group by “Usage Type” to see exactly what is being charged
- Group by “Tag” (if you have cost allocation tags enabled) to see which team or project is responsible
- Look for sudden cost increases — these often indicate a runaway resource or misconfiguration
Step 4: Run AWS Trusted Advisor Checks
Trusted Advisor (available with Business or Enterprise Support plans) provides automated checks for:
- Idle load balancers
- Underutilized EC2 instances
- Unassociated Elastic IPs
- Idle RDS instances
- S3 bucket permissions (bonus: security win)
If you are on a Developer or Basic support plan, you still get access to the core checks. For full cost optimization checks, you need Business support or higher.
Step 5: Check AWS Compute Optimizer
Compute Optimizer analyzes your instance usage patterns and recommends right-sizing options. It covers EC2, EBS, Lambda, and ECS on Fargate. Enable it at no additional cost.
Step 6: Review the Cost Optimization Hub
Launched in 2023, the Cost Optimization Hub aggregates recommendations from Compute Optimizer, Trusted Advisor, and other AWS services into a single dashboard. It provides an estimated monthly savings figure for each recommendation, making it easy to prioritize.
Step 7: Create a Savings Action Plan
Rank every opportunity by estimated monthly savings. Start with the highest-impact, lowest-risk items:
- Delete unused resources (zero risk, immediate savings)
- Set retention policies on CloudWatch Logs and S3 (low risk)
- Purchase Savings Plans or RIs for stable workloads (medium risk, requires commitment)
- Right-size instances (medium risk, requires testing)
- Implement Spot for non-production workloads (medium risk, requires architecture changes)
Step 8: Set Up AWS Budgets and Alerts
After implementing changes, set up budgets to catch cost regressions:
- Create a monthly budget equal to your target spend
- Set alerts at 50 percent, 80 percent, and 100 percent thresholds
- Use anomaly detection (available in Cost Explorer) to catch unexpected spikes early
When to DIY vs. Hire a Managed FinOps Team
Handle It Yourself When:
- Your monthly AWS bill is under Rs 5,00,000
- You have a DevOps engineer with time to dedicate 4 to 8 hours per month
- Your architecture is straightforward (a few EC2 instances, one RDS database, S3)
Bring in a Managed Team When:
- Your monthly bill exceeds Rs 5,00,000 and you lack a clear cost breakdown
- You are running multi-account environments with complex networking
- Your team lacks bandwidth for monthly cost reviews
- You need someone to handle Reserved Instance and Savings Plan purchasing strategy
At ZenoCloud, we have completed 200+ AWS optimizations with an average savings of 40%. The typical engagement starts with a full audit, produces a prioritized action plan within 48 hours, and moves into implementation. We also have a pool of AWS credits that can reduce your effective bill further.
The difference between a DIY audit and a professional one comes down to depth. A DevOps engineer running Cost Explorer will catch the obvious waste. A dedicated FinOps team will find the architectural changes — VPC endpoint placement, Spot fleet strategies, cross-AZ traffic reduction — that produce compounding savings month after month.

Quick-Reference Checklist: AWS Cost Optimization
Use this checklist for a quarterly review of your AWS spend:
- Delete unattached EBS volumes, unused Elastic IPs, and orphaned snapshots
- Review and right-size EC2 instances where CPU averages below 40 percent
- Evaluate Reserved Instances or Savings Plans for workloads running 3+ months
- Add VPC Endpoints for S3 and DynamoDB to reduce NAT Gateway costs
- Configure S3 lifecycle policies to transition data to cheaper storage tiers
- Set CloudWatch Log retention to 7, 30, or 90 days based on log type
- Audit data transfer paths — eliminate unnecessary cross-AZ and cross-region traffic
- Delete unused load balancers with zero request counts
- Right-size or switch to Aurora Serverless v2 for underutilized RDS instances
- Move dev/test workloads to Spot Instances
Each item on this list takes 15 to 60 minutes to investigate and implement. Combined, they typically recover 30 to 40 percent of the total bill.
Get a Free AWS Cost Audit
If your AWS bill has been growing faster than your business, we can help. We offer a free, no-obligation AWS cost audit. Here is how it works:
- You grant us read-only access to your AWS billing data (we never touch your infrastructure)
- We analyze your account within 48 hours
- You receive a detailed report with prioritized savings recommendations and estimated monthly impact in INR
- You keep the report regardless of whether you engage us further
No sales pitch. No lock-in. Just a clear picture of where your AWS money is going and how to get it back.