This article is currently available in English only. Translation coming soon.
AWS Cost Optimization: Save 30-50% on Your Cloud Infrastructure Bill
The average organization wastes 32% of its cloud spend on idle or over-provisioned resources. For a company spending $5,000 per month on AWS, that is $19,200 per year going to waste. Cloud cost optimization is not about cutting corners --- it is about paying only for what you actually use.
This guide covers the full spectrum of AWS cost reduction strategies, from quick wins that save money this month to architectural changes that compound savings over time.
Key Takeaways
- Right-sizing alone saves 20-40% by matching instance types to actual resource usage
- Reserved Instances and Savings Plans provide 30-60% discounts for predictable workloads
- Spot Instances reduce compute costs by 60-90% for fault-tolerant workloads
- Storage lifecycle policies prevent S3 costs from growing indefinitely
The Cost Optimization Framework
Priority Order
Optimize in this order for maximum ROI with minimum effort:
- Eliminate waste (immediate, no risk)
- Right-size instances (1-2 weeks, low risk)
- Use pricing models (reserved, spot, savings plans)
- Optimize architecture (months, requires engineering)
Step 1: Eliminate Waste
Find Unused Resources
# Find unattached EBS volumes (you are paying for storage with no use)
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[*].{ID:VolumeId,Size:Size,Type:VolumeType}' \
--output table
# Find unused Elastic IPs
aws ec2 describe-addresses \
--query 'Addresses[?AssociationId==null].{IP:PublicIp,AllocationId:AllocationId}' \
--output table
# Find idle load balancers (no targets)
aws elbv2 describe-target-groups \
--query 'TargetGroups[*].{ARN:TargetGroupArn,Name:TargetGroupName}' \
--output table
# Find stopped instances still consuming EBS
aws ec2 describe-instances \
--filters Name=instance-state-name,Values=stopped \
--query 'Reservations[*].Instances[*].{ID:InstanceId,Type:InstanceType,StopTime:StateTransitionReason}' \
--output table
Common Waste Sources
| Waste Source | Typical Monthly Cost | Fix |
|---|---|---|
| Unattached EBS volumes | $10-100 per volume | Delete or snapshot and delete |
| Stopped instances with EBS | $20-200 per instance | Terminate or create AMI |
| Unused Elastic IPs | $3.60 each | Release |
| Old snapshots | $0.05/GB | Lifecycle policy |
| Oversized NAT Gateways | $32+ per gateway | Consolidate, use VPC endpoints |
| Idle RDS instances | $50-500+ | Stop or terminate dev instances |
Step 2: Right-Sizing
Analyze Actual Usage
# Get average CPU utilization over the last 14 days
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-0123456789abcdef0 \
--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 3600 \
--statistics Average Maximum \
--output json
Right-Sizing Decision Matrix
| Average CPU | Peak CPU | Action |
|---|---|---|
| <10% | <30% | Downsize 2 steps (e.g., xlarge to medium) |
| 10-30% | <60% | Downsize 1 step (e.g., xlarge to large) |
| 30-60% | <80% | Current size appropriate |
| >60% | >80% | Consider upsizing or auto-scaling |
Instance Type Optimization
| Current Instance | Right-Sized | Monthly Savings |
|---|---|---|
| m5.xlarge ($140) | m5.large ($70) | $70 (50%) |
| r5.2xlarge ($365) | r6g.xlarge ($146) | $219 (60%) |
| t3.large ($60) | t3.medium ($30) | $30 (50%) |
| c5.xlarge ($124) | c6g.large ($62) | $62 (50%) |
Moving to Graviton (ARM) instances (r6g, c6g, m6g) provides an additional 20% cost savings with equal or better performance for most workloads.
Step 3: Pricing Models
Reserved Instances vs Savings Plans
| Feature | Reserved Instances | Compute Savings Plans | EC2 Savings Plans |
|---|---|---|---|
| Discount | 30-60% | 30-54% | 40-60% |
| Flexibility | Specific instance type/region | Any instance family/region | Specific instance family/region |
| Commitment | 1 or 3 years | 1 or 3 years | 1 or 3 years |
| Best for | Stable, predictable workloads | Mixed workloads | Specific instance families |
Recommendation: Start with Compute Savings Plans for flexibility. Commit to the minimum baseline usage you are confident about.
Spot Instances
Spot Instances provide 60-90% discounts but can be interrupted with 2 minutes notice.
Good for:
- CI/CD build runners
- Batch processing and data pipelines
- Development and staging environments
- Stateless web servers behind a load balancer (with on-demand fallback)
Not good for:
- Databases
- Single-instance applications
- Stateful workloads without checkpointing
# Launch template with Spot Instance
Resources:
SpotFleet:
Type: AWS::EC2::SpotFleet
Properties:
SpotFleetRequestConfigData:
AllocationStrategy: lowestPrice
TargetCapacity: 5
LaunchSpecifications:
- InstanceType: t3.large
ImageId: ami-0123456789abcdef0
- InstanceType: t3.xlarge
ImageId: ami-0123456789abcdef0
- InstanceType: m5.large
ImageId: ami-0123456789abcdef0
Step 4: Storage Optimization
S3 Lifecycle Policies
{
"Rules": [
{
"ID": "ArchiveOldBackups",
"Status": "Enabled",
"Filter": {
"Prefix": "backups/"
},
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
},
{
"Days": 365,
"StorageClass": "DEEP_ARCHIVE"
}
],
"Expiration": {
"Days": 730
}
}
]
}
S3 Storage Class Pricing
| Storage Class | Price per GB/month | Retrieval | Best For |
|---|---|---|---|
| Standard | $0.023 | Instant | Active data |
| Standard-IA | $0.0125 | Instant ($0.01/GB retrieval) | Monthly access |
| Glacier Instant | $0.004 | Instant ($0.03/GB retrieval) | Quarterly access |
| Glacier | $0.004 | 1-12 hours | Annual access |
| Deep Archive | $0.00099 | 12 hours | Compliance, long-term |
EBS Optimization
# Convert gp2 volumes to gp3 (20% cheaper, better performance)
for vol_id in $(aws ec2 describe-volumes --filters Name=volume-type,Values=gp2 --query 'Volumes[*].VolumeId' --output text); do
echo "Converting $vol_id from gp2 to gp3"
aws ec2 modify-volume --volume-id "$vol_id" --volume-type gp3
done
Step 5: Auto-Scaling
Schedule-Based Scaling
Most B2B applications see 70% less traffic outside business hours:
# Scale down at night
aws autoscaling put-scheduled-action \
--auto-scaling-group-name production-asg \
--scheduled-action-name scale-down-night \
--recurrence "0 20 * * 1-5" \
--desired-capacity 2 \
--min-size 1
# Scale up in the morning
aws autoscaling put-scheduled-action \
--auto-scaling-group-name production-asg \
--scheduled-action-name scale-up-morning \
--recurrence "0 7 * * 1-5" \
--desired-capacity 5 \
--min-size 3
Development Environment Scheduling
Stop non-production environments outside working hours:
# Stop dev/staging instances at 7 PM
aws ec2 stop-instances --instance-ids i-dev123 i-staging456
# Start at 8 AM
aws ec2 start-instances --instance-ids i-dev123 i-staging456
Monthly savings: running dev instances 10 hours/day instead of 24 saves 58%.
Monthly Cost Review Checklist
- Review AWS Cost Explorer for anomalies
- Check for unused resources (volumes, IPs, snapshots)
- Validate right-sizing recommendations (AWS Compute Optimizer)
- Review Reserved Instance / Savings Plan coverage
- Check S3 storage growth and lifecycle policy effectiveness
- Review data transfer costs (often 10-15% of total bill)
- Verify auto-scaling thresholds match current traffic patterns
- Check for orphaned resources from failed deployments
Frequently Asked Questions
What is the quickest win for AWS cost reduction?
Delete unused resources. Most AWS accounts have hundreds of dollars per month in unattached EBS volumes, unused Elastic IPs, old snapshots, and stopped instances. This takes less than an hour and saves money immediately. The second quickest win is converting gp2 EBS volumes to gp3 --- same or better performance at 20% lower cost.
Should we use Savings Plans or Reserved Instances?
Compute Savings Plans for most businesses. They provide comparable discounts to Reserved Instances but with more flexibility --- you are not locked to a specific instance type. Use EC2 Reserved Instances only when you are certain about instance types for 1-3 years.
How do we track AWS costs by project or team?
Use AWS resource tags. Tag every resource with project, team, environment, and cost-center tags. Enable Cost Allocation Tags in the billing console. Create Cost Explorer reports grouped by tag to see spend by project. Enforce tagging with AWS Config rules that flag untagged resources.
Is moving to containers more cost-effective?
Containers improve resource utilization by 30-50% compared to running one application per server. ECS Fargate and EKS simplify container management but add per-task pricing. For most SMBs, EC2 with Docker Compose provides the best balance of simplicity and cost. See our Docker deployment guide for implementation details.
What Comes Next
Cost optimization is an ongoing practice, not a one-time project. Schedule monthly cost reviews and integrate cost monitoring into your production alerting setup. For the complete infrastructure strategy, see our DevOps guide for small businesses.
Contact ECOSIRE for AWS cost optimization consulting, or explore our Odoo support services for managed infrastructure with built-in cost optimization.
Published by ECOSIRE -- helping businesses optimize cloud infrastructure spending.
تحریر
ECOSIRE Research and Development Team
ECOSIRE میں انٹرپرائز گریڈ ڈیجیٹل مصنوعات بنانا۔ Odoo انٹیگریشنز، ای کامرس آٹومیشن، اور AI سے چلنے والے کاروباری حل پر بصیرت شیئر کرنا۔
متعلقہ مضامین
API Gateway Patterns and Best Practices for Modern Applications
Implement API gateway patterns including rate limiting, authentication, request routing, circuit breakers, and API versioning for scalable web architectures.
CDN Performance Optimization: The Complete Guide to Faster Global Delivery
Optimize CDN performance with caching strategies, edge computing, image optimization, and multi-CDN architectures for faster global content delivery.
CI/CD Pipeline Best Practices: Automate Your Way to Reliable Deployments
Build reliable CI/CD pipelines with best practices for testing, staging, deployment automation, rollback strategies, and security scanning in production workflows.