AWS Cost Optimizer
Analyze and optimize AWS costs with actionable recommendations.
Quick Start
Review Cost Explorer, identify top costs, right-size instances, use Reserved Instances, delete unused resources.
Instructions
Cost Analysis Process
- •Identify cost drivers
- •Analyze usage patterns
- •Recommend optimizations
- •Estimate savings
- •Implement changes
Using AWS Cost Explorer
Access Cost Explorer:
- •AWS Console → Billing → Cost Explorer
- •View costs by service, region, tag
Key metrics to check:
- •Monthly costs by service
- •Cost trends over time
- •Unused or underutilized resources
- •Data transfer costs
EC2 Cost Optimization
Right-sizing instances:
Check utilization:
# Get CloudWatch metrics aws cloudwatch get-metric-statistics \ --namespace AWS/EC2 \ --metric-name CPUUtilization \ --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \ --start-time 2024-01-01T00:00:00Z \ --end-time 2024-01-31T23:59:59Z \ --period 3600 \ --statistics Average
Recommendations:
- •CPU < 20%: Downsize instance type
- •CPU > 80%: Upsize or add instances
- •Memory < 50%: Consider smaller instance
Reserved Instances:
- •1-year: ~30-40% savings
- •3-year: ~50-70% savings
- •Best for predictable workloads
Savings Plans:
- •More flexible than Reserved Instances
- •Commit to $/hour usage
- •Apply across instance families
Spot Instances:
- •Up to 90% savings
- •For fault-tolerant workloads
- •Batch processing, CI/CD, testing
Stop unused instances:
# Find stopped instances aws ec2 describe-instances \ --filters "Name=instance-state-name,Values=stopped" \ --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==`Name`].Value|[0]]' # Terminate if not needed aws ec2 terminate-instances --instance-ids i-1234567890abcdef0
S3 Cost Optimization
Lifecycle policies:
{
"Rules": [{
"Id": "Archive old data",
"Status": "Enabled",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 365
}
}]
}
Storage classes:
- •Standard: Frequent access
- •Standard-IA: Infrequent access (30+ days)
- •Glacier: Archive (90+ days)
- •Glacier Deep Archive: Long-term archive
Delete incomplete multipart uploads:
aws s3api list-multipart-uploads --bucket my-bucket # Set lifecycle rule to abort after 7 days
Analyze storage:
# Get bucket size aws s3 ls s3://my-bucket --recursive --summarize
RDS Cost Optimization
Right-size databases:
- •Check CPU, memory, IOPS utilization
- •Downsize if consistently low
- •Use Aurora Serverless for variable workloads
Reserved Instances:
- •1-year: ~30-40% savings
- •3-year: ~50-60% savings
Stop dev/test databases:
# Stop RDS instance aws rds stop-db-instance --db-instance-identifier mydb # Start when needed aws rds start-db-instance --db-instance-identifier mydb
Delete old snapshots:
# List snapshots aws rds describe-db-snapshots --query 'DBSnapshots[?SnapshotCreateTime<`2023-01-01`]' # Delete old snapshots aws rds delete-db-snapshot --db-snapshot-identifier snapshot-id
Data Transfer Costs
Reduce data transfer:
- •Use CloudFront for content delivery
- •Keep data in same region
- •Use VPC endpoints for AWS services
- •Compress data before transfer
VPC endpoints:
# Create S3 VPC endpoint (no data transfer charges) aws ec2 create-vpc-endpoint \ --vpc-id vpc-12345678 \ --service-name com.amazonaws.us-east-1.s3 \ --route-table-ids rtb-12345678
EBS Cost Optimization
Delete unattached volumes:
# Find unattached volumes aws ec2 describe-volumes \ --filters "Name=status,Values=available" \ --query 'Volumes[].[VolumeId,Size,VolumeType]' # Delete if not needed aws ec2 delete-volume --volume-id vol-1234567890abcdef0
Delete old snapshots:
# List old snapshots aws ec2 describe-snapshots --owner-ids self \ --query 'Snapshots[?StartTime<`2023-01-01`]' # Delete aws ec2 delete-snapshot --snapshot-id snap-1234567890abcdef0
Use gp3 instead of gp2:
- •gp3 is 20% cheaper
- •Better performance
- •Migrate existing volumes
Lambda Cost Optimization
Optimize memory allocation:
- •More memory = faster execution = lower cost
- •Test different memory settings
- •Use AWS Lambda Power Tuning tool
Reduce cold starts:
- •Use provisioned concurrency (if needed)
- •Keep functions warm with scheduled events
- •Minimize dependencies
Monitor invocations:
# Get Lambda metrics aws cloudwatch get-metric-statistics \ --namespace AWS/Lambda \ --metric-name Invocations \ --dimensions Name=FunctionName,Value=my-function \ --start-time 2024-01-01T00:00:00Z \ --end-time 2024-01-31T23:59:59Z \ --period 86400 \ --statistics Sum
CloudWatch Costs
Reduce log retention:
# Set log retention to 7 days aws logs put-retention-policy \ --log-group-name /aws/lambda/my-function \ --retention-in-days 7
Delete unused log groups:
# List log groups aws logs describe-log-groups # Delete aws logs delete-log-group --log-group-name /aws/lambda/old-function
Unused Resources
Find unused resources:
Elastic IPs not attached:
aws ec2 describe-addresses \ --query 'Addresses[?AssociationId==null]'
Load balancers with no targets:
aws elbv2 describe-load-balancers aws elbv2 describe-target-health --target-group-arn arn
NAT Gateways with low traffic:
# Check CloudWatch metrics for BytesOutToDestination
Cost Optimization Checklist
Compute:
- • Right-size EC2 instances
- • Use Reserved Instances for predictable workloads
- • Use Spot Instances for fault-tolerant workloads
- • Stop/terminate unused instances
- • Implement auto-scaling
Storage:
- • Implement S3 lifecycle policies
- • Delete old EBS snapshots
- • Delete unattached EBS volumes
- • Use appropriate S3 storage classes
- • Delete incomplete multipart uploads
Database:
- • Right-size RDS instances
- • Use Reserved Instances
- • Stop dev/test databases when not in use
- • Delete old RDS snapshots
- • Consider Aurora Serverless
Networking:
- • Use CloudFront to reduce data transfer
- • Delete unused Elastic IPs
- • Use VPC endpoints
- • Review NAT Gateway usage
Monitoring:
- • Reduce CloudWatch log retention
- • Delete unused log groups
- • Review custom metrics
General:
- • Enable AWS Cost Anomaly Detection
- • Set up billing alerts
- • Use AWS Budgets
- • Tag resources for cost allocation
- • Review Cost Explorer regularly
Savings Estimation
Reserved Instances:
- •1-year, no upfront: ~30% savings
- •1-year, all upfront: ~40% savings
- •3-year, all upfront: ~60% savings
Spot Instances:
- •70-90% savings vs On-Demand
S3 Lifecycle:
- •Standard-IA: ~50% cheaper than Standard
- •Glacier: ~80% cheaper than Standard
Right-sizing:
- •Typical savings: 20-40% on oversized instances
Tools and Commands
AWS Cost Explorer:
- •View costs by service, region, tag
- •Forecast future costs
- •Identify cost anomalies
AWS Budgets:
# Create budget aws budgets create-budget \ --account-id 123456789012 \ --budget file://budget.json
AWS Trusted Advisor:
- •Cost optimization recommendations
- •Underutilized resources
- •Idle resources
Third-party tools:
- •CloudHealth
- •CloudCheckr
- •Spot.io
Best Practices
Tagging strategy:
- •Tag all resources
- •Use tags for cost allocation
- •Common tags: Environment, Project, Owner, CostCenter
Regular reviews:
- •Weekly: Check for anomalies
- •Monthly: Review Cost Explorer
- •Quarterly: Optimize Reserved Instances
Automation:
- •Auto-stop dev instances at night
- •Auto-delete old snapshots
- •Auto-scale based on demand
Monitoring:
- •Set up billing alerts
- •Use AWS Budgets
- •Enable Cost Anomaly Detection