Cloud bills grow quietly. A test server stays on. A disk is left behind. Nobody owns the bill.
This post is a simple FinOps checklist. FinOps simply means managing cloud costs on purpose, as a shared habit. It works for AWS and Microsoft Azure. Do the steps in order. Each step makes the next one easier.
In this guide, CloudSkill Consulting LLC walks you through seven steps. First you see your costs. Then you label them with tags, remove waste and resize servers. After that you commit to steady use, set alerts, and review every month.
Figure 1. The seven steps, in the order you should do them.
Step 1: Turn on cost views
You can't fix what you can't see.
- AWS: Open Cost Explorer in the Billing and Cost Management console. Look at cost by service and by account.
- Azure: Open Cost Management, then Cost analysis. Look at cost by resource group and by service.
Pick one view. Save it. You will use it every month.
Step 2: Tag everything
Tags tell you who owns a resource and why it exists. Start with three keys:
| Tag key | Example value | Why it helps |
|---|---|---|
owner |
data-platform |
You know who to ask |
env |
dev, test, prod
|
You can find non-prod waste fast |
project |
billing-api |
You can split the bill by project |
Two things people miss:
- AWS: User-defined tags do not show up in cost reports until you activate them as cost allocation tags in the Billing console.
- Azure: Use Azure Policy to require tags on new resources. Then untagged resources can't sneak in.
Keep the same tag keys on both clouds. Same spelling. Same case.
Figure 2. Three tag keys to start with, and the one extra step each cloud needs.
Step 3: Find idle resources
This is often the fastest win. Look for things you pay for but don't use.
Unattached disks and unused public IPs on AWS. A volume in the available state is not attached to any instance. An Elastic IP with no association is not in use, and AWS charges for public IPv4 addresses.
# AWS: list unattached EBS volumes in the current region
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query "Volumes[].{ID:VolumeId,SizeGiB:Size,Type:VolumeType,AZ:AvailabilityZone}" \
--output table
# AWS: list Elastic IPs that are not associated with anything
aws ec2 describe-addresses \
--query "Addresses[?AssociationId==null].{IP:PublicIp,AllocationId:AllocationId}" \
--output table
# AWS: run the volume check in every enabled region
for r in $(aws ec2 describe-regions --query "Regions[].RegionName" --output text); do
echo "== $r"
aws ec2 describe-volumes --region "$r" \
--filters Name=status,Values=available \
--query "Volumes[].VolumeId" --output text
done
Unattached managed disks on Azure. When a managed disk is not attached to a VM, its managedBy property is null.
# Azure: list unattached managed disks in the current subscription
az disk list \
--query '[?managedBy==`null`].{Name:name,RG:resourceGroup,SizeGB:diskSizeGb}' \
-o table
Azure CLI options can change between versions, so check the Azure CLI docs for your version before you run these.
Before you delete anything:
- Check the tags. Ask the owner.
- Take a snapshot if the data might matter (
aws ec2 create-snapshot --volume-id <id>on AWS). - Then delete (
aws ec2 delete-volume --volume-id <id>on AWS,az disk delete --ids <id> --yeson Azure).
Deleting a disk is permanent. Go slow here.
Figure 3. How to spot idle disks and IPs, and the safe order for removing them.
Also look for VMs that are on all night and all weekend in dev and test. Azure VMs have a built-in auto-shutdown setting. On AWS, you can use the Instance Scheduler on AWS solution or a simple scheduled job.
Step 4: Rightsize
Rightsize means picking a smaller server that still does the job. Many servers are bigger than they need to be. Both clouds will tell you which ones.
- AWS Compute Optimizer looks at usage and suggests better instance sizes. You need to opt in first.
- Azure Advisor has a Cost category with rightsizing and shutdown advice.
# AWS: see rightsizing findings (after you opt in to Compute Optimizer)
aws compute-optimizer get-ec2-instance-recommendations \
--query "instanceRecommendations[].{Instance:instanceArn,Finding:finding}"
# Azure: list cost recommendations from Azure Advisor
az advisor recommendation list --category Cost -o table
Change one thing at a time. Watch performance for a week. Then move on.
Step 5: Commit for steady use
Some workloads run 24/7 and will keep running. For those, a commitment is usually cheaper than on-demand pricing.
- AWS: Savings Plans and Reserved Instances, with 1-year or 3-year terms.
- Azure: Azure Reservations and the Azure savings plan for compute, also with 1-year or 3-year terms.
Simple rule: rightsize first, then commit. If you commit to a server that is too big, you lock in the waste.
Figure 4. Steps 4 and 5 work together: rightsize first, then commit.
Step 6: Set budgets and alerts
A budget will not fix waste. But it tells you early when something goes wrong.
- AWS Budgets: Create a monthly cost budget. Add alerts at levels you choose, for example when actual or forecast spend crosses part of the budget.
- Azure Cost Management budgets: Create a budget at the subscription or resource group level. Add alert conditions and email recipients. You can also connect an action group (a set of actions Azure runs when an alert fires).
Note: by default, alerts only notify people. They do not stop resources. Make sure a real person reads them.
Figure 5. A budget alert warns a person early. By default, it does not stop anything.
Step 7: Review every month
Put a short meeting on the calendar. Same day each month. Use the saved view from Step 1.
Ask four questions:
- What went up, and why?
- Are there new untagged resources?
- Are there new idle disks or IPs?
- Do our commitments still match our steady usage?
That's it. Small, boring, and it works.
Quick copy-paste checklist
- [ ] Cost Explorer and Cost Management views saved
- [ ]
owner,env,projecttags on everything (and activated on AWS) - [ ] Unattached disks and unused IPs reviewed
- [ ] Non-prod VMs shut down at night
- [ ] Rightsizing advice reviewed (Compute Optimizer, Azure Advisor)
- [ ] Commitments only for steady, right-sized workloads
- [ ] Budgets and alerts set, with a named owner
- [ ] Monthly review on the calendar
About the author: CloudSkill Consulting LLC is a cloud consulting firm in Omaha, Nebraska, founded in September 2024. We work on AWS, Microsoft Azure and Google Cloud, with a focus on cost control (FinOps), multi-cloud planning and migration. We also provide technical and IT services across the USA. If this checklist helped, you can find more at cloudskillconsulting.com.





Top comments (0)