AWS Cost Explorer ships with every AWS account and contains the data to diagnose most AWS cost problems. Most teams use it to look at monthly totals and shake their heads. Here’s how to actually use it to find savings.
The default view is useless
Opening Cost Explorer shows you a month-by-month bar chart of total AWS spend. This tells you your bill is going up. It doesn’t tell you why or what to do about it.
Every useful Cost Explorer session starts with changing the grouping and filters.
The five views that actually surface problems
1. Group by Service, filter to last 3 months
What it shows: Which services are growing, which are stable, which are shrinking.
What to look for: A service that’s growing faster than your traffic. EC2 doubling while requests only went up 20% suggests provisioning drift — instances added and never removed. S3 growing steadily with no corresponding data growth suggests old storage classes or missing lifecycle policies.
How to do it: Cost Explorer → Group by: Service → Date range: Last 3 months → Change granularity to Monthly.
2. Group by Usage Type, filter to EC2
What it shows: The specific EC2 instance types and purchasing options consuming cost.
What to look for:
- On-Demand hours for instance types that have been running steadily for 6+ months → Reserved Instance or Savings Plans opportunity
- Instance types that look inconsistent (a
p3.16xlargein an account that runs web services) → possible forgotten test instance - Data transfer charges (
DataTransfer-Out-Bytes) inflating the EC2 line item
How to do it: Cost Explorer → Group by: Usage Type → Filter by Service: EC2 → Sort by Cost descending.
3. Group by Purchase Option
What it shows: Split between On-Demand, Reserved Instances, Savings Plans, and Spot.
What to look for: High On-Demand percentage on stable workloads. If 80%+ of EC2 spend is On-Demand and the account has been running for a year, there’s a Savings Plans opportunity. On-Demand has a 40-66% cost premium over equivalent Reserved/Savings Plans commitment.
How to do it: Cost Explorer → Group by: Purchase Option → Filter by Service: EC2.
4. Group by Region
What it shows: Spend distribution across AWS regions.
What to look for:
- High spend in regions where your application doesn’t run → forgotten resources or data transfer endpoints
- Consistent spend in many regions → possible global trail or Config running in unused regions (small but adds up)
How to do it: Cost Explorer → Group by: Region.
5. Group by Tag (requires tag compliance)
What it shows: Spend attributed to specific teams, environments, applications, or cost centers.
What to look for: Untagged resources (they appear as No tag value or No tag key) — these are resources that escaped your tagging policy. Tags are the only way to attribute costs to specific owners.
Prerequisite: Activate cost allocation tags in Billing → Cost allocation tags. Only tags activated here appear in Cost Explorer. Activation takes 24 hours to show data.
Finding the On-Demand to Savings Plans opportunity
This is the highest-value FinOps finding in most accounts. Here’s the exact workflow:
- Cost Explorer → Savings Plans → Recommendations (left sidebar)
- Look at the “Estimated monthly savings” figure
- The recommendation shows the exact Savings Plans commitment amount and estimated savings
AWS Compute Savings Plans cover EC2, Fargate, and Lambda across all instance types, families, and regions with a single commitment. For most accounts, a 1-year no-upfront Compute Savings Plan covering baseline usage saves 30-40% on covered services.
Important: The Savings Plans recommendation uses your last 7 or 30 days of usage to project. If you’ve had recent unusual spend (a load test, a temporary spike), use the 30-day lookback for a more representative baseline.
Finding Reserved Instance opportunities for RDS and ElastiCache
EC2 Savings Plans don’t cover RDS and ElastiCache — those use Reserved Instances.
- Cost Explorer → Reserved Instances → Recommendations
- Change the service dropdown to RDS or ElastiCache
- Review the top recommendations by estimated savings
The UI shows you which specific instance type to reserve, estimated monthly savings, and the break-even period. For RDS db.r7g.large instances that have been running for 6+ months on On-Demand, the recommendation is almost always “reserve for 1 year” with 30-35% savings.
The Cost Explorer API for automated analysis
For recurring analysis or multi-account environments, the Cost Explorer API surfaces the same data programmatically:
import boto3
from datetime import datetime, timedelta
ce = boto3.client('ce', region_name='us-east-1')
# Get last 30 days of spend by service
response = ce.get_cost_and_usage(
TimePeriod={
'Start': (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d'),
'End': datetime.now().strftime('%Y-%m-%d')
},
Granularity='MONTHLY',
Metrics=['UnblendedCost'],
GroupBy=[{'Type': 'DIMENSION', 'Key': 'SERVICE'}]
)
for group in sorted(
response['ResultsByTime'][0]['Groups'],
key=lambda x: float(x['Metrics']['UnblendedCost']['Amount']),
reverse=True
)[:10]:
service = group['Keys'][0]
cost = float(group['Metrics']['UnblendedCost']['Amount'])
print(f"${cost:,.2f} {service}")
This is the foundation for automated cost reporting — run it weekly, send the top 10 services to Slack, flag any service that grew more than 20% week-over-week.
Cost Categories: grouping across dimensions
Cost Categories let you group costs by business logic that crosses service and tag boundaries. Example: your “Production” category includes EC2 tagged env:prod, RDS tagged env:prod, and a specific S3 bucket that serves production regardless of tags.
Cost Category: Production
Rules:
- If Tag: env = prod → include
- If Resource: arn:aws:s3:::prod-assets-bucket → include
- If Resource: arn:aws:elasticache:...:cluster/prod-cache → include
Cost Categories are free and appear in Cost Explorer as a grouping dimension. For teams that need per-environment or per-product cost attribution that their tags don’t cleanly provide, Cost Categories are the answer.
What Cost Explorer can’t tell you
Per-resource cost: Cost Explorer shows cost by service, usage type, tag, or region — not by individual resource ID. You can see that your EC2 spend is $15,000/month but not which specific instances are most expensive without combining with Trusted Advisor or CloudWatch.
Root cause of spikes: Cost Explorer shows that something spiked; it doesn’t explain why. Correlate with CloudTrail (who created what), CloudWatch metrics (traffic, error rates), and application logs to find the root cause.
Future costs: Cost Explorer has a “Forecast” feature but it’s a simple extrapolation of recent trends. It doesn’t account for planned growth, new services, or infrastructure changes. Use the AWS Pricing Calculator for forward-looking estimates.
The 30-minute Cost Explorer session
For a first pass at any AWS account, this sequence takes 30 minutes and surfaces 80% of the actionable findings:
- Month-over-month by service (5 min) — Find what’s growing
- EC2 by usage type (5 min) — Identify On-Demand instances that should be Reserved/Savings Plans
- Savings Plans recommendations (5 min) — Get the dollar value of the opportunity
- RDS Reserved Instance recommendations (5 min) — Same for database
- Group by region (5 min) — Find unexpected regions
- Group by tag, look at untagged (5 min) — Scope of tag compliance problem
The findings from this session tell you where the money is. The work of actually implementing the changes is a separate engagement.
If you want help running this analysis on your account and implementing the savings, I’m available for a cost audit.
Nick Allevato is an AWS Certified Solutions Architect Professional with 20 years of infrastructure experience. He runs Cold Smoke Consulting, an independent AWS consulting practice.