FinOps #01: Top Strategies to Cut Cloud Costs
And free courses and resources inside.
Hey builders,
Welcome to this new FinOps series of The Cloud Handbook. In each series, we will talk about all things FinOps and share the best resources to help you learn FinOps. The idea is to share how important the cloud cost is for builders like you.
Cloud bills can spiral quickly, but most organizations have straightforward opportunities to reduce spending without sacrificing performance.
This week, I am sharing the ten most effective cost optimization strategies you can implement today.
1. Clean Up Unused Resources
This is most common reasons you have a big cloud cost bill.
Your cloud environment accumulates waste over time. Detached EBS volumes continue charging you even when no instance uses them. Unassociated Elastic IPs cost money while sitting idle.
Old snapshots pile up from deleted instances. Run regular audits to identify and remove these resources.
A simple script checking for unused resources weekly can save hundreds to thousands per month. Do it now.
2. Right-Size Your Instances
Most instances run with excess capacity. Your t3.large instance might average 20% CPU utilization when a t3.medium would handle the load perfectly.
Use CloudWatch metrics to analyze actual resource consumption over 30 days.
Look at CPU, memory, network, and disk metrics during peak hours.
Moving just ten oversized instances to appropriate sizes can reduce compute costs by 30-50%.
3. Switch to ARM-Based Instances
ARM processors like AWS Graviton deliver the same performance as x86 instances at significantly lower prices.
Graviton instances offer up to 40% better price performance for most workloads.
Many modern applications and containers run on ARM without modification. Test your workloads on ARM instances to verify compatibility, then migrate production traffic gradually.
4. Implement Storage Lifecycle Policies
Data sitting in Standard S3 storage might not need instant access. Analyze access patterns to identify objects untouched for 30, 60, or 90 days.
Move infrequently accessed data to S3 Infrequent Access or Glacier Instant Retrieval.
These tiers cost 50-80% less while maintaining quick retrieval when needed.
Set up automatic lifecycle rules so data transitions without manual intervention.
5. Optimize Data Transfer Architecture
Cross-AZ data transfer fees add up quickly, especially for chatty microservices or databases with replicas. Review your architecture to minimize unnecessary cross-AZ traffic.
Consider deploying stateless services in a single AZ when high availability allows. For databases, use read replicas strategically rather than replicating across every zone. Monitor data transfer costs in Cost Explorer to identify the biggest sources.
6. Use Spot Instances for Fault-Tolerant Workloads
Spot instances cost 70-90% less than on-demand pricing. They work perfectly for stateless applications like CI/CD runners, batch processing jobs, and rendering tasks.
Kubernetes cluster autoscaling can mix spot and on-demand nodes. Configure your workloads to handle interruptions gracefully. Even using spot instances for 30% of your compute capacity delivers substantial savings.
7. Schedule Non-Production Environments
Development and staging environments rarely need to run 24/7. Stopping instances overnight and on weekends reduces runtime by 70% or more.
Use Lambda functions or automation tools to shut down environments at 6 PM and restart them at 8 AM on weekdays. Tag resources by environment to automate scheduling policies. This single change often cuts non-production costs in half.
8. Commit with Savings Plans or Reserved Instances
If you have predictable baseline usage, commitment-based pricing saves 30-70% compared to on-demand rates. Savings Plans offer more flexibility than Reserved Instances because they apply across instance families, sizes, and regions.
Start by analyzing your stable workloads over the past 90 days. Commit to covering 60-70% of your baseline usage, leaving room for growth and experimentation on on-demand pricing.
9. Tune Kubernetes Resource Requests and Limits
Kubernetes clusters waste significant resources when pods request more CPU and memory than they actually use. This slack means you provision more nodes than necessary.
Review actual resource consumption using metrics from Prometheus or CloudWatch Container Insights. Set requests based on real usage plus 20% headroom. Properly configured requests and limits can reduce cluster costs by 30-40%.
10. Replace NAT Gateways with VPC Endpoints
NAT Gateways cost money for both the service itself and data processing. When your private subnets only need to access AWS services like S3 or DynamoDB, VPC Endpoints eliminate NAT Gateway charges entirely. A single NAT Gateway costs about $32 monthly plus $0.045 per GB processed. VPC Endpoints cost $7.20 monthly with no data processing fees. For high-traffic applications, this switch saves thousands monthly. This blog post from Towards AWS explains everything


