Cloud FinOps Lite
Practical Examples for Immediate Cost Savings
John Bailey
Asst. Director, Cloud Systems, WashU IT
jwbailey@wustl.edu
Why "FinOps Lite"?
Budget Pressures
Government changes and flat budgets are squeezing higher ed cloud teams
No Tool Budget
You don't need expensive FinOps platforms — built-in cloud tools are enough
3 Quick Wins
One per cloud provider, using only native console or CLI commands
1–2 Hours Each
Every task fits into a single afternoon with immediate savings
The 3 Quick Wins
1
Azure: Orphaned Disks → Snapshots
Find unattached managed disks, snapshot them to archive tier, delete the originals
2
AWS: gp2 → gp3 Volume Migration
Upgrade EBS volumes for 20% savings with better performance — zero downtime
3
GCP: Schedule Non-Prod VMs
Use built-in Instance Schedules to stop dev/test VMs nights and weekends
Azure: Orphaned Disks
Snapshot orphaned managed disks and delete the originals
The Problem: Orphaned Managed Disks
~ $950/mo
wasted on 50 orphaned
P10 (128 GB)
Premium SSD disks
Example:
The Fix: Snapshot & Delete
1
Find unattached disks — Portal: Disks blade → Filter by "Unattached”
2
Review each disk — determine if data may be needed in the future (skip this if you’re in a hurry)
3
Create an archived snapshot of each disk (preserves data as a safety net)
4
Delete the orphaned managed disk
5
Snapshot cost: ~$0.001/GB/mo vs. Premium SSD ~$0.15/GB/mo
CLI: Find all unattached disks
az disk list --query "[?diskState=='Unattached']" -o table
Azure: Savings Summary
~ 99%
Cost reduction per disk
(snapshot vs. Premium SSD)
1-2 hrs
Time to implement
Low Risk
Snapshots preserve your
data as a safety net
$950+ / mo
Example savings
(50 orphaned P10 disks)
Ongoing: Set up Azure Policy to alert when disks sit unattached for 30+ days
AWS: gp2 → gp3 Migration
20% cheaper with better baseline performance — zero downtime
The Problem: gp2 Volumes Everywhere
20%
overspend on every gp2 volume
compared to gp3 pricing
The Fix: Online Volume Migration
1
Identify gp2 volumes — Console: EC2 → Volumes → Filter by type "gp2"
2
Modify volume type to gp3 — done online, no detach required, no downtime
3
For bulk migration: script with AWS CLI (loop through volume IDs)
4
Monitor for 1–2 days — volume enters "optimizing" state, no impact
5
Baseline gp3: 3,000 IOPS + 125 MB/s included at no extra cost
CLI: List all gp2 volume IDs
aws ec2 describe-volumes --filters Name=volume-type,Values=gp2 --query 'Volumes[].VolumeId'
AWS: Savings Summary
20%
Cost reduction per GB
immediate savings
~ 1 hr
Time to implement
(scripted bulk migration)
Very Low Risk
Online modification
no data movement
Better Perf
Performance baseline
bonus for smaller volumes
Ongoing: Tag gp3-migrated volumes and add a Config rule to flag new gp2 volumes at creation
GCP: Schedule Non-Prod VMs
Stop paying for idle dev/test VMs on nights and weekends
The Problem: 24/7 Non-Prod VMs
~ 65%
of non-prod compute cost is
wasted outside business hours
The Fix: Built-in Instance Schedules
1
GCP Instance Schedules — built-in, no extra tools or custom functions
2
Console: Compute Engine → VM Instances → Instance Schedules
3
Define a schedule: e.g. start 7 AM Mon–Fri, stop 7 PM Mon–Fri
4
Attach the schedule to non-prod VMs (use labels for bulk application)
5
Stopped VMs incur zero compute cost (you still pay for attached disks)
CLI: Create an instance schedule
gcloud compute resource-policies create instance-schedule my-schedule \
--vm-start-schedule='0 7 * * 1-5' --vm-stop-schedule='0 19 * * 1-5' --timezone=America/Chicago
GCP: Savings Summary
~ 65%
Compute cost reduction
(business hours only vs. 24/7)
~ 1 hr
Time to set up schedules
and label VMs
Very Low Risk
VMs start/stop cleanly
stateful data on disks preserved
$1,800+/mo
Savings example
(20 n2-standard-4 VMs)
Ongoing: Label new non-prod VMs at creation time to auto-apply schedules via org policy
Wrap-Up
Three quick wins across Azure, AWS, and GCP — no new tools purchased
Combined potential: thousands in monthly savings from a single afternoon of work
Start small, show dollar value to leadership, then build momentum for broader FinOps
Appendix slides cover how to apply each technique across all three clouds
Questions?
John Bailey | jwbailey@wustl.edu
Appendix
Each quick win applied across all three cloud providers
APPENDIX A
AWS: Unattached EBS Volumes → Snapshots
1
Find unattached EBS volumes — Console: EC2 → Volumes → Filter by "available"
2
Review each volume — determine if data is still needed
3
Create an EBS snapshot of each volume (preserves data)
4
Delete the unattached volume
5
Snapshot: ~$0.05/GB/mo vs. gp3: $0.08/GB/mo (gp2: $0.10/GB/mo)
CLI: Find all unattached EBS volumes
aws ec2 describe-volumes --filters Name=status,Values=available --query 'Volumes[].VolumeId'
Savings: ~50% via snapshots, 100% if data is no longer needed
APPENDIX A
GCP: Unattached Persistent Disks → Snapshots
1
Find unattached disks — Console: Compute Engine → Disks → Filter by "In use by: None"
2
Review each disk — determine if data is still needed
3
Create a snapshot (~$0.026/GB/mo vs. pd-ssd $0.17/GB/mo)
4
Delete the unattached persistent disk
5
Can be scripted for bulk cleanup across projects
CLI: Find all unattached persistent disks
gcloud compute disks list --filter="-users:*" --format='table(name,sizeGb,type,zone)'
Savings: ~85% via snapshots, 100% if data is no longer needed
APPENDIX B
Azure: Premium SSD → Standard SSD Right-Sizing
1
Identify Premium SSD disks on non-performance-critical workloads
2
Standard SSD is ~60% cheaper than Premium for workloads that don't need high IOPS
3
Change disk SKU in Portal: Disk → Configuration → Change SKU (requires VM deallocation)
4
Test performance after migration — Standard SSD still offers SSD latency
5
Good candidates: dev/test VMs, file servers, low-traffic web servers
CLI: Find all Premium SSD disks
az disk list --query "[?sku.name=='Premium_LRS']" -o table
Savings: ~60% per disk for qualifying workloads
APPENDIX B
GCP: pd-ssd → pd-balanced Right-Sizing
1
Identify pd-ssd disks on workloads that don't need maximum IOPS
2
pd-balanced: $0.10/GB/mo vs. pd-ssd: $0.17/GB/mo — ~40% savings
3
pd-balanced still provides SSD-level performance for most workloads
4
Create a snapshot, create new pd-balanced disk from snapshot, swap on VM
5
Good candidates: general web apps, CI/CD workers, staging environments
CLI: Find all pd-ssd disks
gcloud compute disks list --filter="type:pd-ssd" --format='table(name,sizeGb,zone)'
Savings: ~40% per disk for qualifying workloads
APPENDIX C
AWS: Scheduling Non-Prod EC2 Instances
1
AWS Instance Scheduler — free CloudFormation template from AWS
2
Tag instances with a schedule name (e.g., "office-hours")
3
Alternative: EventBridge Scheduler rules for simple start/stop
4
Stopped instances incur zero compute cost (EBS charges continue)
5
Typical savings: ~65% on non-prod compute (nights + weekends off)
CLI: Find dev/test instances to schedule
aws ec2 describe-instances --filters Name=tag:Environment,Values=dev,test \
--query 'Reservations[].Instances[].InstanceId'
Use the AWS Instance Scheduler solution — deploy via CloudFormation in ~15 minutes
APPENDIX C
Azure: Auto-Shutdown + Automation for Non-Prod VMs
1
Auto-Shutdown is built-in — one click per VM in the Portal
2
For scheduled start: use Azure Automation runbooks or Logic Apps
3
Tag non-prod VMs (e.g., "env:dev") and apply schedules by tag
4
Stopped (deallocated) VMs incur zero compute cost
5
Typical savings: ~65% on non-prod compute
CLI: Set auto-shutdown on a VM
az vm auto-shutdown -g myResourceGroup -n myVM --time 1900 --timezone "Central Standard Time"
Combine auto-shutdown with Azure Automation Start/Stop VMs solution for full scheduling