Where Your AWS Money Is Actually Going
Companies can typically reduce their AWS bill by 30–50% by addressing five categories: underutilised compute (the biggest opportunity), lack of Reserved Instance or Savings Plan coverage, inefficient storage usage, over-provisioned databases, and zombie resources running with no purpose. Before making changes, you need visibility — and most AWS accounts are severely under-instrumented for cost. This guide shows you exactly where to look and what to do.
According to AWS's own research, the average enterprise customer wastes 35% of their cloud spend on inefficient resource usage. For a company spending €100,000/month on AWS, that's €42,000/year in recoverable savings — and that's before Reserved Instance optimisation.
Step 1: Get Visibility Before You Optimise
You cannot optimise what you cannot measure. Before changing anything, establish these monitoring foundations:
Enable AWS Cost Explorer
AWS Cost Explorer is free for the basic tier. Enable it immediately and configure:
- Daily cost granularity (hourly adds €0.01/hour but is valuable for debugging cost spikes)
- Cost allocation tags — tag every resource with environment, team, and product. Without tags, you can't attribute costs and can't hold teams accountable.
- Anomaly Detection — set up cost anomaly monitors that alert when spend increases unexpectedly. Set thresholds at 10–15% increase to catch runaway costs early.
Enable AWS Trusted Advisor
With Business or Enterprise support, Trusted Advisor flags cost optimisation opportunities automatically. Particularly valuable checks:
- Low utilisation EC2 instances (under 10% CPU over 4+ days)
- Unassociated Elastic IP addresses (€0.005/hour per idle EIP)
- Idle load balancers
- Underutilised EBS volumes
- Reserved Instance optimisation opportunities
Consider AWS Compute Optimizer
Compute Optimizer uses machine learning to analyse your actual utilisation patterns and recommend right-sized instance types. Free for the basic recommendation service. Typically identifies 20–30% compute savings opportunities in accounts that haven't been through right-sizing.
Step 2: Reserved Instances and Savings Plans (Typical Savings: 30–60%)
This is the single highest-impact action you can take. On-demand pricing is a premium for flexibility you often don't need for your baseline compute.
Understanding Your Options
- EC2 Reserved Instances — Commit to a specific instance type and region for 1 or 3 years. Savings: 30–40% (1-year, no upfront) to 60% (3-year, all upfront). Best for stable, predictable workloads.
- Compute Savings Plans — More flexible than Reserved Instances: commitment is to a $/hour spend level, not specific instance types. Applies automatically to EC2, Fargate, and Lambda. Savings: up to 66% vs on-demand. Best for environments where instance types change.
- EC2 Instance Savings Plans — More targeted than Compute Savings Plans. Commit to a specific instance family and region. Savings: up to 72% for the highest discount tier.
Strategy for Maximising Reserved Instance Savings
- Analyse 90 days of usage data in Cost Explorer to identify your stable baseline compute
- Cover 70–80% of baseline with Reserved Instances or Savings Plans (leave 20–30% on-demand for headroom)
- Start with 1-year commitments if uncertain; move to 3-year for proven stable workloads
- Review RI utilisation monthly — unused RIs are waste. Set up CloudWatch alarms for RI utilisation below 80%
Real example: A SaaS company running 20 m5.xlarge instances 24/7 pays €2,400/month on-demand. With 1-year Compute Savings Plans, that drops to €1,440/month — saving €11,520/year on this single resource type.
Step 3: Right-Sizing (Typical Savings: 15–25%)
Most EC2 instances are over-provisioned at the time of selection and never re-evaluated as usage patterns change. Right-sizing is the process of matching instance size to actual usage.
The Right-Sizing Process
- Use Compute Optimizer to identify over-provisioned instances
- Review CloudWatch metrics: CPU, memory (requires CloudWatch Agent), network, and disk I/O over 30+ days
- For instances under 20% average CPU utilisation, target downgrade to the next smaller instance size
- Test in non-production first — right-sizing can reveal application issues not previously visible
- For CPU-heavy workloads, evaluate AWS Graviton instances (ARM-based) — 20–40% better price-performance for most workloads, 10–20% extra savings vs equivalent Intel x86
Right-Sizing Key Services
- RDS — Database instances are frequently over-provisioned. Check CPU and read/write IOPS utilisation. Aurora Serverless v2 is worth evaluating for variable database workloads — you pay only for actual ACU consumption.
- ElastiCache — Memory utilisation should drive sizing. Many caches run at 20–30% utilisation.
- NAT Gateway — Frequently missed. At €0.045/GB processed plus €0.045/hour, high-traffic NAT Gateways can cost €500–€2,000/month. Route traffic that doesn't need internet access through VPC endpoints instead (S3 and DynamoDB VPC endpoints are free).
Step 4: Spot Instances for Fault-Tolerant Workloads (Typical Savings: 70–90%)
Spot Instances are unused EC2 capacity offered at up to 90% discount. The trade-off: AWS can reclaim them with a 2-minute warning. This makes them unsuitable for stateful production databases but excellent for:
- Batch processing and data pipelines
- CI/CD build workers
- Development and staging environments (auto-restore from state is easy if designed for it)
- Stateless microservices in auto-scaling groups (mix Spot with a small On-Demand baseline)
- Machine learning training jobs
Spot Best Practices
- Use multiple instance types in your Spot request (capacity pools) to increase availability
- Enable Spot interruption handling in your application — save state before termination
- For EKS/Kubernetes, use Karpenter for intelligent Spot instance provisioning and fallback
- Target Spot pools that historically have low interruption rates (AWS provides interruption frequency data)
Step 5: Storage Optimisation (Typical Savings: 20–40% of Storage Costs)
S3 Lifecycle Policies
S3 Standard costs €0.023/GB/month. S3 Intelligent-Tiering automatically moves data between tiers based on access patterns. S3 Glacier Instant Retrieval costs €0.004/GB/month — 83% cheaper — for data accessed less than once per quarter.
Implement these lifecycle rules immediately:
- Move objects to Intelligent-Tiering after 30 days of creation
- Move to Glacier Instant Retrieval after 90 days of no access
- Delete incomplete multipart uploads after 7 days (frequently overlooked — these accumulate silently)
- Expire old log files — CloudTrail, VPC Flow Logs, and ALB access logs accumulate indefinitely without a retention policy
EBS Volume Optimisation
- Delete unattached EBS volumes — AWS charges for storage whether or not it's attached to an instance
- Delete old EBS snapshots — implement a snapshot retention policy (keep 7 daily, 4 weekly, 12 monthly)
- Downgrade gp2 volumes to gp3 — gp3 is 20% cheaper than gp2 and allows you to independently configure IOPS (no longer coupled to size)
Step 6: Eliminate Zombie Resources
Every AWS account accumulates unused resources over time. A quarterly cleanup typically yields 5–15% cost savings in accounts older than 12 months:
Common Zombie Resources
- Idle Elastic Load Balancers (no healthy targets or zero traffic)
- Unassociated Elastic IPs
- Unused NAT Gateways
- RDS instances with no connections in 30+ days
- EC2 instances that have been stopped for 30+ days (stopped instances still incur EBS charges)
- Forgotten CloudWatch log groups with no retention policy
- Old Lambda layers and container image versions in ECR
Step 7: Architecture Optimisation for Long-Term Savings
Beyond resource-level optimisation, architectural changes deliver the biggest long-term savings:
- Containerise monolithic workloads — Running 10 services as containers on shared EKS nodes is far cheaper than 10 dedicated EC2 instances
- Shift batch workloads to Lambda or Fargate — Pay only for execution time, not idle compute
- Implement Auto Scaling properly — Scale to zero for non-production, scale in aggressively during off-peak
- Use VPC endpoints — Eliminate NAT Gateway data processing charges for AWS API traffic (S3, DynamoDB, ECR, SQS)
If your AWS bill is over €10,000/month and you haven't done a systematic cost review in the last 12 months, these savings are almost certainly available to you. Our cloud optimisation service includes a full cost audit with prioritised recommendations. See also our AWS vs Azure vs GCP comparison if you're evaluating whether to consolidate or switch providers as part of your optimisation effort.