AWS EC2 Pricing Explained: How to Cut Your Cloud Bill by 60% (2026)
AWS EC2 is the backbone of Amazon Web Services. It's also where most of your AWS bill goes. Understanding EC2 pricing is the single most effective way to reduce your cloud costs.
We've managed hundreds of EC2 instances across production workloads. This guide breaks down everything you need to know about EC2 pricing — and more importantly, how to cut your bill by 60% or more.
EC2 Pricing Models: The 4 Options
1. On-Demand (Most Expensive)
Pay per second, no commitment. The default pricing you see on the AWS pricing page.
- Pros: No commitment, scale up/down freely
- Cons: Most expensive option (3-5x more than other models)
- When to use: Short-term workloads, testing, unpredictable spiky traffic
Typical price (us-east-1, t3.medium): $0.0416/hour = ~$30/month
2. Reserved Instances (Up to 72% Off)
Commit to a specific instance type in a specific region for 1 or 3 years.
- Standard RI: Up to 72% off. Fixed instance type.
- Convertible RI: Up to 54% off. Can change instance type.
- When to use: Steady-state workloads (databases, core services)
Typical price (t3.medium, 1-year, no upfront): $0.024/hour = ~$17.5/month (42% off)
3. Spot Instances (Up to 90% Off)
Bid on spare EC2 capacity. AWS can terminate your instance with 2 minutes notice.
- Pros: Ridiculously cheap
- Cons: Can be killed at any time
- When to use: Batch processing, CI/CD workers, stateless web servers behind a load balancer
Typical price (t3.medium spot): $0.011/hour = ~$8/month (74% off)
4. Savings Plans (Modern Alternative to RIs)
Commit to a spending amount ($/hour) for 1 or 3 years. More flexible than RIs.
- Compute Savings Plan: Applies to any instance family, any region, any OS. Up to 66% off.
- EC2 Instance Savings Plan: Locked to instance family in one region. Up to 72% off.
- When to use: Steady workloads where instance types might change
Savings Plans are recommended over RIs for most users because they automatically apply to whatever instances you run, without manual management.
Instance Types Decoded
AWS instance names look like gibberish but follow a pattern:
t3.medium
│ └────── size
└─────── family + generation
Instance Families Cheat Sheet
| Family | Name | Best For | Example | |--------|------|----------|---------| | t3/t4g | Burstable | Web servers, dev environments, low-traffic apps | t3.medium | | m5/m6i | General Purpose | Most applications, balanced CPU/memory | m5.large | | c5/c6i | Compute Optimized | CPU-heavy workloads, batch processing | c5.xlarge | | r5/r6i | Memory Optimized | Databases, in-memory caches, data processing | r5.large | | g4/g5 | GPU Instances | ML training, video encoding, graphics | g4dn.xlarge | | i3/i4i | Storage Optimized | High-IOPS databases, data warehousing | i3.large |
ARM vs x86: The Graviton Revolution
AWS Graviton (ARM-based) instances are 20-40% cheaper than equivalent x86 instances with similar performance:
| Instance | Architecture | Price/hour | Performance | |----------|-------------|------------|-------------| | m6i.large | x86 (Intel) | $0.0965 | Baseline | | m6a.large | x86 (AMD) | $0.0835 | -5% vs Intel | | m7g.large | ARM (Graviton) | $0.0645 | +15% vs Intel |
If your application supports ARM (most do in 2026), switching to Graviton instances is the easiest cost win on AWS.
Supported: Node.js, Python, Go, Rust, Java, Docker, most Linux distributions. Not supported: Windows, legacy x86 binaries.
Hidden Costs That Inflate Your Bill
1. EBS Storage (Often Forgotten)
Every EC2 instance needs storage. EBS volumes cost extra:
| Volume Type | Price (us-east-1) | Use Case | |------------|-------------------|----------| | gp3 (General Purpose) | $0.08/GB-month | Default choice, SSD | | io2 (Provisioned IOPS) | $0.125/GB-month + $0.065/IOPS | Databases needing guaranteed IOPS | | st1 (Throughput Optimized) | $0.045/GB-month | Big data, log processing |
Cost trap: A 100GB gp3 volume costs $8/month. Five unused volumes across your account = $40/month wasted.
Fix: Audit EBS volumes monthly. Delete unattached volumes:
aws ec2 describe-volumes --filters Name=status,Values=available --query 'Volumes[*].{ID:VolumeId,Size:Size}' --output table
2. Data Transfer (The Silent Killer)
| Transfer Direction | Price | |-------------------|-------| | Inbound to AWS | Free | | Outbound to internet | $0.09/GB (first 100TB) | | Between AZs (same region) | $0.01/GB each way | | Between regions | $0.02-0.09/GB |
Cost trap: An app that transfers 500GB/month to users costs $45/month in data transfer alone. Cross-AZ traffic is especially sneaky — a database in AZ-a serving an API in AZ-b generates constant transfer fees.
Fix: Keep dependent services in the same AZ. Use CloudFront CDN to reduce direct data transfer.
3. NAT Gateway
| Resource | Price | |----------|-------| | NAT Gateway | $0.045/hour ($32.85/month) | | Plus data processing | $0.045/GB processed |
Cost trap: A single NAT Gateway in a VPC with 1TB of outbound traffic costs $32.85 + $45 = $77.85/month.
Fix: Use VPC Endpoints for S3 and DynamoDB (free for Gateway endpoints). Route compatible traffic through endpoints instead of NAT.
4. Elastic IPs
| Resource | Price | |----------|-------| | Elastic IP attached to running instance | Free | | Elastic IP NOT attached | $0.005/hour ($3.60/month) |
Cost trap: Old EIPs from terminated instances. 10 forgotten EIPs = $36/month.
Fix: Always release EIPs when terminating instances:
aws ec2 describe-addresses --query 'Addresses[?InstanceId==null].PublicIp' --output text
5. Load Balancers
| Type | Price | |------|-------| | Application Load Balancer | $0.0225/hour ($16.20/month) + $0.008/LCU-hour | | Network Load Balancer | $0.0225/hour ($16.20/month) + $0.006/GB processed |
Cost trap: Multiple ALBs for services that could share one. Each unused ALB = $16+/month.
Fix: Use path-based routing to serve multiple services from a single ALB.
7 Proven Strategies to Cut EC2 Costs
Strategy 1: Right-Size Your Instances
Most instances are over-provisioned. A service "needs" an m5.xlarge but actually uses 10% CPU and 2GB RAM.
Action: Install CloudWatch agent, monitor for 2 weeks, then downsize.
# Check CPU utilization
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--start-time 2026-06-01T00:00:00Z \
--end-time 2026-06-15T00:00:00Z \
--period 86400 \
--statistics Average \
--output table
If average CPU is below 20%, downsize. If below 10%, downsize two sizes.
Strategy 2: Move to Graviton (ARM)
Switch from x86 to Graviton instances for 20-40% savings with no performance loss:
# Before (x86)
m5.large → $0.096/hour
# After (ARM)
m7g.large → $0.065/hour
# Savings: 32%
Most Linux distributions and modern runtimes support ARM out of the box.
Strategy 3: Use Spot Instances for Stateless Workloads
For CI/CD workers, batch jobs, and any service behind a load balancer:
# Example: Launch a spot instance
import boto3
ec2 = boto3.client('ec2')
response = ec2.run_instances(
ImageId='ami-0abcdef1234567890',
InstanceType='t3.medium',
MaxCount=1,
MinCount=1,
InstanceMarketOptions={
'MarketType': 'spot',
'SpotOptions': {
'SpotInstanceType': 'one-time',
'MaxPrice': '0.02'
}
}
)
Handle termination gracefully with a shutdown script triggered by the 2-minute warning.
Strategy 4: Use Savings Plans for Steady Workloads
Commit to a consistent usage level:
# View recommendations
aws savingsplans describe-savings-plan-rates
Typical savings: 50-66% compared to on-demand, with automatic application across instance types.
Strategy 5: Schedule Non-Production Instances
Dev and staging environments don't need to run 24/7:
# Stop instances every night at 7 PM
# Using AWS Systems Manager or EventBridge + Lambda
# Stop
aws ec2 stop-instances --instance-ids i-1234567890abcdef0
# Start
aws ec2 start-instances --instance-ids i-1234567890abcdef0
Savings: If your dev environment runs 8 hours/day instead of 24, you save 67% on those instances.
Strategy 6: Use Auto Scaling Groups
Don't run instances at fixed capacity. Let Auto Scaling adjust:
AutoScalingGroup:
MinSize: 1
MaxSize: 5
TargetTrackingConfiguration:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 50.0
This ensures you're only running what you need, scaling up during peak traffic and down during quiet periods.
Strategy 7: Use CloudFront to Reduce Data Transfer
Serving content directly from EC2 costs $0.09/GB in data transfer. Serving through CloudFront costs $0.085/GB (and less at higher tiers):
| Data Transfer (GB/month) | Direct from EC2 | Via CloudFront | Savings | |--------------------------|----------------|----------------|---------| | 100 | $9.00 | $8.50 | 6% | | 1,000 | $90.00 | $85.00 | 6% | | 10,000 | $900.00 | $600.00 | 33% |
At higher data volumes, CloudFront tiered pricing makes the savings significant.
Free Tools for AWS Cost Monitoring
- AWS Cost Explorer — Built-in, free. Visualize spending trends.
- AWS Budgets — Set alerts for spending thresholds. Free.
- CloudWatch Billing Alarms — Get paged when costs spike. Free.
- Infisical / Doppler — Track cloud spending across providers.
- Vantage — Third-party cost optimization platform. Free tier available.
- CloudCarbonFootprint — Open-source. Shows cost and carbon footprint.
Real Cost Savings: Before and After
We applied these strategies to a real production workload:
| Metric | Before | After | Savings | |--------|--------|-------|---------| | Instance type | 4x m5.xlarge on-demand | 4x m7g.large with Savings Plan | 48% | | EBS volumes | 500GB (lots of waste) | 200GB (right-sized) | 60% | | Data transfer | Direct from EC2 | Via CloudFront | 25% | | Dev environment | Running 24/7 | Scheduled 8x5 | 67% | | NAT Gateway traffic | All traffic | VPC endpoints for S3/DynamoDB | 40% | | Total monthly cost | $580/month | $210/month | 64% |
That's $4,400/year saved on a single small project. At scale, these savings multiply dramatically.
Conclusion
AWS EC2 pricing is intentionally complex. Every component — instances, storage, network, load balancers — has its own pricing model. Understanding these models is the key to controlling your cloud spend.
The 7 strategies in this guide, applied systematically, can reduce your EC2 bill by 60% or more. Start with the easiest wins:
- Switch to Graviton (immediate 20-40% savings)
- Right-size instances (monitor and downsize)
- Buy Savings Plans (for steady-state workloads)
- Schedule non-production instances (free 67% on dev/staging)
Cloud computing isn't cheap by default. But with informed decisions, it can be remarkably cost-effective.