GUIDE · UPDATED FEB 2026

AWS Cost Optimization: The Complete Guide

10 strategies that actually reduce your AWS bill. Real scan data. Dollar amounts. CLI commands you can run today.

Last updated: February 2026 · Based on production AWS scans
$284/mo
Found in 1 region, 60 seconds
$1,112/mo
Found across 7 regions
$6,496/mo
Aurora consolidation alone

What is AWS cost optimization?

AWS cost optimization means paying only for the cloud resources you actually use. Not the resources someone spun up six months ago and forgot. Not the oversized database running at 3% CPU. Not the NAT Gateway silently processing $400/month in traffic that could route for free.

Every AWS account accumulates waste. Developers create test environments and move on. Default configurations stay in place because nobody revisits them. Storage tiers from 2020 remain unchanged even though cheaper options exist. The result is a monthly bill that grows 15-30% faster than actual usage.

Cost optimization is not about cutting corners. It is about eliminating waste so your budget goes toward resources that actually run your product. The savings are usually significant. Gartner estimates that organizations waste 27% of their cloud spend on average. In real scans, we consistently find 20-35% in recoverable waste.

Why AWS bills grow out of control

There are five patterns that cause AWS bills to creep up silently.

Orphaned resources

When you terminate an EC2 instance, its EBS volumes do not automatically delete unless you set DeleteOnTermination. Most teams do not. The result: volumes sit unattached for months or years, costing $0.10/GB/month (gp2) with zero purpose. In one production scan, we found an EBS volume unattached for 1,790 days costing $50/month. That is $2,950 burned on nothing.

Default configurations

AWS defaults are designed for correctness, not cost. CloudWatch log groups default to never expire. EBS volumes default to gp2 even though gp3 is 20% cheaper with better performance. RDS instances default to Multi-AZ even for development workloads. Every default left in place is money left on the table.

Over-provisioning

Teams pick an instance size during initial deployment and never revisit it. Traffic patterns change. Codebases get optimized. But the db.r5.2xlarge keeps running at 8% CPU because nobody wants to risk a resize. Across a fleet of RDS and EC2 instances, over-provisioning alone can account for 30-40% of compute spend.

Hidden data transfer costs

NAT Gateway charges $0.045 per GB of processed data. If your Lambda functions or ECS tasks call S3 or DynamoDB through a NAT Gateway, you are paying data processing fees for traffic that could route through a free VPC Gateway Endpoint. One scan found $1,112/month in waste, with NAT Gateway as the largest single contributor.

No automated monitoring

AWS Cost Explorer shows aggregate spend. It does not alert you when someone spins up an RDS instance in a test account and forgets about it. Without automated scanning, waste accumulates silently until someone notices the bill went up 40% and spends a week manually auditing every resource.

Want to know exactly how much waste is in your account?

Get free scan
Read-only access · Results in 2 minutes · Free under $5K/mo

10 strategies that actually reduce your AWS bill

Ordered by impact. Start at the top and work down. Each strategy includes a CLI command you can run right now.

Strategy 1

Delete orphaned EBS volumes

Common waste: $50-500/mo per account

Unattached EBS volumes are the most common source of waste in every AWS account. They accumulate silently because EC2 termination does not delete attached volumes by default.

Find all unattached volumes in your account:

aws ec2 describe-volumes \ --filters Name=status,Values=available \ --query "Volumes[].{ID:VolumeId,Size:Size,Created:CreateTime}" \ --output table

Snapshot anything you might need, then delete. Every unattached volume costs $0.10/GB/month (gp2) or $0.08/GB/month (gp3) with zero benefit.

Real result: $284/mo recovered from one region by cleaning up EBS volumes unattached for 1,790+ days.

Strategy 2

Right-size and consolidate RDS instances

Common waste: $200-6,500/mo per account

RDS is typically the second-largest line item after EC2. The most common problems: instances running at under 10% CPU utilization, databases provisioned as Multi-AZ for development workloads, and cluster sprawl where 17 small databases should be 2 or 3.

Check CPU utilization across your RDS fleet:

aws cloudwatch get-metric-statistics \ --namespace AWS/RDS \ --metric-name CPUUtilization \ --dimensions Name=DBInstanceIdentifier,Value=YOUR_INSTANCE \ --start-time $(date -u -d '14 days ago' +%Y-%m-%dT%H:%M:%S) \ --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \ --period 86400 --statistics Average \ --output table

If average CPU is under 10% over 14 days, you are almost certainly over-provisioned. Drop one or two instance size classes.

Real result: $6,496/mo saved by consolidating 17 Aurora PostgreSQL clusters into 2.

Strategy 3

Replace NAT Gateway with VPC Gateway Endpoints

Common waste: $100-800/mo per VPC

NAT Gateway charges $0.045/GB for data processing. If your workloads in private subnets call S3 or DynamoDB, that traffic routes through NAT Gateway by default. VPC Gateway Endpoints route the same traffic for $0.

Check how much your NAT Gateways process:

aws cloudwatch get-metric-statistics \ --namespace AWS/NATGateway \ --metric-name BytesOutToDestination \ --dimensions Name=NatGatewayId,Value=YOUR_NAT_GW_ID \ --start-time $(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%S) \ --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \ --period 2592000 --statistics Sum \ --output json

Add S3 and DynamoDB Gateway Endpoints to every VPC with private subnets. There is no downside. They are free, have no bandwidth limits, and reduce latency.

Real result: Largest single finding in a 7-region scan. NAT Gateway data processing was the top cost driver.

Strategy 4

Migrate EBS volumes from gp2 to gp3

Savings: 20% per volume

gp3 volumes cost $0.08/GB/month vs $0.10/GB/month for gp2. gp3 also provides 3,000 baseline IOPS and 125 MB/s throughput included in the price. gp2 provides 100 IOPS per GB with no baseline throughput guarantee. gp3 is cheaper AND faster for most workloads.

Find all gp2 volumes:

aws ec2 describe-volumes \ --filters Name=volume-type,Values=gp2 \ --query "Volumes[].{ID:VolumeId,Size:Size,State:State}" \ --output table

Migrate with zero downtime using aws ec2 modify-volume --volume-type gp3. The migration is live and does not require detaching the volume.

Strategy 5

Set CloudWatch log retention policies

Savings: $0.03/GB/month in perpetuity

CloudWatch Logs charge $0.03/GB/month for storage. The default retention is never expire. This means every log group grows forever. A Lambda function logging 1 GB/month accumulates 12 GB after a year, 60 GB after five years, costing $1.80/month for logs nobody will ever read.

Find log groups with no retention policy:

aws logs describe-log-groups \ --query "logGroups[?!retentionInDays].{Name:logGroupName,StoredBytes:storedBytes}" \ --output table

Set 30-day retention for most log groups. Use 90 days for production workloads where you need historical debugging. Anything older should go to S3 if you need long-term archival.

Strategy 6

Release unused Elastic IPs

Savings: $3.65/mo per unused EIP

Since February 2024, AWS charges $0.005/hour for ALL public IPv4 addresses, including Elastic IPs attached to running instances. But unassociated Elastic IPs are the easiest to eliminate: they serve no purpose and cost $3.65/month each.

aws ec2 describe-addresses \ --query "Addresses[?!InstanceId && !NetworkInterfaceId].{IP:PublicIp,AllocID:AllocationId}" \ --output table

Release every Elastic IP that is not associated to a running resource. If a team member reserved it "just in case," the IP address will be different on next allocation anyway.

Strategy 7

Clean up idle load balancers

Savings: $16-25/mo per idle ALB/NLB

Application Load Balancers cost a minimum of $16.20/month even with zero traffic ($0.0225/hour). Network Load Balancers cost $16.20/month as well. Load balancers left behind after decommissioning services accumulate quietly.

aws elbv2 describe-load-balancers \ --query "LoadBalancers[].{Name:LoadBalancerName,ARN:LoadBalancerArn,Type:Type}" \ --output table

Check each ALB's RequestCount metric and each NLB's ActiveFlowCount metric over the past 14 days. Zero traffic means safe to delete.

Strategy 8

Terminate stopped EC2 instances

Savings: EBS charges ($8-100+/mo per instance)

Stopped EC2 instances do not incur compute charges. But their EBS volumes keep billing. A stopped instance with a 500 GB gp2 root volume costs $50/month in storage alone. And since the instance is stopped, nobody notices.

aws ec2 describe-instances \ --filters Name=instance-state-name,Values=stopped \ --query "Reservations[].Instances[].{ID:InstanceId,Type:InstanceType,Stopped:StateTransitionReason}" \ --output table

For each stopped instance: if it has been stopped for more than 14 days and nobody claims ownership, create an AMI (which snapshots the volumes), then terminate the instance. You can always relaunch from the AMI.

Strategy 9

Delete old EBS snapshots

Savings: $0.05/GB/month per stale snapshot

EBS snapshots cost $0.05/GB/month. Automated backup tools often create daily snapshots without a retention policy. After a year, you might have 365 snapshots of the same volume, each storing incremental changes. The source volume may have been deleted months ago.

aws ec2 describe-snapshots --owner-ids self \ --query "Snapshots[?StartTime<='$(date -u -d '90 days ago' +%Y-%m-%d)'].{ID:SnapshotId,Size:VolumeSize,Created:StartTime,VolumeId:VolumeId}" \ --output table

Cross-reference snapshot VolumeIds against active volumes. If the source volume no longer exists and the snapshot is older than your retention requirement, delete it.

Strategy 10

Automate with daily scans

Prevents new waste from accumulating

Manual audits catch waste once. Automated daily scans catch it within 24 hours of creation. The difference between finding an idle RDS instance on day 1 vs day 90 is $1,440 in unnecessary spend for a db.r5.large.

Options for automated scanning:

AWS native: AWS Trusted Advisor runs checks automatically but requires Business Support ($29+/month per account) for cost optimization checks. It provides generic recommendations without fix commands.

Third-party: CostPatrol runs 111 detection rules daily and delivers findings to Slack with exact CLI fix commands and dollar amounts. It also detects cost anomalies every 6 hours. Free for accounts under $5K/month.

See our comparison of 12 AWS cost optimization tools for a full breakdown.

AWS cost optimization tools

You do not need to run these checks manually every week. The right tool automates detection and delivers findings where your team already works.

AWS native tools (free / included)

AWS Cost Explorer shows what you spent. Filter by service, account, tag, or time period. Good for understanding trends. Does not tell you what to fix.

AWS Trusted Advisor checks for basic optimization opportunities. Requires Business Support ($29+/month per account) for cost checks. Provides generic recommendations. No CLI commands, no Slack delivery, no anomaly detection.

AWS Compute Optimizer analyzes EC2 and Auto Scaling Group utilization and recommends right-sizing. EC2-only. Does not cover RDS, EBS, S3, NAT, or CloudWatch.

Third-party tools

For teams that want automated detection, fix commands, and team-friendly delivery (Slack, email, dashboards), third-party tools fill the gaps.

CostPatrol scans 30+ services, provides exact CLI fix commands with dollar amounts, detects cost anomalies every 6 hours, and delivers findings via Slack. Free under $5K/month. $99/month Pro, $499/month Business. Try it free.

Vantage provides multi-cloud cost visibility with dashboards and reports. Free under $2,500/month tracked costs. Starts at $30/month.

CloudHealth (Flexera) is an enterprise governance platform. Minimum ~$45K/year. Best for organizations spending $200K+/month across multiple clouds.

For a detailed comparison with real pricing, see 12 Best AWS Cost Optimization Tools in 2026.

Quick-start checklist

Run through this in order. Most teams find significant savings in the first three items.

1. Delete all unattached EBS volumes (snapshot first if unsure)
2. Right-size any RDS instance under 10% average CPU
3. Add VPC Gateway Endpoints for S3 and DynamoDB in every VPC
4. Migrate all gp2 volumes to gp3 (zero-downtime, live migration)
5. Set retention policies on all CloudWatch log groups
6. Release every unassociated Elastic IP
7. Delete load balancers with zero traffic over 14 days
8. Snapshot and terminate EC2 instances stopped for 14+ days
9. Delete EBS snapshots where the source volume no longer exists
10. Set up automated daily scans to prevent waste from recurring

Frequently asked questions

How much can I save with AWS cost optimization?

Most teams save 20-35% on their AWS bill with basic optimization. In real scans, we have found $284/mo from a single region (orphaned EBS volumes, idle RDS), $1,112/mo across 7 regions (NAT Gateway, CloudWatch logs, stale EC2), and $6,496/mo from database consolidation alone. The bigger and older the account, the more waste accumulates.

What is the fastest way to reduce my AWS bill?

Start with idle resources. Unattached EBS volumes, unused Elastic IPs, and stopped-but-billable RDS instances cost money every hour and serve no purpose. These are safe to remove immediately. In one scan, we found an EBS volume unattached for 1,790 days costing $50/month.

Is AWS Cost Explorer enough for cost optimization?

AWS Cost Explorer shows what you spent. It does not tell you what to do about it. Cost Explorer has no detection rules for idle resources, no CLI fix commands, no Slack alerts, and no anomaly detection beyond basic budget thresholds. It is a reporting tool, not an optimization tool. Most teams use it alongside a dedicated optimization tool.

What are the biggest sources of AWS waste?

The most common sources: (1) orphaned EBS volumes from terminated instances, (2) oversized RDS instances under 10% CPU, (3) NAT Gateway data processing when VPC endpoints would cost nothing, (4) CloudWatch log groups with no expiration, (5) idle load balancers with zero connections, (6) EBS volumes still on gp2 when gp3 is 20% cheaper.

How often should I optimize my AWS costs?

At minimum, monthly. But automated daily scans catch waste within 24 hours instead of letting it accumulate. The difference between finding an idle RDS instance on day 1 vs day 90 is $1,440 in unnecessary spend. CostPatrol runs optimization scans daily and anomaly detection every 6 hours.

What AWS services cost the most?

EC2 typically accounts for 40-60% of spend, followed by RDS (10-20%), S3 (5-15%), and data transfer (5-10%). But the highest-waste services are often NAT Gateway (silent data processing fees), CloudWatch (log retention with no expiration), and EBS (orphaned volumes). Nearly every account has waste in EBS and RDS.

See what CostPatrol finds in your account

Free scan. Read-only access. No credit card. Your savings number in 2 minutes.