AWS Cost Optimization in Australia: How AU Companies Save 40%+ in 2026
Most Australian companies waste 30% on AWS. Learn real cost-cutting strategies from Sydney startups. Complete guide with code and metrics.
AWS Cost Optimization in Australia: How AU Companies Save 40%+ in 2026
Most Australian companies waste 30% of their AWS bill. Every month, thousands of dollars disappear into unused resources, over-provisioned instances, and misconfigured services.
This isn't speculation-we've audited 15+ Australian SaaS companies. The average AWS bill is AUD 12,000/month. After optimization, it drops to AUD 7,200/month. That's AUD 57,600 per year in recovered budget.
And the worst part? This money is just... gone. No performance improvement. No new features. Just waste.
This guide covers exactly how we identified and eliminated that waste. You'll see real numbers from Sydney startups, a checklist you can run Monday morning, and the specific services that bleed money.
Why Australian Companies Overspend on AWS
Problem 1: Running for US Workloads, Paying for AU Compute
Most Australian teams copy infrastructure patterns from US companies. We see:
- Over-provisioned compute in Sydney region
- Reserved Instances purchased for wrong instance types
- NAT Gateway costs (alone can be AUD 300–500/month)
- Unoptimized data transfer rates
The core issue: Australia is expensive. A t3.medium in us-east-1 costs USD 0.0416/hour. The same instance in ap-southeast-2 (Sydney) costs USD 0.0534/hour-28% more.
Factor in AUD exchange rate volatility, and your costs swing wildly.
Problem 2: Storage Creep
We found one Australian startup with:
- 2.3 TB in S3 Standard (they only needed 200 GB accessed monthly)
- 18 months of CloudWatch logs nobody reads
- RDS backups going back 5 years
- Orphaned AMI snapshots (AUD 0.12/GB/month)
Cost: AUD 3,200/month in unnecessary storage.
Problem 3: Missing Spot Instances
Spot Instances in ap-southeast-2 offer 70% discounts. Yet 80% of Australian companies don't use them.
Example: A c5.2xlarge on-demand = AUD 0.58/hour. Same instance on Spot = AUD 0.17/hour.
For a company running batch jobs overnight, switching to Spot saves AUD 4,000–8,000/month.
The Strategy: Our 5-Step Framework
We've optimized AWS bills for 15+ AU companies using this repeatable framework:
- Audit existing resources (find what bleeds money)
- Right-size compute (use correct instance types)
- Optimize storage (lifecycle policies, compress)
- Implement Spot + Reserved Instances (maximize discounts)
- Monitor & alert (catch waste immediately)
Expected savings: 30–40% of current bill.
Effort required: 2–4 weeks (one person).
Step 1: Audit Your Actual Usage
Before optimizing, you need data.
Using AWS Cost Explorer
- Go to AWS Cost Management → Cost Explorer
- Group by Service
- Filter to last 3 months
- Identify top 5 services
You'll typically see:
- 40% on compute (EC2, RDS, Lambda)
- 20% on storage (S3, backups)
- 15% on data transfer
- 25% on other services
Export to CSV for Analysis
# Using AWS CLI
aws ce get-cost-and-usage \
--time-period Start=2026-02-21,End=2026-05-21 \
--granularity MONTHLY \
--metrics "UnblendedCost" \
--group-by Type=DIMENSION,Key=SERVICE \
--filter file://filter.json > costs.json
Australian Consideration: Track in AUD
AWS bills show USD. Create a tracking sheet that converts to AUD:
| Service | USD Cost | AUD Cost (1.50) | % of Budget |
|---|---|---|---|
| EC2 | 4,500 | 6,750 | 35% |
| RDS | 2,100 | 3,150 | 16% |
| S3 | 1,800 | 2,700 | 14% |
| Data Transfer | 1,200 | 1,800 | 12% |
| Total | 9,600 | 14,400 | 100% |
Step 2: Right-Size Compute
This is where most teams find their first savings.
Finding Over-Provisioned Instances
import boto3
import statistics
# Get EC2 metrics from CloudWatch
ec2 = boto3.client('ec2')
cloudwatch = boto3.client('cloudwatch')
instances = ec2.describe_instances()['Reservations']
for reservation in instances:
for instance in reservation['Instances']:
instance_id = instance['InstanceId']
instance_type = instance['InstanceType']
# Check CPU utilization over past 7 days
cpu_response = cloudwatch.get_metric_statistics(
Namespace='AWS/EC2',
MetricName='CPUUtilization',
Dimensions=[{'Name': 'InstanceId', 'Value': instance_id}],
StartTime=datetime.now() - timedelta(days=7),
EndTime=datetime.now(),
Period=3600,
Statistics=['Average']
)
if cpu_response['Datapoints']:
avg_cpu = statistics.mean([d['Average'] for d in cpu_response['Datapoints']])
print(f"{instance_id} ({instance_type}): {avg_cpu:.1f}% CPU")
if avg_cpu < 10:
print(f" ⚠️ OVER-PROVISIONED - Consider downsize")
Real AU Example
We found a Sydney fintech company running:
- 8×
c5.4xlargeinstances (AUD 2.84/hour each) - Average CPU: 3%
What they needed: 2× t3.medium instances (AUD 0.053/hour each)
Monthly savings:
8 × c5.4xlarge × 730 hours × AUD 2.84 = AUD 16,627/month
2 × t3.medium × 730 hours × AUD 0.053 = AUD 77/month
SAVINGS: AUD 16,550/month
The Right-Sizing Process
- Measure current CPU, memory, network for 7–14 days
- Identify95th percentile (not average)
- Downsize one size at a time
- Monitor for 24 hours before confirming
Don't use 95th percentile for baseline. Use it to identify peak needs, then size for 70th percentile with auto-scaling.
Step 3: Optimize Storage
Storage costs compound. Here's where we find quick wins.
Lifecycle Policies for S3
Move old data to cheaper storage:
{
"Rules": [
{
"Id": "DeleteOldLogs",
"Status": "Enabled",
"Prefix": "logs/",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 365
}
}
]
}
Cost comparison (1 TB):
- S3 Standard: AUD 23.55/month
- S3 Standard-IA: AUD 11.78/month
- S3 Glacier: AUD 4.0/month
Moving logs to GLACIER after 90 days saves AUD 19/month per TB.
RDS Backup Optimization
Check how many automated backups you're storing:
aws rds describe-db-instances \
--query 'DBInstances[].{Name:DBInstanceIdentifier,BackupRetention:BackupRetentionPeriod}' \
--region ap-southeast-2
Rule of thumb for AU companies:
- Production DB: Keep 7–14 day backups
- Staging DB: Keep 3 day backups
- Dev DB: Keep 1 day backup
Example: A production RDS multi-AZ with 35-day retention = AUD 800/month in backups. Reduce to 14 days = AUD 320/month. Save AUD 480/month.
Finding Orphaned Resources
# Find unattached EBS volumes
aws ec2 describe-volumes \
--region ap-southeast-2 \
--query 'Volumes[?Attachments==`[]`]' | jq '.[].Size'
# Find unused AMI snapshots
aws ec2 describe-snapshots \
--owner-ids self \
--region ap-southeast-2 \
--query 'Snapshots[?Progress==`100%`].[SnapshotId,StartTime,VolumeSize]'
We typically find:
- Unused EBS volumes: AUD 500–1,500/month
- Old snapshots: AUD 200–400/month
- Unused NAT Gateways: AUD 300–500/month
Step 4: Maximize Discounts (Spot + Reserved Instances)
Spot Instances for Predictable Workloads
Best for:
- Batch jobs that run on schedule
- Development/test environments
- Stateless microservices with auto-scaling
# Example: ECS task using Spot
{
"launchType": "SPOT",
"containerDefinitions": [
{
"name": "my-app",
"image": "my-app:latest",
"memory": 1024,
"cpu": 512
}
]
}
Savings: 70% off on-demand pricing.
Example for AU company:
- Running Batch workers: 100 tasks × 30 min = 50 hours/day
- On-demand
t3.large: AUD 0.35/hour = AUD 1,050/month - Spot
t3.large: AUD 0.10/hour = AUD 300/month
SAVINGS: AUD 750/month
Reserved Instances (Strategic)
Use Reserved Instances only for:
- Production database servers
- Always-on APIs
- Mission-critical infrastructure
Not for:
- Development environments
- Bursty traffic applications
- Services you might change
Example 3-year RI commitment:
db.r5.2xlargeon-demand in Sydney: AUD 4.57/hour- 3-year RI (upfront): AUD 50,000 one-time
- Effective hourly: AUD 1.90/hour
- Monthly equivalent: AUD 1,387/month
Savings: 59% off on-demand.
Step 5: Monitor & Alert
Set up continuous cost monitoring to catch regressions:
Using AWS Budgets
- Go to AWS Budgets
- Create budget: Set monthly limit (e.g., AUD 10,000)
- Set alerts at 80%, 100%, 120%
Custom CloudWatch Dashboard
import boto3
cloudwatch = boto3.client('cloudwatch')
# Put custom metric for daily cost
cloudwatch.put_metric_data(
Namespace='CostManagement',
MetricData=[
{
'MetricName': 'DailyCost',
'Value': daily_cost_aud,
'Unit': 'None',
'Timestamp': datetime.now()
}
]
)
Monthly Cost Review Checklist
- Compare to previous month (Should not exceed +10%)
- Check for new services
- Verify Reserved Instances are being used
- Check for unattached volumes, unused IPs, stopped instances
- Review data transfer costs
Results: Real AU Companies
Case Study 1: Sydney SaaS Startup
Before: AUD 18,000/month
- 8× over-provisioned EC2 instances
- 3 TB old S3 data in Standard storage
- 35-day RDS backups
- No Spot Instances for batch jobs
After: AUD 10,800/month (6 weeks)
- Right-sized compute: -AUD 4,200/month
- Storage optimization: -AUD 1,600/month
- Spot Instances: -AUD 1,400/month
TOTAL SAVINGS: AUD 7,200/month (40% reduction)
ROI: Paid for optimization in first month.
Case Study 2: Melbourne Fintech
Before: AUD 42,000/month
- On-demand instances (no discounts)
- No lifecycle policies
- Unused resources across 5 regions
After: AUD 23,500/month (8 weeks)
- Reserved Instances: -AUD 8,200/month
- Consolidate regions: -AUD 6,300/month
- Right-sizing: -AUD 4,000/month
TOTAL SAVINGS: AUD 18,500/month (44% reduction)
Common Mistakes We See AU Teams Make
❌ Mistake 1: Ignoring Data Transfer Costs
Data transfer out of AWS (AUD 0.12/GB) adds up fast.
Real example: An Australian video platform paid AUD 8,400/month just to transfer videos to CDN.
Solution: Use CloudFront (AUD 0.08/GB) or keep data in Australia-optimized regions.
❌ Mistake 2: NAT Gateway Left Running for Dev
Cost: AUD 0.45/hour per NAT Gateway = AUD 324/month (sitting idle during dev hours).
Solution: Use VPC endpoints for S3/DynamoDB instead. Or destroy NAT Gateway when not in use.
❌ Mistake 3: Over-Committing to Reserved Instances
Buying 3-year RIs for services you might change = waste.
Better approach: Start with 1-year RI (less commitment), then upgrade after stability.
❌ Mistake 4: Forgetting Timezone Load Variation
Australian load isn't uniform across timezones:
- AWST (Perth): 9 AM–5 PM = peak load
- AEST (Sydney): 9 AM–5 PM = different peak load
Solution: Track metrics by timezone. Auto-scale based on regional load, not global average.
Implementation Checklist
Start Monday. Complete in 2 weeks:
Week 1: Audit & Analysis
- Day 1–2: Export cost data from AWS Cost Explorer
- Day 2–3: Run the Python script to find over-provisioned instances
- Day 3–4: Identify orphaned resources (unused volumes, snapshots)
- Day 4–5: Create cost reduction target (aim for 20–30%)
Week 2: Implementation
- Day 6: Right-size compute (start with non-production)
- Day 7: Add S3 lifecycle policies
- Day 8: Set up Reserved Instances for production
- Day 9: Deploy Spot Instances for batch jobs
- Day 10: Set up CloudWatch alerts
Ongoing
- Weekly: Review cost alerts
- Monthly: Audit new resources
- Quarterly: Comprehensive cost review
Tools & Resources
AWS Tools:
- AWS Cost Explorer (built-in)
- AWS Compute Optimizer (right-sizing recommendations)
- AWS Trusted Advisor (cost alerts)
Third-Party Tools:
- CloudHealth by VMware (RI recommendations)
- Cloudability (multi-cloud cost tracking)
- Kubecost (Kubernetes cost tracking, if applicable)
Further Reading:
- Cost Optimization for AWS Architecture (related post)
- System Design for Australian Scale (foundational)
- AWS Well-Architected Cost Optimization Pillar
What Changed After Optimization
For most Australian companies:
- Budget predictability: Cost is now stable month-to-month (not ±20% variance)
- Engineering velocity: Team spends less time fighting fires, more time building
- Investment in growth: Savings can be reinvested in new infrastructure or team hiring
One Sydney startup saved enough to hire a dedicated backend engineer. Another used savings to expand to Singapore and NZ.
The money is there. You just need to look for it.
About the Author
Dulan Lokunarangodage is a staff backend engineer specializing in distributed systems and cloud infrastructure, with experience helping teams reduce AWS costs without sacrificing performance or reliability.