Cloud Cost Optimization — Cut Your AWS/GCP Bill by 30% Every Month
Real cost reduction strategies that work. Reserved Instances, Spot, storage optimization, and network cost control — item-by-item savings tactics.
TestForge Team ·
Anatomy of a Cloud Bill
For most services, the cost breakdown looks like this:
| Item | Proportion |
|---|---|
| EC2/VM instances | 40–60% |
| RDS/DB | 15–25% |
| Storage (S3/EBS) | 10–15% |
| Network (data transfer) | 5–15% |
| Other services | 5–10% |
Instances dominate, so start there.
1. Reserved Instances / Savings Plans
40–70% savings compared to On-Demand.
On-Demand m5.xlarge (Seoul): $0.214/h = $155/month
1-Year Reserved (no upfront): $0.136/h = $99/month → 36% savings
1-Year Reserved (full upfront): $0.113/h = $82/month → 47% savings
Strategy:
- Baseline traffic → Reserved
- Peak traffic → On-Demand or Spot
- Uncertain future → Savings Plans (instance type can change)
2. Spot Instances
70–90% savings for interruption-tolerant workloads.
# Kubernetes Spot node group (EKS)
- name: spot-workers
instanceTypes: ["m5.xlarge", "m5a.xlarge", "m4.xlarge"] # Diversify types
spot: true
taints:
- key: "spot"
value: "true"
effect: "NoSchedule"
Spot-friendly workloads:
- CI/CD builds
- Batch processing, data pipelines
- ML training (with checkpoint saves)
- Dev / staging environments
3. Right-Sizing Instances
Many teams are over-provisioned without realizing it.
# Check AWS Cost Explorer → "Right Sizing Recommendations"
# Or measure directly:
# Query average CPU over 2 weeks (AWS CLI)
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-xxxxxxxxx \
--start-time 2026-03-11T00:00:00Z \
--end-time 2026-03-25T00:00:00Z \
--period 86400 \
--statistics Average
Average CPU below 20% → consider downsizing to the next smaller instance type.
4. S3 Storage Class Optimization
S3 Standard: $0.023/GB/month
S3 Standard-IA: $0.0125/GB/month (infrequent access)
S3 Glacier Instant: $0.004/GB/month (archive)
S3 Glacier Deep: $0.00099/GB/month (long-term storage)
# Lifecycle policy for automatic transition
{
"Rules": [{
"Status": "Enabled",
"Transitions": [
{"Days": 30, "StorageClass": "STANDARD_IA"},
{"Days": 90, "StorageClass": "GLACIER_IR"},
{"Days": 365, "StorageClass": "DEEP_ARCHIVE"}
],
"Expiration": {"Days": 2555} # Delete after 7 years
}]
}
5. Network Cost Reduction
Network is the cost you don’t see until the invoice arrives.
Expensive patterns:
- EC2 → Internet: $0.09/GB
- Cross-region data transfer: $0.02/GB
- Cross-AZ transfer: $0.01/GB (bidirectional)
Savings approaches:
# 1. Route traffic within the same AZ (AZ-aware routing)
# 2. Use CloudFront instead of direct S3 access
# 3. VPC Endpoints to bypass internet for S3/DynamoDB
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxx \
--service-name com.amazonaws.ap-northeast-2.s3 \
--route-table-ids rtb-xxx
6. Auto-Shutdown Dev/Staging Environments
# Lambda + EventBridge: stop at 11pm, start at 9am
# 14 hours saved per day → 58% monthly savings
# Terraform tag-based automation
resource "aws_autoscaling_schedule" "stop_dev" {
scheduled_action_name = "stop-dev"
min_size = 0
max_size = 0
desired_capacity = 0
recurrence = "0 14 * * MON-FRI" # UTC 14:00 = KST 23:00
autoscaling_group_name = aws_autoscaling_group.dev.name
}
7. Budget Alerts (Required)
# AWS Budget alert
aws budgets create-budget \
--account-id 123456789 \
--budget '{
"BudgetName": "monthly-limit",
"BudgetLimit": {"Amount": "1000", "Unit": "USD"},
"TimeUnit": "MONTHLY",
"BudgetType": "COST"
}' \
--notifications-with-subscribers '[{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80
},
"Subscribers": [{"SubscriptionType": "EMAIL", "Address": "team@company.com"}]
}]'
Savings Priority Summary
- Reserved / Savings Plans — apply immediately to stable baseline workloads
- Dev environment auto-shutdown — instant 50%+ savings
- Right-sizing — check CPU/memory utilization, then downsize
- Spot instances — CI/CD and batch workloads
- Storage lifecycle — move old S3 data to Glacier
- VPC Endpoints — eliminate S3/DynamoDB network charges