<?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: cloudcosttree</title>
    <description>The latest articles on DEV Community by cloudcosttree (@cloudcosttree).</description>
    <link>https://dev.to/cloudcosttree</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%2F4069909%2F3800f17e-1701-4119-bc05-040d90476013.png</url>
      <title>DEV Community: cloudcosttree</title>
      <link>https://dev.to/cloudcosttree</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cloudcosttree"/>
    <language>en</language>
    <item>
      <title>Generating least-privilege IAM policies directly from a Terraform/CloudFormation/Pulumi plan (1,486 resource types mapped)</title>
      <dc:creator>cloudcosttree</dc:creator>
      <pubDate>Wed, 02 Sep 2026 13:07:00 +0000</pubDate>
      <link>https://dev.to/cloudcosttree/generating-least-privilege-iam-policies-directly-from-a-terraformcloudformationpulumi-plan-1486-2mlk</link>
      <guid>https://dev.to/cloudcosttree/generating-least-privilege-iam-policies-directly-from-a-terraformcloudformationpulumi-plan-1486-2mlk</guid>
      <description>&lt;p&gt;Every AWS deployment needs a role with permissions to create/update/delete whatever's in the stack, and most people either reach for AdministratorAccess, because hand-writing the exact least-privilege actions for every resource type is tedious and nobody wants to maintain that by hand as the stack grows.&lt;/p&gt;

&lt;p&gt;CloudCostTree has a command for that: cloudcosttree iam reads a Terraform, CloudFormation, or Pulumi plan and generates the real IAM actions a deployment needs, per resource type, without ever calling AWS. It currently maps 1,486 AWS resource types.&lt;/p&gt;

&lt;p&gt;[screenshot]&lt;/p&gt;

&lt;p&gt;That screenshot is the human-readable text view. Run it with --output json -o policy.json and it produces a ready-to-attach IAM policy document instead of this breakdown.&lt;/p&gt;

&lt;p&gt;Where it's honest about its limits: every generated policy currently uses Resource: "*", the Action list is real least-privilege scoped to what each resource type needs, but the Resource element isn't narrowed to the exact ARNs a deployment declares yet. Per-resource ARN scoping is a planned capability, not implemented. Free on both tiers today.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>devops</category>
      <category>iam</category>
      <category>aws</category>
    </item>
    <item>
      <title>Something that's easy to miss: cost tooling and observability data can feed into the same loop, not two separate concerns</title>
      <dc:creator>cloudcosttree</dc:creator>
      <pubDate>Fri, 21 Aug 2026 12:41:05 +0000</pubDate>
      <link>https://dev.to/cloudcosttree/something-thats-easy-to-miss-cost-tooling-and-observability-data-can-feed-into-the-same-loop-not-25f3</link>
      <guid>https://dev.to/cloudcosttree/something-thats-easy-to-miss-cost-tooling-and-observability-data-can-feed-into-the-same-loop-not-25f3</guid>
      <description>&lt;p&gt;CloudCostTree reads your Terraform/CloudFormation/Pulumi and shows a cost tree from static config alone. That's useful before deploy, but static config only tells you what something was provisioned for.&lt;/p&gt;

&lt;p&gt;Once it's actually running, the same tool can pull real CloudWatch metrics, CPU utilization, live Spot pricing, through your own read-only AWS credentials, and re-run the same analysis against real telemetry instead of declared instance types. Same report, same command, just backed by observed data instead of assumptions.&lt;/p&gt;

&lt;p&gt;Point being, a resource can look perfectly sized on paper and still be sitting at 4% CPU in production. You only catch that gap by closing the loop between what you declared and what you're actually observing.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>terraform</category>
      <category>aws</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Something easy to miss when using cost tooling: it's most useful at two separate moments, not just once before a deploy</title>
      <dc:creator>cloudcosttree</dc:creator>
      <pubDate>Thu, 20 Aug 2026 12:53:25 +0000</pubDate>
      <link>https://dev.to/cloudcosttree/something-easy-to-miss-when-using-cost-tooling-its-most-useful-at-two-separate-moments-not-just-39nj</link>
      <guid>https://dev.to/cloudcosttree/something-easy-to-miss-when-using-cost-tooling-its-most-useful-at-two-separate-moments-not-just-39nj</guid>
      <description>&lt;p&gt;Before deploy: running the analysis against your IaC files up front shows you the full cost breakdown plus savings recommendations, and applies whatever's safe to apply without a human decision, before anything actually gets provisioned.&lt;/p&gt;

&lt;p&gt;After deploy: once it's live, re-running the same analysis with real CloudWatch usage data (via your own read-only AWS credentials) refines those recommendations against actual utilization instead of static config assumptions.&lt;/p&gt;

&lt;p&gt;The reason this matters for FinOps specifically: static config tells you what something was provisioned for, not what it's costing you in practice. A right-sizing call made purely from declared instance types will miss real idle capacity, and one made purely from live usage misses waste that never should've been provisioned in the first place. Catching both requires checking at both points in the lifecycle, not just once.&lt;/p&gt;

&lt;p&gt;(Built this into CloudCostTree, a CLI I've been working on, happy to go into specifics if useful.)&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>infrastructure</category>
      <category>tooling</category>
    </item>
    <item>
      <title>One thing CloudCostTree already handles: a local apply-time policy gate</title>
      <dc:creator>cloudcosttree</dc:creator>
      <pubDate>Wed, 19 Aug 2026 12:56:41 +0000</pubDate>
      <link>https://dev.to/cloudcosttree/one-thing-cloudcosttree-already-handles-a-local-apply-time-policy-gate-5cj7</link>
      <guid>https://dev.to/cloudcosttree/one-thing-cloudcosttree-already-handles-a-local-apply-time-policy-gate-5cj7</guid>
      <description>&lt;p&gt;Most teams I talked to don't have a CI/CD pipeline checking cost or governance policy before terraform apply, they just run it locally. That's what guard is for: cloudcosttree guard -- terraform apply.&lt;/p&gt;

&lt;p&gt;To be clear, this isn't a simulation, it's your real terraform apply. guard never runs one on its own, it only wraps the exact command you were already going to run, checks the plan against your policies, then applies that same saved plan, so there's no gap between what got checked and what got deployed.&lt;/p&gt;

&lt;p&gt;Default behavior is warn-only, it prints violations but still applies. --block opts into actually stopping the apply on a real violation. A false positive blocking a real deploy is worse than one showing up in a report, so blocking is never the default.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why most Terraform cost estimators guess at Auto Scaling Groups (and why that's a problem)</title>
      <dc:creator>cloudcosttree</dc:creator>
      <pubDate>Thu, 13 Aug 2026 14:49:34 +0000</pubDate>
      <link>https://dev.to/cloudcosttree/why-most-terraform-cost-estimators-guess-at-auto-scaling-groups-and-why-thats-a-problem-39pe</link>
      <guid>https://dev.to/cloudcosttree/why-most-terraform-cost-estimators-guess-at-auto-scaling-groups-and-why-thats-a-problem-39pe</guid>
      <description>&lt;p&gt;If your Auto Scaling Group uses &lt;code&gt;mixed_instances_policy&lt;/code&gt;, no cost tool reading your Terraform can tell you what instance type it's actually running. Not because the tool is bad. Because the information genuinely isn't in your config.&lt;/p&gt;

&lt;p&gt;You declare a launch template with a few weighted overrides, say m5.large, m5a.large, and m5n.large, and AWS decides at launch time which one actually gets used based on capacity and price. Your &lt;code&gt;.tf&lt;/code&gt; file never says which one wins. It can't, the answer depends on what AWS has available right now, not on anything you declared.&lt;/p&gt;

&lt;p&gt;So what do most cost estimators do with this? Usually one of two things: pick the first override and price the whole group as if every instance were that type, or silently show it as free because nothing matched a known shape. Both are wrong in a way that looks right. You get a clean dollar number with no indication that it's a guess.&lt;/p&gt;

&lt;p&gt;I built CloudCostTree, and when I hit this case the honest answer was to not show a number at all. A group using &lt;code&gt;mixed_instances_policy&lt;/code&gt; renders as unpriced by default, because there's no way to know which override actually got used without asking AWS directly. If you opt into &lt;code&gt;--with-usage&lt;/code&gt;, it calls AWS's own API, looks at what's actually running right now, and prices the group as its most common real instance type. Without that, it stays unpriced rather than confidently wrong.&lt;/p&gt;

&lt;p&gt;This isn't a one-off. It's the same call in a few other places: a Bedrock model pointing at a custom or fine-tuned version doesn't get resolved and priced, because that resolution isn't something a static config can answer. A multi-variant SageMaker endpoint gets priced against its first declared variant only, since there's no way to know real traffic split from the config alone, and that's disclosed, not hidden.&lt;/p&gt;

&lt;p&gt;The pattern I keep coming back to is: if a value can't be confirmed, it's better to say so than to fabricate something plausible. A wrong number that looks confident is worse than a visible gap, because the wrong number gets trusted and the gap gets investigated.&lt;/p&gt;

&lt;p&gt;If you're curious what this looks like end to end, I wrote CloudCostTree around this idea, a CLI that reads Terraform, CloudFormation, or Pulumi and prices your infrastructure before you apply it: &lt;a href="https://cloudcosttree.com" rel="noopener noreferrer"&gt;https://cloudcosttree.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to talk through edge cases if anyone's hit something similar.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>terraform</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
