1 of 24

Cloud FinOps Lite

Practical Examples for Immediate Cost Savings

John Bailey

Asst. Director, Cloud Systems, WashU IT

jwbailey@wustl.edu

2 of 24

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

3 of 24

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

4 of 24

Azure: Orphaned Disks

Snapshot orphaned managed disks and delete the originals

5 of 24

The Problem: Orphaned Managed Disks

~ $950/mo

wasted on 50 orphaned

P10 (128 GB)

Premium SSD disks

  • VMs get deleted, but their managed disks often remain behind
  • Unattached Premium and Standard SSD disks incur full monthly charges
  • Easy to accumulate silently over months — no built-in alerts by default
  • Common in dev/test environments where VMs are frequently spun up and torn down

Example:

6 of 24

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

7 of 24

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

8 of 24

AWS: gp2 → gp3 Migration

20% cheaper with better baseline performance — zero downtime

9 of 24

The Problem: gp2 Volumes Everywhere

20%

overspend on every gp2 volume

compared to gp3 pricing

  • gp2 was the default EBS type for years — many orgs never migrated
  • gp3 launched Dec 2020: 20% cheaper per GB with better baseline performance
  • gp3 includes 3,000 IOPS and 125 MB/s baseline (gp2 scales with size)
  • There is almost no reason to stay on gp2 for general-purpose workloads

10 of 24

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'

11 of 24

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

12 of 24

GCP: Schedule Non-Prod VMs

Stop paying for idle dev/test VMs on nights and weekends

13 of 24

The Problem: 24/7 Non-Prod VMs

~ 65%

of non-prod compute cost is

wasted outside business hours

  • Dev, test, and staging VMs typically run 24/7/365 by default
  • Most are only actively used during business hours (Mon–Fri, ~12 hrs)
  • Nobody turns them off because there's no easy automated way… or so they think
  • Example: 20 n2-standard-4 VMs at 24/7 ≈ $2,800/mo; business hours ≈ $980/mo

14 of 24

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

15 of 24

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

16 of 24

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

17 of 24

Questions?

John Bailey | jwbailey@wustl.edu

18 of 24

Appendix

Each quick win applied across all three cloud providers

19 of 24

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

20 of 24

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

21 of 24

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

22 of 24

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

23 of 24

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

24 of 24

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