<?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: Varun Sharma</title>
    <description>The latest articles on DEV Community by Varun Sharma (@sharmavarun).</description>
    <link>https://dev.to/sharmavarun</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%2F4106909%2F98930262-4a96-4faa-8f7e-125cbf748e24.png</url>
      <title>DEV Community: Varun Sharma</title>
      <link>https://dev.to/sharmavarun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sharmavarun"/>
    <language>en</language>
    <item>
      <title>Killing Cloud Waste: Automating FinOps, Anomaly Detection, and Budget Enforcement</title>
      <dc:creator>Varun Sharma</dc:creator>
      <pubDate>Wed, 02 Sep 2026 22:26:05 +0000</pubDate>
      <link>https://dev.to/sharmavarun/killing-cloud-waste-how-to-automate-finops-ai-analytics-and-hard-budget-boundaries-53g5</link>
      <guid>https://dev.to/sharmavarun/killing-cloud-waste-how-to-automate-finops-ai-analytics-and-hard-budget-boundaries-53g5</guid>
      <description>&lt;p&gt;Cloud infrastructure makes over-provisioning effortless. A single configuration change can deploy an unneeded high-memory cluster, and without guardrails, waste accumulates quickly: unattached storage volumes, oversized worker nodes, continuous non-production environments, and stale test resources. Periodic spreadsheet audits cannot keep up with high-velocity engineering teams. Across large enterprise multi-cloud footprints in AWS and Azure, the solution is embedding FinOps directly into continuous integration and cloud governance pipelines rather than auditing spend retroactively. Implemented effectively, proactive guardrails typically reduce recurring cloud spend by 15% to 20% or more. Here is the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Enforce tagging at deployment, not after the fact
&lt;/h2&gt;

&lt;p&gt;You cannot optimize or allocate spend that lacks clear attribution. Every cloud asset requires consistent metadata designating its owning team, environment, and cost center — enforced strictly at provisioning time rather than reconciled after the billing cycle closes.&lt;/p&gt;

&lt;p&gt;Using AWS Service Control Policies (SCPs) or Azure Policy, platform teams can prevent resource creation whenever mandatory tags are missing, regardless of local role privileges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: AWS Service Control Policy requiring a &lt;code&gt;CostCenter&lt;/code&gt; tag&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EnforceRequiredCostCenterTag"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"ec2:RunInstances"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"rds:CreateDBInstance"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Null"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"aws:RequestTag/CostCenter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any &lt;code&gt;RunInstances&lt;/code&gt; or &lt;code&gt;CreateDBInstance&lt;/code&gt; API call without the tag is denied at the platform boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Hard budget limits for non-prod
&lt;/h2&gt;

&lt;p&gt;Budget alerts frequently turn into inbox noise. Hard automated boundaries do not. In development, sandbox, and staging accounts, enforce spending caps programmatically instead of relying on email notifications.&lt;/p&gt;

&lt;p&gt;When a sandbox environment breaches its monthly financial threshold, a budget notification triggers an event-driven automation (such as an AWS Lambda function) to attach a restrictive IAM permissions boundary across developer and CI/CD provisioning roles. This halts new infrastructure provisioning until existing waste is cleaned up or the billing cycle resets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: IAM permissions boundary applied upon budget breach&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RestrictProvisioningOnBudgetExceeded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"ec2:RunInstances"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"rds:CreateDBInstance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"eks:CreateCluster"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"redshift:CreateCluster"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures teams actively decommission unused infrastructure rather than letting orphaned resources run indefinitely.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Shift-left cost guardrails in CI/CD
&lt;/h2&gt;

&lt;p&gt;Catching provisioning anomalies after resources hit the cloud still incurs unnecessary cost and cleanup overhead. Shift-left FinOps moves cost visibility directly into the pull request workflow.&lt;/p&gt;

&lt;p&gt;By running static infrastructure-as-code analysis (such as Infracost) during continuous integration, teams can automatically post monthly expenditure diffs onto pull requests. Pipelines can automatically fail if an infrastructure change introduces a delta exceeding defined budgets without platform team sign-off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: GitHub Actions pull request cost check&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;FinOps CI Guardrail&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cost-estimate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;infracost/actions/setup@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;api-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.INFRACOST_API_KEY }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Calculate Terraform Cost Delta&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;infracost diff --path=terraform/ \&lt;/span&gt;
                         &lt;span class="s"&gt;--format=json \&lt;/span&gt;
                         &lt;span class="s"&gt;--out-file=infracost.json&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enforce Spending Threshold&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;diff=$(jq '.diffTotalMonthlyCost | tonumber' infracost.json)&lt;/span&gt;
          &lt;span class="s"&gt;if (( $(echo "$diff &amp;gt; 500" | bc -l) )); then&lt;/span&gt;
            &lt;span class="s"&gt;echo "Cost increase (\$${diff}/mo) exceeds policy limit (\$500/mo). Architecture approval required."&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the two fixes from a first draft of this pipeline: the cost comparison needs &lt;code&gt;infracost diff&lt;/code&gt; (not &lt;code&gt;breakdown&lt;/code&gt;, which only produces a point-in-time snapshot with no &lt;code&gt;diffTotalMonthlyCost&lt;/code&gt; field to parse), and the failure message needs &lt;code&gt;\$&lt;/code&gt; to escape the dollar sign correctly in bash — &lt;code&gt;$$&lt;/code&gt; expands to the shell's process ID, not a literal &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Automated off-hours scheduling for non-prod
&lt;/h2&gt;

&lt;p&gt;Non-production environments run 168 hours a week, but development teams typically only use them for 40 to 50 hours. Leaving sandbox and staging compute active 24/7 wastes over 60% of its monthly cost.&lt;/p&gt;

&lt;p&gt;Automate downtime using EventBridge Scheduler rules invoking a targeted Lambda function or Systems Manager Automation runbook:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Schedules:&lt;/strong&gt; Trigger a stop payload at 7:00 PM local time Monday through Friday, and start compute back up at 7:00 AM. Keep resources stopped across weekends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target filters:&lt;/strong&gt; Match on &lt;code&gt;Environment == "non-prod"&lt;/code&gt; and &lt;code&gt;ScheduleOptOut != "true"&lt;/code&gt;, allowing long-running load tests to opt out temporarily with an expiration tag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource scope:&lt;/strong&gt; Target Auto Scaling Groups (scale min/desired capacity to 0), standalone RDS instances, and Karpenter/EKS nodepools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Real-time anomaly detection with LLM analysis
&lt;/h2&gt;

&lt;p&gt;Catching a cost misconfiguration on a monthly invoice is too late. A responsive setup processes billing and Cost and Usage Report (CUR) files as they land in S3 or Blob Storage.&lt;/p&gt;

&lt;p&gt;An EventBridge trigger runs a lightweight orchestrator that feeds current consumption deltas to an LLM (such as Amazon Bedrock or Azure OpenAI Service) alongside historical baselines. Instead of dispatching vague threshold alerts, the system generates a concise Slack or Teams notification identifying the exact microservice spiking spend, projecting the 30-day impact, and outlining the specific IaC right-sizing change required.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A[Cloud Billing / CUR Data] --&amp;gt;|lands in| B[S3 / Blob Storage]
    B --&amp;gt;|Trigger| C[EventBridge / Event Grid]
    C --&amp;gt;|Invoke| D[Serverless Orchestrator&amp;lt;br/&amp;gt;e.g. Lambda]
    D --&amp;gt;|Query &amp;amp; Analyze| E[Bedrock / Azure OpenAI&amp;lt;br/&amp;gt;Predictive Cost Analysis]
    E --&amp;gt;|Output Context| F[Slack / Teams Alert&amp;lt;br/&amp;gt;with Remediation Code]
    E --&amp;gt;|Action| G[Auto-Pause Idle Resources]&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  6. Automated cleanup of orphaned resources
&lt;/h2&gt;

&lt;p&gt;Unattached EBS volumes, unassociated Elastic IPs, and stale snapshots accumulate quietly over time. Rather than maintaining custom cleanup scripts, declarative engines like Cloud Custodian manage this through version-controlled rules.&lt;/p&gt;

&lt;p&gt;A reliable safety pattern ensures no storage volume is deleted without a compliant snapshot taken first, followed by a mandatory grace period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Cloud Custodian policy for orphaned EBS volumes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;policies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ebs-orphaned-volume-backup&lt;/span&gt;
    &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ebs&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Finds unattached EBS volumes, generates a backup snapshot, and marks for deletion after a grace period.&lt;/span&gt;
    &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Attachments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tag:custodian_cleanup"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;absent&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;snapshot&lt;/span&gt;
        &lt;span class="na"&gt;copy-tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;CostCenter&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Environment&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tag&lt;/span&gt;
        &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;custodian_cleanup&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;backed-up"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mark-for-op&lt;/span&gt;
        &lt;span class="na"&gt;op&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;delete&lt;/span&gt;
        &lt;span class="na"&gt;days&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;
        &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;custodian_cleanup_delete&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ebs-orphaned-volume-delete&lt;/span&gt;
    &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ebs&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deletes unattached volumes that carry a verified backup tag and have completed the 7-day grace period.&lt;/span&gt;
    &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Attachments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tag:custodian_cleanup"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;backed-up"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;marked-for-op&lt;/span&gt;
        &lt;span class="na"&gt;op&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;delete&lt;/span&gt;
        &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;custodian_cleanup_delete&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;delete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first policy acts as an immutable safety check: nothing enters the deletion queue without an associated backup tag. The second policy only evaluates assets that have survived the grace period with that tag present. Run these via periodic cron jobs, or deploy Custodian in Lambda mode to execute automatically on CloudWatch/EventBridge schedules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters organizationally
&lt;/h2&gt;

&lt;p&gt;Cost management is usually treated as an accounting problem. Once tagging, hard budget enforcement, pipeline checks, and automated hygiene are codified into the deployment platform, FinOps becomes an engineering standard. Spend visibility integrates directly into day-to-day developer workflows, preventing runaway cloud bills without manual intervention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the conversation
&lt;/h2&gt;

&lt;p&gt;How does your team handle cloud waste and runaway non-production costs? Drop a comment below — let's discuss whether you rely more on strict preventative guardrails (like SCPs) or automated remediation scripts.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>cloud</category>
      <category>infrastructure</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
