Cloud Cost Optimization: Reducing AWS, GCP, and Azure Bills | SoniNow Blog

Limited TimeLearn More

cloud costsawsgcpazureoptimization

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

Published

2026-06-23

Read Time

4 mins

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.