<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CloudSkill Consulting LLC</title>
    <description>The latest articles on DEV Community by CloudSkill Consulting LLC (@cloudskillconsultingllc).</description>
    <link>https://dev.to/cloudskillconsultingllc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4187968%2F44d15f25-59b1-46bd-83ab-244f0c9dadab.png</url>
      <title>DEV Community: CloudSkill Consulting LLC</title>
      <link>https://dev.to/cloudskillconsultingllc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cloudskillconsultingllc"/>
    <language>en</language>
    <item>
      <title>A 7-Step AWS and Azure Cloud Cost Checklist (With CLI Commands)</title>
      <dc:creator>CloudSkill Consulting LLC</dc:creator>
      <pubDate>Sat, 17 Oct 2026 09:02:39 +0000</pubDate>
      <link>https://dev.to/cloudskillconsultingllc/a-7-step-aws-and-azure-cloud-cost-checklist-with-cli-commands-54ag</link>
      <guid>https://dev.to/cloudskillconsultingllc/a-7-step-aws-and-azure-cloud-cost-checklist-with-cli-commands-54ag</guid>
      <description>&lt;p&gt;Cloud bills grow quietly. A test server stays on. A disk is left behind. Nobody owns the bill.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpxx44nignvashtswppnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpxx44nignvashtswppnh.png" alt=" " width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. The seven steps, in the order you should do them.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Turn on cost views
&lt;/h2&gt;

&lt;p&gt;You can't fix what you can't see.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS:&lt;/strong&gt; Open &lt;strong&gt;Cost Explorer&lt;/strong&gt; in the Billing and Cost Management console. Look at cost by service and by account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure:&lt;/strong&gt; Open &lt;strong&gt;Cost Management&lt;/strong&gt;, then &lt;strong&gt;Cost analysis&lt;/strong&gt;. Look at cost by resource group and by service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick one view. Save it. You will use it every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Tag everything
&lt;/h2&gt;

&lt;p&gt;Tags tell you who owns a resource and why it exists. Start with three keys:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag key&lt;/th&gt;
&lt;th&gt;Example value&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;owner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;data-platform&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You know who to ask&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;env&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;You can find non-prod waste fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;billing-api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You can split the bill by project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things people miss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS:&lt;/strong&gt; User-defined tags do not show up in cost reports until you &lt;strong&gt;activate&lt;/strong&gt; them as cost allocation tags in the Billing console.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure:&lt;/strong&gt; Use &lt;strong&gt;Azure Policy&lt;/strong&gt; to require tags on new resources. Then untagged resources can't sneak in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep the same tag keys on both clouds. Same spelling. Same case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsedt0vhy16ctvskrn49j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsedt0vhy16ctvskrn49j.png" alt=" " width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. Three tag keys to start with, and the one extra step each cloud needs.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Find idle resources
&lt;/h2&gt;

&lt;p&gt;This is often the fastest win. Look for things you pay for but don't use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unattached disks and unused public IPs on AWS.&lt;/strong&gt; A volume in the &lt;code&gt;available&lt;/code&gt; state is not attached to any instance. An Elastic IP with no association is not in use, and AWS charges for public IPv4 addresses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# AWS: list unattached EBS volumes in the current region&lt;/span&gt;
aws ec2 describe-volumes &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;status,Values&lt;span class="o"&gt;=&lt;/span&gt;available &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"Volumes[].{ID:VolumeId,SizeGiB:Size,Type:VolumeType,AZ:AvailabilityZone}"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# AWS: list Elastic IPs that are not associated with anything&lt;/span&gt;
aws ec2 describe-addresses &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"Addresses[?AssociationId==null].{IP:PublicIp,AllocationId:AllocationId}"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# AWS: run the volume check in every enabled region&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;r &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;aws ec2 describe-regions &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"Regions[].RegionName"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"== &lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  aws ec2 describe-volumes &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;status,Values&lt;span class="o"&gt;=&lt;/span&gt;available &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"Volumes[].VolumeId"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Unattached managed disks on Azure.&lt;/strong&gt; When a managed disk is not attached to a VM, its &lt;code&gt;managedBy&lt;/code&gt; property is null.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Azure: list unattached managed disks in the current subscription&lt;/span&gt;
az disk list &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'[?managedBy==`null`].{Name:name,RG:resourceGroup,SizeGB:diskSizeGb}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Azure CLI options can change between versions, so check the &lt;a href="https://learn.microsoft.com/cli/azure/" rel="noopener noreferrer"&gt;Azure CLI docs&lt;/a&gt; for your version before you run these.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you delete anything:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the tags. Ask the owner.&lt;/li&gt;
&lt;li&gt;Take a snapshot if the data might matter (&lt;code&gt;aws ec2 create-snapshot --volume-id &amp;lt;id&amp;gt;&lt;/code&gt; on AWS).&lt;/li&gt;
&lt;li&gt;Then delete (&lt;code&gt;aws ec2 delete-volume --volume-id &amp;lt;id&amp;gt;&lt;/code&gt; on AWS, &lt;code&gt;az disk delete --ids &amp;lt;id&amp;gt; --yes&lt;/code&gt; on Azure).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Deleting a disk is permanent. Go slow here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7zlcwzl7le2ks8j2roc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7zlcwzl7le2ks8j2roc.png" alt=" " width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 3. How to spot idle disks and IPs, and the safe order for removing them.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Also look for VMs that are on all night and all weekend in &lt;code&gt;dev&lt;/code&gt; and &lt;code&gt;test&lt;/code&gt;. Azure VMs have a built-in &lt;strong&gt;auto-shutdown&lt;/strong&gt; setting. On AWS, you can use the &lt;strong&gt;Instance Scheduler on AWS&lt;/strong&gt; solution or a simple scheduled job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Rightsize
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Compute Optimizer&lt;/strong&gt; looks at usage and suggests better instance sizes. You need to opt in first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Advisor&lt;/strong&gt; has a &lt;strong&gt;Cost&lt;/strong&gt; category with rightsizing and shutdown advice.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# AWS: see rightsizing findings (after you opt in to Compute Optimizer)&lt;/span&gt;
aws compute-optimizer get-ec2-instance-recommendations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"instanceRecommendations[].{Instance:instanceArn,Finding:finding}"&lt;/span&gt;

&lt;span class="c"&gt;# Azure: list cost recommendations from Azure Advisor&lt;/span&gt;
az advisor recommendation list &lt;span class="nt"&gt;--category&lt;/span&gt; Cost &lt;span class="nt"&gt;-o&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change one thing at a time. Watch performance for a week. Then move on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Commit for steady use
&lt;/h2&gt;

&lt;p&gt;Some workloads run 24/7 and will keep running. For those, a commitment is usually cheaper than on-demand pricing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS:&lt;/strong&gt; &lt;strong&gt;Savings Plans&lt;/strong&gt; and &lt;strong&gt;Reserved Instances&lt;/strong&gt;, with 1-year or 3-year terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure:&lt;/strong&gt; &lt;strong&gt;Azure Reservations&lt;/strong&gt; and the &lt;strong&gt;Azure savings plan for compute&lt;/strong&gt;, also with 1-year or 3-year terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple rule: rightsize first, then commit. If you commit to a server that is too big, you lock in the waste.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg0h6okhxowejip02dsfj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg0h6okhxowejip02dsfj.png" alt=" " width="799" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 4. Steps 4 and 5 work together: rightsize first, then commit.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Set budgets and alerts
&lt;/h2&gt;

&lt;p&gt;A budget will not fix waste. But it tells you early when something goes wrong.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Budgets:&lt;/strong&gt; Create a monthly cost budget. Add alerts at levels you choose, for example when actual or forecast spend crosses part of the budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Cost Management budgets:&lt;/strong&gt; 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).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: by default, alerts only notify people. They do not stop resources. Make sure a real person reads them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F87o1ylhoi8m64o73ph2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F87o1ylhoi8m64o73ph2y.png" alt=" " width="800" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 5. A budget alert warns a person early. By default, it does not stop anything.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Review every month
&lt;/h2&gt;

&lt;p&gt;Put a short meeting on the calendar. Same day each month. Use the saved view from Step 1.&lt;/p&gt;

&lt;p&gt;Ask four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What went up, and why?&lt;/li&gt;
&lt;li&gt;Are there new untagged resources?&lt;/li&gt;
&lt;li&gt;Are there new idle disks or IPs?&lt;/li&gt;
&lt;li&gt;Do our commitments still match our steady usage?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Small, boring, and it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick copy-paste checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Cost Explorer and Cost Management views saved&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;env&lt;/code&gt;, &lt;code&gt;project&lt;/code&gt; tags on everything (and activated on AWS)&lt;/li&gt;
&lt;li&gt;[ ] Unattached disks and unused IPs reviewed&lt;/li&gt;
&lt;li&gt;[ ] Non-prod VMs shut down at night&lt;/li&gt;
&lt;li&gt;[ ] Rightsizing advice reviewed (Compute Optimizer, Azure Advisor)&lt;/li&gt;
&lt;li&gt;[ ] Commitments only for steady, right-sized workloads&lt;/li&gt;
&lt;li&gt;[ ] Budgets and alerts set, with a named owner&lt;/li&gt;
&lt;li&gt;[ ] Monthly review on the calendar&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;About the author:&lt;/strong&gt; 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 &lt;a href="https://cloudskillconsulting.com" rel="noopener noreferrer"&gt;cloudskillconsulting.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>azure</category>
      <category>finops</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
