· nervico-team · artificial-intelligence · 18 min read
AWS Cost Optimization: A Practical Guide to Reducing Your Cloud Bill
Complete AWS cost optimization guide: native tools, savings strategies by service, Reserved Instances vs Savings Plans, and mistakes that inflate your bill.
Organizations waste an average of 32% of their cloud spend, according to Flexera’s 2025 State of the Cloud Report. That number has barely moved in five years, hovering between 30% and 35% despite an entire ecosystem of cost management tools.
For a company spending $10,000 per month on AWS, that means $3,200 every month evaporates with zero business value. Over a year, that is $38,400 in pure waste. And the problem compounds: without deliberate optimization, AWS bills typically grow 20-30% year-over-year as teams provision new resources without decommissioning old ones.
This guide covers the concrete strategies, tools, and processes that actually reduce AWS costs. No generic advice. No “turn off the lights when you leave” platitudes. Real tactics with real numbers.
AWS Native Cost Management Tools
Before reaching for third-party solutions, AWS provides a surprisingly capable set of cost management tools included at no additional charge with every account. Most teams use one or two of them superficially. Using all five systematically is where the real savings begin.
AWS Cost Explorer
Cost Explorer is your primary visibility tool. It provides historical spend data going back 12 months with filtering by service, region, account, tag, and instance type.
What makes it actually useful:
- Daily granularity: You can spot spend anomalies within 24 hours instead of discovering them at the end of the month.
- Forecasting: Based on historical patterns, Cost Explorer projects your bill for the current month and next 12 months. Accuracy is typically within 5-10% for stable workloads.
- Reservation coverage reports: Shows what percentage of your eligible usage is covered by Reserved Instances or Savings Plans, and exactly how much you are leaving on the table.
- Right-sizing recommendations: Identifies EC2 instances running at consistently low utilization (typically below 40% CPU average over 14 days) and suggests smaller instance types.
Practical tip: Create a saved report that groups costs by service and filters to the last 30 days. Review it weekly. Most cost surprises become obvious patterns when you look at the data regularly.
AWS Budgets
Budgets turn passive cost monitoring into proactive alerting. You set a dollar threshold, and AWS notifies you when actual or forecasted spend exceeds it.
Configuration that works:
- Set a budget at 80% of your expected monthly spend as an early warning.
- Set a second budget at 100% as a hard alert.
- Set a third budget based on forecasted spend, so you get warned before overage actually happens.
- Configure alerts to go to both a Slack channel and email. Individual emails get lost. Slack channels get reviewed.
The real value is not the budget itself. It is the organizational habit of paying attention to cloud spend before it becomes a crisis.
AWS Trusted Advisor
Trusted Advisor runs automated checks across five categories: cost optimization, performance, security, fault tolerance, and service limits. The cost optimization checks alone typically identify 10-15% in potential savings on a first audit.
Key cost checks:
- Low-utilization EC2 instances: Identifies instances with average CPU utilization below 10% over the past 14 days.
- Idle load balancers: Load balancers with no active backend instances or zero requests over seven days.
- Unassociated Elastic IP addresses: Each unattached EIP costs $3.65/month. Small individually, but companies with dozens of them are spending hundreds annually on nothing.
- Underutilized EBS volumes: Volumes with very low read/write operations, suggesting they are attached to stopped or idle instances.
Important note: The full set of Trusted Advisor checks requires a Business or Enterprise support plan (starting at $100/month or 10% of monthly spend). For smaller accounts, the free tier checks still cover the most impactful cost optimizations.
AWS Compute Optimizer
Compute Optimizer goes deeper than Cost Explorer’s right-sizing recommendations. It analyzes actual utilization patterns across EC2, Auto Scaling groups, Lambda functions, and EBS volumes using machine learning models trained on billions of data points from other AWS customers.
What it tells you:
- Whether your instances are over-provisioned, under-provisioned, or optimized.
- Specific instance type recommendations with projected cost and performance impact.
- For Lambda functions, whether your memory allocation is too high or too low relative to actual execution patterns.
Example: A team running m5.2xlarge instances (8 vCPUs, 32 GB RAM) at 15% average CPU and 20% memory utilization. Compute Optimizer recommends m5.large (2 vCPUs, 8 GB RAM), saving $0.234/hour per instance. For 10 instances running 24/7, that is $20,500 per year.
Cost Allocation Tags
Tags are the most underrated cost management tool. Without them, you can see that EC2 costs $8,000 per month, but you cannot determine which team, project, or environment is responsible for that spend.
Minimum tagging strategy:
Environment: production, staging, developmentTeam: engineering, data, platformProject: the specific application or serviceOwner: the person or team accountable for the resource
Enforcement matters: Tags are only useful if they are applied consistently. Use AWS Organizations Service Control Policies (SCPs) to prevent resource creation without mandatory tags. Alternatively, use AWS Config rules to flag untagged resources.
Once tags are in place, Cost Explorer can group and filter by any tag, making it possible to answer questions like “How much does the recommendation engine cost us in production versus development?” That visibility changes how teams think about infrastructure decisions.
Reserved Instances vs Savings Plans vs Spot: When to Use Each
The single highest-impact optimization for most AWS accounts is committing to a pricing model that matches your workload characteristics. The difference between On-Demand and committed pricing ranges from 30% to 72%, depending on the commitment type and term.
Reserved Instances
Reserved Instances (RIs) are the original commitment model. You commit to a specific instance type in a specific region for one or three years and receive a discounted hourly rate in return.
Discount structure:
- 1-year, No Upfront: approximately 30-40% savings
- 1-year, All Upfront: approximately 40-45% savings
- 3-year, All Upfront: approximately 60-72% savings
Best for: Databases (RDS), Elasticsearch/OpenSearch clusters, and any workload running the same instance type 24/7 with predictable capacity needs.
Drawback: RIs are tied to a specific instance type and region. If you migrate from m5.xlarge to m6i.xlarge, your RI coverage does not follow (unless you use Convertible RIs, which offer lower discounts).
Savings Plans
Savings Plans, introduced in 2019, offer similar discounts with significantly more flexibility. Instead of committing to a specific instance type, you commit to a dollar amount of compute usage per hour.
Two types:
- Compute Savings Plans: Apply across EC2, Lambda, and Fargate regardless of instance family, size, OS, tenancy, or region. Maximum flexibility.
- EC2 Instance Savings Plans: Apply to a specific instance family in a specific region but cover any size within that family. Slightly higher discounts than Compute Plans.
Discount structure: Similar to RIs. 1-year and 3-year terms with No Upfront, Partial Upfront, and All Upfront options. Savings range from 30% to 66% depending on term and payment.
Best for: Most organizations. Savings Plans cover the majority of use cases with less operational overhead than managing RIs across dozens of instance types.
Spot Instances
Spot Instances provide access to unused EC2 capacity at discounts of up to 90% compared to On-Demand pricing. The catch: AWS can reclaim these instances with a two-minute warning when demand for On-Demand capacity increases.
Best for:
- Batch processing and data pipelines
- CI/CD build runners
- Stateless web servers behind auto-scaling groups (when combined with On-Demand base capacity)
- Machine learning training workloads with checkpointing
- Any workload that can tolerate interruptions
Not suitable for: Databases, single-instance applications, anything where a two-minute termination notice causes data loss or user-facing outages.
Practical approach: Use a diversified Spot strategy across multiple instance types and availability zones. The interruption rate varies dramatically by instance type. Some families see fewer than 5% interruptions per month while others experience 20% or more.
On-Demand
On-Demand pricing is the default and the most expensive option. It should be used intentionally, not by default.
Legitimate use cases:
- Development and testing environments that run only during business hours (combine with scheduling)
- Unpredictable spike capacity above your committed baseline
- Short-lived experiments and prototypes
- New workloads where you haven’t yet established a utilization baseline
Comparison summary:
| Pricing Model | Savings vs On-Demand | Commitment | Flexibility | Best For |
|---|---|---|---|---|
| Reserved Instances | 30-72% | 1-3 years, specific instance | Low | Stable databases, fixed workloads |
| Compute Savings Plans | 30-66% | 1-3 years, dollar amount | High | General compute, mixed workloads |
| EC2 Savings Plans | 33-66% | 1-3 years, instance family | Medium | Known instance family, flexible size |
| Spot Instances | Up to 90% | None | Interruptible | Batch, CI/CD, stateless workers |
| On-Demand | 0% (baseline) | None | Maximum | Dev/test, spikes, new workloads |
Optimization by Service: Where Waste Hides
Every AWS service has its own cost dynamics and optimization levers. Here is where we see the most waste in practice.
EC2: Oversized Instances and Zombie Resources
EC2 is typically the largest line item on an AWS bill, accounting for 30-40% of total spend in most organizations.
Common waste patterns:
- Oversized instances: Teams provision for peak load and never revisit. A t3.2xlarge running at 8% average CPU should be a t3.medium, saving 75%.
- Zombie instances: Instances launched for a one-time task, a demo, or a test that are still running months later. Every organization has them. AWS Cost Explorer’s right-sizing report will not catch instances that should be terminated entirely, only instances that should be smaller.
- Missing Auto Scaling: Static fleets running 24/7 at a capacity designed for peak traffic. If your peak-to-trough ratio exceeds 2:1, Auto Scaling can reduce costs by 30-50% on compute alone.
- Wrong instance generation: Running m5 instances when m6i or m7g (Graviton) instances offer 15-40% better price-performance for the same workload.
Action: Run a weekly report of all instances with average CPU utilization below 20% over the past 14 days. Review each one and either downsize, terminate, or document why it needs to stay.
RDS: Unnecessary Multi-AZ and Unoptimized Storage
RDS databases are the second most common source of overspending.
Waste patterns:
- Multi-AZ in development: Multi-AZ deployment doubles your RDS cost for high availability. Essential in production. Completely unnecessary in development, staging, or QA environments.
- Over-provisioned instances: A db.r5.2xlarge running at 10% CPU with 4 GB of its 64 GB RAM utilized. Downsize to db.r5.large and save 75%.
- Provisioned IOPS when General Purpose (gp3) suffices: gp3 volumes provide 3,000 IOPS baseline at no additional cost. Many workloads running on expensive io1/io2 volumes with 10,000+ provisioned IOPS never actually exceed the gp3 baseline.
- Undeleted snapshots: Automated snapshots are cleaned up automatically, but manual snapshots persist indefinitely. A forgotten 500 GB snapshot costs approximately $10/month. Multiply that by dozens of snapshots across multiple databases.
S3: Lifecycle Policies and Intelligent Tiering
S3 storage costs are insidious because they accumulate gradually. Nobody notices when S3 grows from $200 to $2,000 per month over two years.
Key optimizations:
- S3 Intelligent-Tiering: Automatically moves objects between access tiers based on usage patterns. Objects not accessed for 30 days move to Infrequent Access (40% cheaper). Objects not accessed for 90 days move to Archive Instant Access (68% cheaper). No retrieval fees for Intelligent-Tiering. This is the default choice for any bucket where access patterns are unpredictable.
- Lifecycle policies: For data with known access patterns, explicit lifecycle rules are more cost-effective. Example: move logs to Glacier Flexible Retrieval after 90 days (up to 95% cheaper than Standard), delete after 365 days.
- Incomplete multipart uploads: Multipart uploads that fail or are abandoned leave orphaned parts that accrue storage costs. A single lifecycle rule to abort incomplete multipart uploads after 7 days can save hundreds of dollars per month in high-volume environments.
Lambda: Memory Right-Sizing
Lambda pricing is based on the number of invocations and the duration multiplied by the memory allocated. Most teams set memory at 256 MB or 512 MB by default and never revisit it.
The counterintuitive insight: Increasing Lambda memory sometimes reduces cost because Lambda allocates CPU proportionally to memory. A function with 128 MB runs on a fraction of a vCPU. The same function with 1,024 MB gets a full vCPU, runs 4x faster, and the total cost (duration multiplied by memory) can be lower.
Tool: AWS Lambda Power Tuning is an open-source tool that runs your function at different memory configurations and charts the cost vs. performance trade-off. It takes five minutes to set up and can save 20-40% on high-volume functions.
NAT Gateway: The Silent Budget Killer
NAT Gateway pricing catches many teams off guard. At $0.045 per hour ($32.40/month per gateway) plus $0.045 per GB of data processed, a busy application can easily spend $500-1,000 per month on NAT Gateway alone.
Alternatives:
- VPC Endpoints (Gateway type): Free for S3 and DynamoDB. If your private subnets communicate heavily with S3 (logging, data lakes, backups), a VPC Gateway Endpoint eliminates that NAT Gateway data processing charge entirely.
- VPC Endpoints (Interface type): For other AWS services, Interface Endpoints cost $0.01/hour per AZ plus $0.01/GB. Still cheaper than NAT Gateway for high-volume API calls to services like SQS, SNS, or Secrets Manager.
- NAT Instance: For development environments with low throughput requirements, a t3.nano NAT instance costs approximately $3.80/month versus $32.40 for a NAT Gateway.
Data Transfer: Hidden Cross-AZ and Cross-Region Costs
Data transfer is the most opaque cost category on AWS. Within a single Availability Zone, data transfer is free. But once data crosses an AZ boundary, you pay $0.01/GB in each direction ($0.02/GB round trip). Cross-region transfer is $0.02/GB out.
Where this hurts:
- Microservices communicating across AZs. A service making 10,000 requests per second with 10 KB payloads across AZs costs approximately $500/month in data transfer alone.
- RDS Multi-AZ replication traffic (included for RDS, but not for self-managed databases on EC2).
- Frequent cross-region data sync for disaster recovery.
Mitigation: Where possible, use AZ-affinity routing to keep traffic within the same AZ. For data-heavy internal communication, consider whether the availability benefit of spreading across AZs justifies the transfer cost for that specific service.
FinOps: The Missing Discipline
FinOps, short for Cloud Financial Operations, is the practice of bringing financial accountability to cloud spending. It is not a tool or a one-time audit. It is an ongoing operational discipline.
Why Startups Need FinOps
Most startups treat cloud costs as a fixed expense that gets reviewed quarterly, if at all. The CFO sees a line item. Engineering sees infrastructure. Nobody owns the intersection.
The result is predictable: cloud spend grows faster than revenue, unit economics deteriorate, and by the time it becomes a board-level conversation, there are six to twelve months of accumulated waste to unwind.
The FinOps Cycle
The FinOps Foundation defines three phases:
Inform: Create visibility into who is spending what, and why. This requires cost allocation tags, shared dashboards, and regular reporting. The goal is not to cut costs yet. It is to make costs visible to the people making provisioning decisions.
Optimize: Once you have visibility, identify and execute savings opportunities. Right-sizing, commitment purchases (RIs and Savings Plans), waste elimination, and architecture changes.
Operate: Make cost-awareness part of ongoing operations. Include cost metrics in deployment pipelines. Review unit costs in sprint retrospectives. Make cost a first-class engineering concern, not an afterthought.
Key Metrics: Unit Economics
Aggregate cloud spend is a meaningless number without context. The metrics that matter are unit costs:
- Cost per active user per month: Total infrastructure cost divided by monthly active users. If this number is going up while your user count is stable, you have an efficiency problem.
- Cost per transaction: For transactional systems, what does each API call, order, or payment actually cost in infrastructure?
- Cost per environment: How much does your staging environment cost relative to production? If it is more than 20%, something is wrong.
- Engineering cost of cloud management: How many engineer-hours per month go into managing infrastructure versus building product?
These metrics turn abstract cloud bills into actionable business data. When a product manager can see that a proposed feature will increase cost per user by $0.03, they can make an informed decision about whether the business value justifies it.
Case Study: From $5,000 to $2,100 per Month
This case is a composite based on patterns we see repeatedly in SaaS startups at the 10,000-20,000 user stage.
The Starting Point
A B2B SaaS startup with approximately 15,000 monthly active users. Their AWS bill had grown from $2,000 to $5,000 per month over 18 months without significant new features or user growth. The engineering team of six developers had never performed a formal cost review.
The Audit Findings
EC2 (58% of total spend: $2,900/month):
- Three m5.2xlarge instances running the web application at an average of 12% CPU utilization.
- Two “temporary” instances launched for a load test four months prior, still running.
- No Auto Scaling configured despite a clear daily traffic pattern (peak at 2x baseline).
RDS (22% of total spend: $1,100/month):
- db.r5.xlarge with Multi-AZ enabled in both production and staging.
- Provisioned IOPS (3,000 IOPS) when actual usage averaged 400 IOPS.
- 47 manual snapshots dating back 14 months.
S3 (8% of total spend: $400/month):
- No lifecycle policies. Application logs from two years ago stored in S3 Standard.
- Incomplete multipart uploads accumulating silently.
NAT Gateway (7% of total spend: $350/month):
- All S3 API calls routed through NAT Gateway. No VPC Endpoint configured.
Other (5% of total spend: $250/month):
- Unattached EBS volumes, unused Elastic IPs, idle load balancers.
The Optimization Actions
Week 1: Quick wins (no commitment required)
- Terminated the two zombie EC2 instances. Savings: $340/month.
- Deleted 43 unnecessary RDS snapshots. Savings: $85/month.
- Created S3 lifecycle rules: logs to Glacier after 90 days, delete after 365 days. Savings: $180/month.
- Added S3 VPC Gateway Endpoint. Savings: $220/month.
- Cleaned up unattached EBS volumes and unused Elastic IPs. Savings: $95/month.
Week 2: Right-sizing
- Downsized web application instances from m5.2xlarge to m5.large. Savings: $980/month.
- Switched staging RDS from Multi-AZ to Single-AZ. Savings: $275/month.
- Migrated RDS storage from Provisioned IOPS to gp3. Savings: $180/month.
Week 3: Commitment optimization
- Purchased 1-year Compute Savings Plan covering 80% of the new baseline after right-sizing. Savings: $545/month.
Month 2: Architecture improvements
- Implemented Auto Scaling for the web tier with a minimum of one instance and maximum of three. This further reduced average compute costs during off-peak hours.
The Result
Monthly AWS spend dropped from $5,000 to $2,100, a 58% reduction. The savings fully funded a junior DevOps hire to maintain ongoing optimization as part of their responsibilities.
The key insight: no single action produced the 58% reduction. It was the combination of eliminating waste, right-sizing, and committing to a pricing plan. Each category contributed roughly equally.
5 Quick Wins You Can Apply Today
These actions require no architectural changes, no purchasing commitments, and no management approval. You can execute all five in a single afternoon.
Identify and terminate zombie instances. Open EC2 in the console. Sort by launch date. Any instance older than 90 days with fewer than 5% average CPU utilization is a candidate for termination. Confirm with the team before terminating, but most of these are forgotten experiments.
Enable S3 Intelligent-Tiering on your largest buckets. Go to S3, find your top three buckets by storage size, and change the default storage class to Intelligent-Tiering. For existing objects, create a lifecycle rule to transition all objects to Intelligent-Tiering. Zero risk, automatic savings.
Create a VPC Gateway Endpoint for S3. If any of your private subnets communicate with S3 (and they almost certainly do), create a Gateway Endpoint. It is free, takes five minutes, and eliminates NAT Gateway data processing charges for S3 traffic.
Set up AWS Budgets with alerts. Create a budget for your current monthly spend with alerts at 80% and 100% thresholds. Send notifications to a team Slack channel. This takes ten minutes and prevents future surprises.
Delete unused EBS snapshots and unattached volumes. In the EC2 console, navigate to Elastic Block Store and review Volumes (filter by “available” status, meaning unattached) and Snapshots. Delete anything not associated with an active backup strategy.
Monthly Optimization Checklist
Incorporate these checks into a recurring monthly review. Each item should take no more than 15 minutes, making the entire checklist completable in under three hours.
Review Cost Explorer trends. Compare this month’s spend to the previous month by service. Investigate any service with more than 10% growth that was not expected.
Check Savings Plan and RI coverage. Open the Coverage report in Cost Explorer. If coverage has dropped below 70%, evaluate whether you need to purchase additional commitments.
Run Compute Optimizer recommendations. Review right-sizing suggestions for EC2 and Lambda. Implement any recommendations with projected savings greater than $50/month.
Audit running instances by environment tag. Filter EC2 instances by the Environment tag. Verify that development and staging instances are appropriately sized relative to production (typically 25-50% of production capacity is sufficient).
Review S3 storage growth. Check the top 10 buckets by size. Verify that lifecycle policies are in place and functioning. Look for unexpected growth in any bucket.
Check data transfer costs. In Cost Explorer, filter by “Data Transfer” usage type. Look for unexpected cross-region or cross-AZ charges. Investigate any line item exceeding $100/month.
Review Trusted Advisor findings. Open Trusted Advisor and check the Cost Optimization category. Address any new findings since the last review.
Verify tag compliance. Run an AWS Config rule or manual check to identify resources without mandatory cost allocation tags. Tag or investigate untagged resources.
Review Lambda function metrics. Check the top 10 Lambda functions by invocation count and cost. Run Power Tuning on any function that has not been optimized in the past 90 days.
Update documentation and forecast. Record this month’s optimization actions and savings. Update your 3-month cost forecast based on current trends and planned changes.
Conclusion
AWS cost optimization is not a one-time project. It is an ongoing discipline that compounds over time. The organizations that manage cloud costs effectively share three characteristics: they have visibility into where money goes, they have processes to act on that visibility regularly, and they treat cost as an engineering metric, not just a finance problem.
The strategies in this guide, from native tooling and commitment pricing to service-level optimization and FinOps practices, can reduce most AWS bills by 30-60%. The exact savings depend on how much unoptimized spending exists today, but in our experience, every organization we have audited has found meaningful savings.
Start with the five quick wins this week. Implement the monthly checklist next month. Build toward a FinOps culture over the next quarter. The savings accumulate faster than most teams expect.
If your cloud bill is growing faster than your business and you are not sure where to start, request a free infrastructure audit. We will analyze your current setup, identify the highest-impact optimization opportunities, and give you a prioritized roadmap with projected savings. No commitment required.
Sources:
- AWS. “Amazon EC2 Pricing” and “AWS Savings Plans Pricing.” aws.amazon.com/ec2/pricing and aws.amazon.com/savingsplans/pricing. Accessed February 2026.
- Flexera. “2025 State of the Cloud Report.” flexera.com/blog/cloud/cloud-computing-trends. Published 2025.
- AWS. “AWS Well-Architected Framework - Cost Optimization Pillar.” docs.aws.amazon.com/wellarchitected/latest/cost-optimization-pillar. Accessed February 2026.
- FinOps Foundation. “What is FinOps?” finops.org/introduction/what-is-finops. Accessed February 2026.
- AWS. “AWS Compute Optimizer Documentation.” docs.aws.amazon.com/compute-optimizer. Accessed February 2026.
- AWS. “AWS Cost Management - Getting Started.” aws.amazon.com/aws-cost-management. Accessed February 2026.