Cloud Cost Optimization: Reducing AWS, GCP, and Azure Bills

Cloud waste is real. The typical organization overspends on cloud infrastructure by 30–40%, and much of that waste accumulates silently—orphaned volumes, over-provisioned instances, forgotten load balancers with no backends. The good news: systematic cost optimization follows repeatable patterns that apply across all major providers.
Compute Right-Sizing
The fastest cost savings come from matching instance types to actual workload requirements. Teams habitually over-provision "just in case," paying for capacity that never gets utilized.
Use provider tools to analyze utilization history:
- AWS Compute Optimizer analyzes CloudWatch metrics and recommends instance family upgrades or downsizing
- GCP Recommender provides rightsizing suggestions based on the 98th percentile of CPU and memory usage over the past 8–14 days
- Azure Advisor evaluates VM utilization and recommends resizing or shutting down underutilized resources
The rule of thumb: if CPU utilization averages below 40% and memory below 50% for two weeks, downsize. For predictable workloads like API servers, match instance size to p75 utilization, not peak:
# Terraform: use instance types based on utilization data
resource "aws_instance" "app_server" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.medium" # 2 vCPU, 4GB RAM
# Switch to t3.large only if sustained CPU > 50%
monitoring = true # Enable detailed CloudWatch metrics
tags = {
Name = "app-server-${count.index}"
CostCenter = "production"
AutoOffload = "terraform"
}
}
Reserved and Spot Instances
Reserved instances (RIs) and savings plans commit to a specific usage level in exchange for 40–72% discounts over on-demand pricing. Use them for baseline capacity that runs 24/7:
| Commitment | AWS | GCP | Azure | |---|---|---|---| | 1-year | Up to 40% discount | Up to 30% discount | Up to 40% discount | | 3-year | Up to 60% discount | Up to 57% discount | Up to 60% discount | | Convertible RI | Change attributes, lower discount | N/A | N/A |
Spot/preemptible instances offer 60–90% discounts for fault-tolerant workloads. GCP preemptible instances run for up to 24 hours; AWS Spot instances have no fixed limit but can be reclaimed with a two-minute warning:
# EKS managed node group with spot instances
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
managedNodeGroups:
- name: spot-workers
instanceTypes: ["t3.large", "t3.xlarge", "m5.large"]
spot: true
minSize: 2
maxSize: 20
desiredCapacity: 2
tags:
k8s.io/cluster-autoscaler/enabled: "true"
Run stateless services on spot instances and use on-demand or reserved instances for stateful workloads (databases, caches, message brokers) that can't tolerate interruptions.
Storage Tiering and Lifecycle Policies
Storage costs scale linearly with data volume, but not all data needs the same access speed. Implement lifecycle policies to automatically transition data to cheaper tiers:
resource "aws_s3_bucket_lifecycle_configuration" "logs_lifecycle" {
bucket = aws_s3_bucket.logs.id
rules {
id = "transition_and_expire"
status = "Enabled"
transition {
days = 30
storage_class = "STANDARD_IA" # 50% cheaper
}
transition {
days = 90
storage_class = "GLACIER_INSTANT_RETRIEVAL"
}
transition {
days = 365
storage_class = "DEEP_ARCHIVE" # 95% cheaper
}
expiration {
days = 730 # Delete after 2 years
}
}
}
For databases, use provisioned IOPS only when your workload genuinely requires it. General Purpose (gp3) SSDs are sufficient for most web applications and cost 20% less than provisioned IOPS equivalents.
Eliminating Orphaned Resources
Orphaned resources—unattached EBS volumes, unused Elastic IPs, idle load balancers—accumulate silently. They're easy to miss because they don't trigger alarms. Run a weekly audit script:
#!/bin/bash
# find-orphaned-resources.sh
echo "=== Unattached EBS Volumes ==="
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[*].[VolumeId,Size,State]' \
--output table
echo "=== Unused Elastic IPs ==="
aws ec2 describe-addresses \
--query 'Addresses[?InstanceId==null].[PublicIp,AllocationId]' \
--output table
echo "=== Idle Load Balancers ==="
aws elb describe-load-balancers \
--query 'LoadBalancerDescriptions[?Instances==`[]`].[LoadBalancerName]' \
--output table
Automate deletion of resources that have been orphaned for more than 14 days. Take a snapshot or create a CloudFormation backup before deletion.
Tagging and Cost Allocation
Without proper tagging, you can't attribute costs to teams, environments, or features. Enforce a consistent tagging strategy:
Environment: production/staging/development
Team: platform/payments/notifications
Service: api/worker/scheduler
CostCenter: eng-123
Owner: [email protected]
Create AWS Budgets (or GCP Budgets, Azure Cost Management alerts) that notify the team when spending exceeds 80% of forecasted budget. Tagging lets you pinpoint which team or service caused the overrun.
Optimize Your Cloud Spend with SoniNow
Cloud cost optimization isn't a one-time project—it's an ongoing practice of right-sizing, committing to reserved capacity, and eliminating waste. Our team at SoniNow audits cloud environments and implements cost-saving strategies that reduce monthly bills by 30% or more.
Related Insights

Cloud Cost Optimization: Strategies to Reduce AWS, GCP, and Azure Bills
Cloud spending is the third-largest expense for most SaaS companies. This guide covers FinOps practices, right-sizing, reserved instances, and architectural changes that reduce bills 30-50%.

Cloud Infrastructure for Startups: AWS, GCP, or Azure in 2026
A comparison of AWS, GCP, and Azure for startup cloud infrastructure covering cost optimization, scalability, managed services, and migration strategies.

Conversion Rate Optimization: A/B Testing Frameworks for Web Applications
A guide to conversion rate optimization including hypothesis generation, experiment design, statistical significance testing, and systematic optimization cycles.