<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[4 Crying Out Cloud]]></title><description><![CDATA[Cloud builds, lessons, opinions, and the occasional oops‑moment. Real solutions, honest reflections, and a bit of humour from a cloud architect who’s seen thing]]></description><link>https://4cryingout.cloud</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 02:09:52 GMT</lastBuildDate><atom:link href="https://4cryingout.cloud/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Your AWS Bill Isn’t Wrong - It’s Just Following Defaults]]></title><description><![CDATA[There’s a pattern I’ve seen often enough that it no longer feels like a coincidence.
A team builds something sensible. They separate environments properly - Development, Acceptance, Production.They fo]]></description><link>https://4cryingout.cloud/your-aws-bill-isnt-wrong-its-just-following-defaults</link><guid isPermaLink="true">https://4cryingout.cloud/your-aws-bill-isnt-wrong-its-just-following-defaults</guid><dc:creator><![CDATA[Brandon Haschick]]></dc:creator><pubDate>Tue, 07 Apr 2026 07:29:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6489896ca808488bfb0be516/d2856374-fd56-4784-96cc-170c49cffb4b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There’s a pattern I’ve seen often enough that it no longer feels like a coincidence.</p>
<p>A team builds something sensible. They separate environments properly - Development, Acceptance, Production.<br />They follow best practices: tagging, scaling, monitoring… the works.</p>
<p>And then, a few months later, someone opens the bill and asks:</p>
<p>“Why is this still costing so much when nothing’s really happening?”</p>
<p>That’s the interesting part.</p>
<p>Because in most cases, nothing <em>is</em> happening.</p>
<p>At least not in the way the system was originally designed.</p>
<p>The workloads are quiet. The deployments are stable.<br />The traffic is predictable.</p>
<p>But the infrastructure?</p>
<p>That’s still behaving like it’s launch day.</p>
<hr />
<p>This article looks at three places where AWS defaults quietly keep things running (and billing), even when your workload has moved on:</p>
<ul>
<li><p>Compute that doesn’t know when to rest</p>
</li>
<li><p>Logs that remember more than anyone reads</p>
</li>
<li><p>Storage that outlives its purpose</p>
</li>
</ul>
<p>And more importantly - what it looks like when you design with intent instead.</p>
<hr />
<h1><strong>1) Compute That Never Learned When to Stop</strong></h1>
<p>Let’s start with compute, because it’s the easiest to reason about (and the easiest to ignore).</p>
<h2><strong>The Shape of a Real Environment</strong></h2>
<p>In most modern AWS setups we have something like:</p>
<h3><strong>Development</strong></h3>
<ul>
<li><p>A few small EC2 instances</p>
</li>
<li><p>Created and destroyed somewhat unpredictably</p>
</li>
<li><p>Often left running longer than intended</p>
</li>
</ul>
<h3><strong>Acceptance</strong></h3>
<ul>
<li><p>Auto Scaling groups</p>
</li>
<li><p>Lower baseline than production</p>
</li>
<li><p>Scales up during testing, then… doesn’t always scale back down</p>
</li>
</ul>
<h3><strong>Production</strong></h3>
<ul>
<li><p>Auto Scaling done properly (usually)</p>
</li>
<li><p>But includes non-customer-facing components that don’t need 24/7 uptime</p>
</li>
</ul>
<p>So the problem isn’t just <em>“instances running too long.”</em></p>
<p>It’s:</p>
<p>Parts of the system behaving like they’re always needed, even when they’re not.</p>
<p><em>On a side note</em>: one could also do this with RDS, but for the purposes of this blog I will stick to EC2.</p>
<hr />
<h2><strong>Where Scheduling Still Matters (Even with Auto Scaling)</strong></h2>
<p>There’s a common assumption:</p>
<p>“We use Auto Scaling, so we’re already optimized.”</p>
<p>That’s only partially true.</p>
<p>Auto Scaling optimises for <strong>load</strong>.<br />It does not optimise (by default) for:</p>
<ul>
<li><p>Time-of-day usage patterns</p>
</li>
<li><p>Human working hours</p>
</li>
<li><p>Internal systems that nobody uses at night</p>
</li>
</ul>
<p>So you still end up with:</p>
<ul>
<li><p>Baseline capacity that never drops to zero</p>
</li>
<li><p>Dev instances quietly running overnight</p>
</li>
<li><p>Acceptance environments idling between test cycles</p>
</li>
</ul>
<hr />
<h2><strong>The Pattern: Scheduled Intent</strong></h2>
<p>The solution is not replacing Auto Scaling.</p>
<p>It’s complementing it.</p>
<ul>
<li><p>Dev EC2 → scheduled stop/start</p>
</li>
<li><p>Acceptance ASG → scheduled min capacity = 0 off-hours</p>
</li>
<li><p>Prod (select workloads) → scheduled scale-down or shutdown</p>
</li>
</ul>
<p>Using:</p>
<ul>
<li><p>EventBridge schedules</p>
</li>
<li><p>Lambda functions</p>
</li>
<li><p>Tag-driven targeting</p>
</li>
</ul>
<hr />
<h2><strong>Pricing Context (eu-west-1)</strong></h2>
<ul>
<li><p>c7g.large: ~$0.078/hour</p>
</li>
<li><p>c7g.xlarge: ~$0.155/hour</p>
</li>
</ul>
<p>Monthly saving per instance (~510 hours avoided):</p>
<ul>
<li><p>Dev-sized: ~$40/month</p>
</li>
<li><p>Prod-sized: ~$79/month</p>
</li>
</ul>
<hr />
<h2><strong>What This Looks Like</strong></h2>
<h3><strong>Small environment</strong></h3>
<ul>
<li><p>Dev: 3 instances</p>
</li>
<li><p>Acc: baseline 2</p>
</li>
<li><p>Prod: 1 schedulable internal workload</p>
</li>
</ul>
<p>Savings:</p>
<ul>
<li><p>Dev: $120</p>
</li>
<li><p>Acc: $80</p>
</li>
<li><p>Prod: $79</p>
</li>
</ul>
<p>→ <strong>~$280/month</strong></p>
<hr />
<h3><strong>Medium environment</strong></h3>
<ul>
<li><p>Dev: ~10 instances</p>
</li>
<li><p>Acc: baseline ~6</p>
</li>
<li><p>Prod: internal workloads</p>
</li>
</ul>
<p>→ <strong>~$1,100/month</strong></p>
<hr />
<h3><strong>Large environment</strong></h3>
<ul>
<li><p>Dev: dozens of instances</p>
</li>
<li><p>Acc: multiple ASGs</p>
</li>
<li><p>Prod: internal services at scale</p>
</li>
</ul>
<p>→ <strong>~\(3,500–\)4,000/month</strong></p>
<hr />
<h2><strong>The Subtle Realisation</strong></h2>
<p>Auto Scaling optimises for <strong>demand</strong>.<br />Scheduling optimises for the <strong>absence of demand</strong>.</p>
<p>You need both.</p>
<hr />
<h1><strong>2) CloudWatch Logs: The Cost of Remembering Everything</strong></h1>
<p>Logs are comforting.</p>
<p>They make us feel prepared, responsible, and mildly in control.</p>
<p>They also quietly accumulate into something nobody explicitly designed.</p>
<p>CloudWatch Logs defaults to <strong>never expire</strong>.</p>
<p>Which is great - right up until you realise you’re paying to remember things nobody reads anymore.</p>
<hr />
<h2><strong>The Pattern: Make Retention Explicit</strong></h2>
<p>Instead of relying on good intentions:</p>
<ul>
<li><p>Dev → 7 days</p>
</li>
<li><p>Acc → 30 days</p>
</li>
<li><p>Prod → 90 days</p>
</li>
</ul>
<p>And enforce it using:</p>
<ul>
<li><p>AWS Config custom rule</p>
</li>
<li><p>SSM auto-remediation (or Lambda function if you need custom logic)</p>
</li>
</ul>
<p>This turns retention into a system, not a habit.</p>
<hr />
<h2><strong>The Important Bit Most People Miss</strong></h2>
<p>CloudWatch Logs has <strong>two separate cost drivers</strong>:</p>
<ol>
<li><p><strong>Ingestion</strong> (writing logs)</p>
</li>
<li><p><strong>Storage</strong> (keeping them)</p>
</li>
</ol>
<p>Retention only affects <strong>storage</strong>.</p>
<p>Which means:</p>
<p>You don’t reduce logging cost by deleting logs.<br />You reduce <em>storage cost</em>.</p>
<p>That distinction matters more than it should.</p>
<hr />
<h3><strong>A Note on Compression (Because This Gets Confusing)</strong></h3>
<p>CloudWatch Logs stores data in a compressed format, but AWS does not publish a fixed compression ratio.</p>
<p>In their pricing examples, log data is often shown compressing to roughly <strong>15–20% of its original size</strong> (roughly 5:1 to 6:1).</p>
<p>Actual compression depends heavily on:</p>
<ul>
<li><p>log format (JSON vs text)</p>
</li>
<li><p>repetition</p>
</li>
<li><p>structure</p>
</li>
</ul>
<p>For the purposes of these examples, we’ll assume <strong>~5:1 compression</strong>.</p>
<p>Not because it’s exact — but because it’s a reasonable approximation for comparative analysis.</p>
<hr />
<h2><strong>Pricing Assumptions (eu-west-1)</strong></h2>
<ul>
<li><p>Ingestion: <strong>$0.57/GB</strong></p>
</li>
<li><p>Storage: <strong>$0.03/GB-month</strong></p>
</li>
<li><p>Free tier: 5 GB</p>
</li>
<li><p>Compression ratio of 5:1</p>
</li>
</ul>
<hr />
<h2><strong>Small Environment</strong></h2>
<h3><strong>Log volume</strong></h3>
<ul>
<li><p>Dev: 5 GB/day</p>
</li>
<li><p>Acc: 10 GB/day</p>
</li>
<li><p>Prod: 30 GB/day</p>
</li>
</ul>
<p>Total: <strong>45 GB/day → 1,350 GB/month</strong></p>
<hr />
<h3><strong>Ingestion cost (unchanged by retention)</strong></h3>
<p><code>(1,350 - 5) * USD 0.57 = USD 766.65/month</code></p>
<p>This is the baseline reality.</p>
<p>Retention won’t fix it.</p>
<hr />
<h3><strong>Storage with retention (7/30/90)</strong></h3>
<p>We compress and store:</p>
<ul>
<li><p>Dev: (5 * 7) ÷ 5 = 7 GB</p>
</li>
<li><p>Acc: (10 * 30) ÷ 5 = 60 GB</p>
</li>
<li><p>Prod: (30 * 90) ÷ 5 = 540 GB</p>
</li>
</ul>
<p>Total: <strong>607 GB</strong></p>
<p><code>(607 - 5) * USD 0.03 = USD 18.06/month</code></p>
<hr />
<h3><strong>Storage without retention (~1 year)</strong></h3>
<p>Total stored:</p>
<ul>
<li>3,285 GB</li>
</ul>
<p><code>(3,285 - 5) * USD 0.03 = USD 98.40/month</code></p>
<hr />
<h3><strong>Savings</strong></h3>
<p><code>USD 98.40 - USD 18.06 = USD 80.34/month</code></p>
<hr />
<h3><strong>Cost of enforcing it</strong></h3>
<p>Assume ~40 log groups/month:</p>
<ul>
<li><p>Config: $0.12</p>
</li>
<li><p>Rule eval: $0.04</p>
</li>
</ul>
<p>→ <strong>$0.16/month</strong></p>
<hr />
<h3><strong>Net</strong></h3>
<p>→ <strong>~$80/month saved</strong></p>
<hr />
<h2><strong>Medium Environment</strong></h2>
<ul>
<li>225 GB/day → 6,750 GB/month</li>
</ul>
<p>Storage:</p>
<ul>
<li><p>With retention: $90.90</p>
</li>
<li><p>Without: $492.60</p>
</li>
</ul>
<p>Savings:</p>
<p>→ <strong>~$401/month</strong></p>
<p>Governance cost:</p>
<p>→ <strong>~$0.80</strong></p>
<p>Net:</p>
<p>→ <strong>~$400/month</strong></p>
<hr />
<h2><strong>Large Environment</strong></h2>
<ul>
<li>900 GB/day → 27,000 GB/month</li>
</ul>
<p>Storage:</p>
<ul>
<li><p>With retention: $364.05</p>
</li>
<li><p>Without: $1,970.85</p>
</li>
</ul>
<p>Savings:</p>
<p>→ <strong>~$1,606/month</strong></p>
<p>Governance:</p>
<p>→ <strong>~$4/month</strong></p>
<p>Net:</p>
<p>→ <strong>~$1,602/month</strong></p>
<hr />
<h2><strong>What the Numbers Are Actually Saying</strong></h2>
<p>Two things become clear:</p>
<ol>
<li><p>**Retention is still worth it<br />**Even though it doesn’t touch ingestion</p>
</li>
<li><p><strong>Ingestion is the real problem at scale</strong></p>
</li>
</ol>
<p>Which leads to the natural next step:</p>
<hr />
<h2><strong>The Better Pattern</strong></h2>
<p>Split responsibilities:</p>
<ul>
<li><p>CloudWatch → recent, searchable logs</p>
</li>
<li><p>S3 → long-term storage</p>
</li>
</ul>
<p>This gives you:</p>
<ul>
<li><p>Fast debugging</p>
</li>
<li><p>Cheap retention</p>
</li>
</ul>
<p>Without paying CloudWatch rates forever.</p>
<hr />
<h1><strong>3) Storage That Doesn’t Leave</strong></h1>
<p>Storage is different.</p>
<p>It doesn’t spike.<br />It doesn’t scale dynamically.<br />It doesn’t politely disappear when the workload that created it has moved on.</p>
<p>It just stays.</p>
<p>That’s part of why storage waste is so persistent. Compute waste tends to at least look busy. Storage waste just sits there quietly, billing with excellent emotional discipline.</p>
<p>There are two recurring offenders here:</p>
<ul>
<li><p><strong>Unattached EBS volumes</strong></p>
</li>
<li><p><strong>Snapshots with no lifecycle</strong></p>
</li>
</ul>
<p>They look different on the bill, but the root cause is usually the same: nobody came back to decide what should happen after the original workload stopped mattering.</p>
<hr />
<h2><strong>3a) Unattached EBS Volumes: Paying for “Maybe We Still Need It”</strong></h2>
<p>Unattached EBS volumes are one of the simplest forms of waste in AWS.</p>
<p>They usually come from very ordinary events:</p>
<ul>
<li><p>an EC2 instance was terminated, but the volume was retained</p>
</li>
<li><p>someone detached a volume during troubleshooting</p>
</li>
<li><p>a migration got halfway through and then became “tomorrow’s problem”</p>
</li>
<li><p>a test environment was cleaned up, except for the storage, which apparently was granted diplomatic immunity</p>
</li>
</ul>
<p>The volume state in EBS for these is available, which is AWS’s way of saying: “This is attached to nothing, but still very much attached to your bill.”</p>
<h3><strong>The pattern</strong></h3>
<p>The cleanup pattern here is straightforward:</p>
<ol>
<li><p>Run a daily Lambda</p>
</li>
<li><p>Find volumes in state available</p>
</li>
<li><p>Tag newly found volumes with:</p>
<ul>
<li><p>CleanupCandidate=true</p>
</li>
<li><p>FirstSeenAvailable=</p>
</li>
<li><p>DeleteAfter=&lt;date+7d&gt;</p>
</li>
</ul>
</li>
<li><p>On subsequent runs, if the volume is still available and not exempt, delete it</p>
</li>
</ol>
<p>That 7-day grace period matters. It keeps the automation practical rather than reckless. You want to clean up forgotten storage, not turn someone’s live troubleshooting session into a memorable learning experience.</p>
<p>The underlying EBS pricing model is simple: you pay for provisioned storage until you release it. AWS’s public EBS pricing examples use <strong>$0.08/GB-month</strong> for gp3 volume storage in a region that charges that rate.</p>
<h3><strong>The cost model</strong></h3>
<p>For the purposes of calculation, I’ll use:</p>
<p><code>Monthly unattached volume cost = Provisioned GB * USD 0.08</code></p>
<p>That gives us a clean, conservative baseline using AWS’s own public gp3 example rate.</p>
<hr />
<h3><strong>Small environment</strong></h3>
<p>A small estate might not look dramatic at all:</p>
<ul>
<li><p><strong>Development:</strong> 1.0 TB of detached test volumes spread across a few teams</p>
</li>
<li><p><strong>Acceptance:</strong> 0.5 TB left behind from refreshes and release validation</p>
</li>
<li><p><strong>Production:</strong> 0.5 TB of retained-but-unused storage from old hosts or cutovers</p>
</li>
</ul>
<p>That’s <strong>2.0 TB total</strong>, or <strong>2,048 GB</strong>.</p>
<p>Calculation:</p>
<p><code>2,048 GB * USD 0.08/GB-month = USD 163.84/month</code></p>
<p>So even in a fairly small environment, you’re at:</p>
<p><strong>→ $163.84/month</strong></p>
<p>Not catastrophic. Just pointless.</p>
<p>That’s usually the theme with unattached volumes: not one bad decision, but a pile of harmless-looking ones.</p>
<hr />
<h3><strong>Medium environment</strong></h3>
<p>Now move to a more typical multi-team setup:</p>
<ul>
<li><p><strong>Development:</strong> 4 TB of ad hoc test storage and abandoned instance volumes</p>
</li>
<li><p><strong>Acceptance:</strong> 3 TB from repeated environment refreshes and short-lived testing cycles</p>
</li>
<li><p><strong>Production:</strong> 3 TB from older migrations, retained rollbacks, and “leave it there for now” volumes</p>
</li>
</ul>
<p>That’s <strong>10 TB total</strong>, or <strong>10,240 GB</strong>.</p>
<p>Calculation:</p>
<p><code>10,240 GB * USD 0.08/GB-month = USD 819.20/month</code></p>
<p>So the monthly waste becomes:</p>
<p><strong>→ $819.20/month</strong></p>
<p>This is usually where the conversation changes.</p>
<p>At small scale, unattached storage is an annoyance.<br />At medium scale, it becomes a recurring bill for infrastructure that is literally helping nobody.</p>
<hr />
<h3><strong>Large environment</strong></h3>
<p>At larger scale, unattached storage becomes less of an exception and more of a background condition:</p>
<ul>
<li><p><strong>Development:</strong> 20 TB across many teams, ephemeral workloads, and inconsistent clean-up</p>
</li>
<li><p><strong>Acceptance:</strong> 15 TB across multiple shared services and test refreshes</p>
</li>
<li><p><strong>Production:</strong> 15 TB of retained volumes from migrations, replacements, and rollback caution</p>
</li>
</ul>
<p>That’s <strong>50 TB total</strong>, or <strong>51,200 GB</strong>.</p>
<p>Calculation:</p>
<p><code>51,200 GB * USD 0.08/GB-month = USD 4,096.00/month</code></p>
<p>So now the cost is:</p>
<p><strong>→ $4,096/month</strong></p>
<p>At that point, unattached EBS is no longer a housekeeping issue.<br />It’s a line item.</p>
<p>And the unpleasant thing is that the fix is still not complicated. It’s the same daily scan, just applied consistently.</p>
<hr />
<h2><strong>What this is really saying</strong></h2>
<p>The important detail with unattached volumes is that the cost is wonderfully boring.</p>
<p>It doesn’t depend on CPU.<br />It doesn’t depend on traffic.<br />It doesn’t depend on whether the application is doing anything useful.</p>
<p>You are simply paying for storage that exists.</p>
<p>That makes it one of the cleanest cost-optimisation targets you’ll find in AWS, because there’s very little ambiguity about whether the spend is justified. If the volume is unattached for a week and no one objected, the answer is probably no.</p>
<hr />
<h2><strong>3b) Snapshots: The Slow Archive Nobody Meant to Build</strong></h2>
<p>Snapshots start with good intentions.</p>
<p>They are created for safety.<br />For rollback.<br />For recovery.<br />For “just in case.”</p>
<p>All reasonable things.</p>
<p>The problem is that snapshots are usually very easy to create and much less often given a proper lifecycle afterward. So they accumulate. Quietly. Incrementally. With a sort of patient confidence that deserves respect, if not continued funding.</p>
<h3><strong>Two details matter here</strong></h3>
<p>First, EBS snapshots in the <strong>standard tier are incremental</strong>. AWS stores only the blocks that have changed, not a full copy every time. That means snapshot cost should be based on <strong>actual billed snapshot data</strong>, not the raw size of the source volumes.</p>
<p>Second, if you don’t set lifecycle intentionally, you tend to keep:</p>
<ul>
<li><p>too many daily restore points</p>
</li>
<li><p>too many monthly “for safety” snapshots</p>
</li>
<li><p>too much old data in the standard tier</p>
</li>
</ul>
<p>And that is where Data Lifecycle Manager helps.</p>
<hr />
<h2><strong>The pattern: Amazon Data Lifecycle Manager (DLM)</strong></h2>
<p>Amazon Data Lifecycle Manager lets you automate the creation, retention, and deletion of EBS snapshots based on tags. AWS documents DLM as a complete backup solution for EC2 instances and EBS volumes <strong>at no additional cost</strong>.</p>
<p>A practical configuration looks like this:</p>
<h3><strong>Tag strategy</strong></h3>
<p>Apply tags such as:</p>
<ul>
<li><p>SnapshotPolicy=dev</p>
</li>
<li><p>SnapshotPolicy=acc</p>
</li>
<li><p>SnapshotPolicy=prod</p>
</li>
</ul>
<p>This is important because it lets policy follow the resource rather than relying on manual selection, which tends to age poorly.</p>
<h3><strong>Retention strategy</strong></h3>
<p>Use different schedules by environment:</p>
<ul>
<li><p><strong>Development:</strong> daily snapshots, retain 7–14 days</p>
</li>
<li><p><strong>Acceptance:</strong> daily snapshots, retain 30 days</p>
</li>
<li><p><strong>Production:</strong> daily snapshots, retain 90 days, plus monthly snapshots retained longer</p>
</li>
</ul>
<p>DLM supports custom policies for EBS snapshots and can automate retention and deletion.</p>
<h3><strong>Archive strategy</strong></h3>
<p>For older snapshots that are rarely restored, use <strong>EBS Snapshot Archive</strong>.</p>
<p>AWS documents:</p>
<ul>
<li><p><strong>Standard snapshot storage:</strong> $0.05/GB-month</p>
</li>
<li><p><strong>Archive storage:</strong> $0.0125/GB-month</p>
</li>
<li><p><strong>Archive retrieval:</strong> $0.03/GB</p>
</li>
<li><p><strong>Minimum archive period:</strong> 90 days</p>
</li>
</ul>
<p>So the simplest cost model becomes:</p>
<p><code>Current monthly snapshot cost = Standard-tier GB * USD 0.05</code></p>
<p>If you move older snapshots to archive and keep only a smaller working set in standard:</p>
<p><code>New monthly cost = (Standard-tier GB kept hot * USD 0.05) + (Archived GB * USD 0.0125)</code></p>
<p>For the examples below, I’ll use a pragmatic split:</p>
<ul>
<li><p><strong>25% kept in standard tier</strong></p>
</li>
<li><p><strong>75% moved to archive</strong></p>
</li>
</ul>
<p>That is not universal, but it is easy to explain and fairly realistic for environments where recent snapshots matter more than old ones.</p>
<hr />
<h3><strong>Small environment</strong></h3>
<p>Assume the actual billed snapshot footprint across the three accounts is:</p>
<ul>
<li><p><strong>Development:</strong> 0.5 TB</p>
</li>
<li><p><strong>Acceptance:</strong> 1.0 TB</p>
</li>
<li><p><strong>Production:</strong> 2.5 TB</p>
</li>
</ul>
<p>That’s <strong>4 TB total</strong>, or <strong>4,096 GB</strong>.</p>
<h4><strong>Without lifecycle</strong></h4>
<p>Everything stays in standard tier:</p>
<p><code>4,096 GB * USD 0.05 = USD 204.80/month</code></p>
<h4><strong>With DLM + archive</strong></h4>
<p>Keep 25% hot:</p>
<p><code>1,024 GB * USD 0.05 = USD 51.20</code></p>
<p>Archive 75%:</p>
<p><code>3,072 GB * USD 0.0125 = USD 38.40</code></p>
<p>Total:</p>
<p><code>USD 51.20 + USD 38.40 = USD 89.60/month</code></p>
<p>Savings:</p>
<p><code>USD 204.80 - USD 89.60 = USD 115.20/month</code></p>
<p>So even in a small environment:</p>
<p><strong>→ $115.20/month saved</strong></p>
<p>Again, not dramatic. But also not nothing. And unlike a lot of “optimisation” work, this doesn’t require a philosophical debate about whether the resource is really needed.</p>
<hr />
<h3><strong>Medium environment</strong></h3>
<p>Now assume a more typical billed snapshot footprint:</p>
<ul>
<li><p><strong>Development:</strong> 2 TB</p>
</li>
<li><p><strong>Acceptance:</strong> 6 TB</p>
</li>
<li><p><strong>Production:</strong> 12 TB</p>
</li>
</ul>
<p>That’s <strong>20 TB total</strong>, or <strong>20,480 GB</strong>.</p>
<h4><strong>Without lifecycle</strong></h4>
<p><code>20,480 GB * USD 0.05 = USD 1,024.00/month</code></p>
<h4><strong>With DLM + archive</strong></h4>
<p>Keep 25% in standard:</p>
<p><code>5,120 GB * USD 0.05 = USD 256.00</code></p>
<p>Archive 75%:</p>
<p><code>15,360 GB * USD 0.0125 = USD 192.00</code></p>
<p>Total:</p>
<p><code>USD 256.00 + USD 192.00 = USD 448.00/month</code></p>
<p>Savings:</p>
<p><code>USD 1,024.00 - USD 448.00 = USD 576.00/month</code></p>
<p>So the medium environment saves:</p>
<p><strong>→ $576/month</strong></p>
<p>This is where snapshot lifecycle starts to become one of those unusually polite cost controls: low drama, predictable outcome, very little downside if you configure it sensibly.</p>
<hr />
<h3><strong>Large environment</strong></h3>
<p>At larger scale, snapshot history becomes a storage system in its own right.</p>
<p>Assume:</p>
<ul>
<li><p><strong>Development:</strong> 10 TB</p>
</li>
<li><p><strong>Acceptance:</strong> 30 TB</p>
</li>
<li><p><strong>Production:</strong> 60 TB</p>
</li>
</ul>
<p>That’s <strong>100 TB total</strong>, or <strong>102,400 GB</strong>.</p>
<h4><strong>Without lifecycle</strong></h4>
<p><code>102,400 GB * USD 0.05 = USD 5,120.00/month</code></p>
<h4><strong>With DLM + archive</strong></h4>
<p>Keep 25% hot:</p>
<p><code>25,600 GB * USD 0.05 = USD 1,280.00</code></p>
<p>Archive 75%:</p>
<p><code>76,800 GB * USD 0.0125 = USD 960.00</code></p>
<p>Total:</p>
<p><code>USD 1,280.00 + USD 960.00 = USD 2,240.00/month</code></p>
<p>Savings:</p>
<p><code>USD 5,120.00 - USD 2,240.00 = USD 2,880.00/month</code></p>
<p>So the large environment saves:</p>
<p><strong>→ $2,880/month</strong></p>
<p>And the key point is that this is not the result of aggressive deletion. It is simply the result of matching storage tier to restore likelihood.</p>
<p>That is usually the whole game in cloud cost work: not removing value, just stopping the most expensive version of value from being the default.</p>
<hr />
<h2><strong>What the storage numbers are really saying</strong></h2>
<p>There are two different stories here.</p>
<h3><strong>Unattached volumes</strong></h3>
<p>This is straightforward waste.<br />If a volume is detached, untouched, and no one claims it during a grace period, there is very little strategic ambiguity.</p>
<h3><strong>Snapshot lifecycle</strong></h3>
<p>This is not usually waste in the same way. It is more often <strong>good intent with poor follow-through</strong>.</p>
<p>The snapshots were created for valid reasons.<br />They just weren’t moved, expired, or tiered afterward.</p>
<p>That distinction matters. One is clean-up. The other is lifecycle design.</p>
<hr />
<h2><strong>Storage section summary</strong></h2>
<table style="min-width:556px"><colgroup><col style="min-width:25px"></col><col style="width:182px"></col><col style="width:191px"></col><col style="width:158px"></col></colgroup><tbody><tr><td><p><strong>Size</strong></p></td><td><p><strong>Unattached EBS savings</strong></p></td><td><p><strong>Snapshot lifecycle savings</strong></p></td><td><p><strong>Total storage savings</strong></p></td></tr><tr><td><p>Small</p></td><td><p><code>USD 163.84</code></p></td><td><p><code>USD 115.20</code></p></td><td><p><code>USD 279.04/month</code></p></td></tr><tr><td><p>Medium</p></td><td><p><code>USD 819.20</code></p></td><td><p><code>USD 576.00</code></p></td><td><p><code>USD 1,395.20/month</code></p></td></tr><tr><td><p>Large</p></td><td><p><code>USD 4,096.00</code></p></td><td><p><code>USD 2,880.00</code></p></td><td><p><code>USD 6,976.00/month</code></p></td></tr></tbody></table>

<p>These are not exotic savings. They are the result of asking two fairly plain questions:</p>
<ul>
<li><p>Should this volume still exist?</p>
</li>
<li><p>Should this snapshot still live in the expensive tier?</p>
</li>
</ul>
<p>Those questions are not glamorous, but they do tend to produce results.</p>
<hr />
<h1><strong>Final Thought</strong></h1>
<p>Nothing here is particularly clever.</p>
<p>There’s no trick.</p>
<p>Just intent.</p>
<ul>
<li><p>Compute learns when it’s not needed</p>
</li>
<li><p>Logs learn when to expire</p>
</li>
<li><p>Storage learns when to leave</p>
</li>
</ul>
<p>Defaults don’t do that.</p>
<p>They can’t.</p>
<p>Because defaults are designed for safety, not specificity.</p>
<p>And the longer you rely on them, the more your infrastructure behaves like it’s still day one.</p>
<p>Even when your workload clearly isn’t.</p>
<hr />
<p>If you want to take this further, the next step isn’t more automation.</p>
<p>It’s making these behaviours your <strong>platform defaults</strong> so that nobody has to remember them in the first place.</p>
<p>Which, in the end, is the only kind of optimisation that really scales.</p>
]]></content:encoded></item><item><title><![CDATA[Irritation‑Driven Development: My Favourite Engineering Pattern]]></title><description><![CDATA[There’s a specific kind of joy that hits when you build something tiny that makes your day easier. Not a platform. Not a framework. Not a “next big thing”. Just a small, sharp tool that removes one annoying piece of friction from your workflow.
It’s ...]]></description><link>https://4cryingout.cloud/irritation-driven-development-my-favourite-engineering-pattern</link><guid isPermaLink="true">https://4cryingout.cloud/irritation-driven-development-my-favourite-engineering-pattern</guid><category><![CDATA[engineering-philosophy]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[tooling]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Brandon Haschick]]></dc:creator><pubDate>Mon, 19 Jan 2026 13:00:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1768461467036/e4be7068-c234-4c64-bba9-9664d50c3588.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There’s a specific kind of joy that hits when you build something tiny that makes your day easier. Not a platform. Not a framework. Not a “next big thing”. Just a small, sharp tool that removes one annoying piece of friction from your workflow.</p>
<p>It’s the builder’s high - and honestly, it’s one of the best parts of being an engineer.</p>
<h2 id="heading-it-always-starts-with-an-annoyance"><strong>It Always Starts With an Annoyance</strong></h2>
<p>Every small tool I’ve ever built started the same way:</p>
<ul>
<li><p>“Why am I doing this manually again?”</p>
</li>
<li><p>“This is stupid!”</p>
</li>
<li><p>“Surely there’s a better way!?”</p>
</li>
</ul>
<p>That’s the spark. Not inspiration. Not a grand vision. Just irritation - and irritation is underrated. If something annoys you repeatedly, it’s probably annoying someone else, too.</p>
<h2 id="heading-small-tools-matter-more-than-we-admit"><strong>Small Tools Matter More Than We Admit</strong></h2>
<p>We love to talk about big systems in tech. Architectures. Platforms. Multi‑region deployments. All the impressive stuff.</p>
<p>But the things that actually improve your day? They’re tiny.</p>
<p>A script that cleans up a folder on a schedule. A wrapper that formats logs properly. A shortcut that saves you 10 seconds but feels like magic.</p>
<p>Small tools matter because they reduce friction, create leverage, and compound over time. One improvement leads to another. Your workflow gets smoother. Your brain gets quieter. Your work gets better.</p>
<p>And honestly? They’re fun. There’s something deeply satisfying about building something simple and elegant that just works.</p>
<h2 id="heading-that-moment-when-it-works"><strong>That Moment When It Works</strong></h2>
<p>You run the tool. It does exactly what you wanted. And you get that quiet internal “yes”.</p>
<p>It’s not dramatic. It’s not something you’d brag about. But it’s real - that moment where the world becomes slightly more orderly because of something you made.</p>
<p>That’s the builder’s high.</p>
<h2 id="heading-small-tools-become-ecosystems-without-trying"><strong>Small Tools Become Ecosystems (Without Trying)</strong></h2>
<p>This is the part I love.</p>
<p>You build one tool. Then another. Then a third. Patterns start to form:</p>
<ul>
<li><p>consistent naming</p>
</li>
<li><p>reusable structures</p>
</li>
<li><p>shared conventions</p>
</li>
<li><p>a sense of identity</p>
</li>
</ul>
<p>Suddenly you’re not just building tools - you’re building a toolkit. A personal ecosystem. A set of tiny superpowers that make everything else easier.</p>
<p>Not because you planned it. But because small tools naturally gravitate toward each other.</p>
<h2 id="heading-the-freedom-of-building-for-yourself"><strong>The Freedom of Building for Yourself</strong></h2>
<p>Small tools are the purest form of engineering because you build them for yourself first.</p>
<p>No stakeholders. No deadlines. No Jira tickets. No approval process.</p>
<p>Just curiosity, craftsmanship, and the desire to make your own life easier. It’s engineering without politics. Without ceremony. Without overhead.</p>
<p>Just you and the problem.</p>
<h2 id="heading-and-then-unexpectedly-they-help-others"><strong>And Then, Unexpectedly, They Help Others</strong></h2>
<p>Here’s the funny thing: if a tool solves a problem for you, it almost always solves it for someone else, too.</p>
<p>That’s how the best open‑source tools start. Not with a business plan. Not with a roadmap. But with someone scratching their own itch.</p>
<p>Sharing small tools creates a connection. It helps others remove friction. It spreads the builder’s high.</p>
<h2 id="heading-why-im-leaning-into-small-tools-right-now"><strong>Why I’m Leaning Into Small Tools Right Now</strong></h2>
<p>Lately, I’ve been building a lot of small, clean, reusable tools - the kind that make AWS workflows smoother and developer experience better.</p>
<p>Not because I’m chasing a big launch. Not because I’m trying to build a platform. But because these small tools feel good to build. They make my work better. They make me a better engineer.</p>
<p>And over time, they’re forming a consistent ecosystem. And what’s more, I’m enjoying the process. The clarity. The craft. The builder’s high.</p>
<h2 id="heading-start-small-start-now"><strong>Start Small. Start Now.</strong></h2>
<p>If you’re feeling stuck or uninspired, don’t wait for a big idea.</p>
<p>Fix an annoyance. Automate a step. Build something tiny that makes your day better.</p>
<p>You’ll be surprised how far those small wins can take you.</p>
<p>And even if nothing big comes from it, you’ll still get that moment - that quiet, satisfying “yes”.</p>
<p>And that’s worth chasing.</p>
]]></content:encoded></item><item><title><![CDATA[How Many Spheres Can You Hold]]></title><description><![CDATA[Working in tech can feel like trying to drink from a firehose while juggling flaming torches. New features, new services, new frameworks - and that’s just Monday. Some days it feels like keeping up with the tools you already know is a full‑time job, ...]]></description><link>https://4cryingout.cloud/how-many-spheres-can-you-hold</link><guid isPermaLink="true">https://4cryingout.cloud/how-many-spheres-can-you-hold</guid><category><![CDATA[mentalhealth]]></category><category><![CDATA[work life balance]]></category><dc:creator><![CDATA[Brandon Haschick]]></dc:creator><pubDate>Sun, 28 Dec 2025 11:03:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766919552226/c5eb5f38-862b-441f-a1be-25bd47c7d270.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Working in tech can feel like trying to drink from a firehose while juggling flaming torches. New features, new services, new frameworks - and that’s just Monday. Some days it feels like keeping up with the tools you <em>already</em> know is a full‑time job, never mind learning the shiny new ones.</p>
<p>And that’s only the work part. Add friends, family, hobbies, health, rest, and the general chaos of being a functioning adult, and suddenly you’re carrying far more than two hands were ever designed for.</p>
<p>Over the last year, I’ve been trying to understand my limits - not in a defeatist way, but in a “what actually matters?” way. I’ve learned that I’m excellent at pushing myself, and equally amazing at exhausting myself. So I needed a way to make sense of everything I was holding.</p>
<p>That’s when the <strong>spheres analogy</strong> clicked for me. It’s simple, visual, and brutally honest.</p>
<h1 id="heading-the-spheres-analogy"><strong>The Spheres Analogy</strong></h1>
<p>Imagine every part of your life is a sphere you’re trying to hold and balance in your hands. Work. Health. Relationships. Learning. Hobbies. Admin. All of it.</p>
<p>But here’s the critical part:</p>
<p><strong>Not all spheres are made of the same material.</strong></p>
<p>Some are fragile. Some are sturdy - some bounce. And the material matters more than the number of spheres you’re holding.</p>
<p>Let’s break them down. This breakdown is different for everyone, but here are mine:</p>
<h2 id="heading-glass-spheres-the-irreplaceables"><strong>Glass Spheres - The Irreplaceables</strong></h2>
<p>These are the parts of your life that shatter if dropped.</p>
<p>They don’t bounce. They don’t dent. They don’t “wait until next quarter.”</p>
<ul>
<li><p>Your health</p>
</li>
<li><p>Your closest relationships</p>
</li>
<li><p>Your mental well‑being</p>
</li>
<li><p>Your core values</p>
</li>
</ul>
<p>If a glass sphere hits the floor, it doesn’t come back in the same form. These are the things you protect first, even when everything else is on fire.</p>
<h2 id="heading-ceramic-spheres-the-important-but-survivable"><strong>Ceramic Spheres - The Important, But Survivable</strong></h2>
<p>Ceramic spheres matter. They’re meaningful. They’re part of the life you want to build. But if you drop one, it doesn’t explode - it chips. It cracks. It becomes harder to pick up later, but not impossible.</p>
<ul>
<li><p>Career development</p>
</li>
<li><p>Long‑term goals</p>
</li>
<li><p>Personal growth</p>
</li>
<li><p>Learning that enriches your future</p>
</li>
</ul>
<p>Ceramic spheres require care, but they don’t demand perfection.</p>
<h2 id="heading-rubber-spheres-the-bouncebacks"><strong>Rubber Spheres - The Bounce‑Backs</strong></h2>
<p>Rubber spheres are the things you love, but that won’t collapse your life if you put them down for a while.</p>
<ul>
<li><p>Hobbies</p>
</li>
<li><p>Optional learning</p>
</li>
<li><p>Side projects</p>
</li>
<li><p>Creative experiments</p>
</li>
</ul>
<p>They bounce. They wait. They return when you’re ready.</p>
<h1 id="heading-the-real-magic-spheres-within-spheres"><strong>The Real Magic: Spheres Within Spheres</strong></h1>
<p>Here’s where the analogy becomes genuinely helpful.</p>
<p><strong>Every “big” sphere contains smaller spheres inside it - and those inner spheres can be made of different materials.</strong></p>
<p>Let’s take my “work” sphere, for example. I consider it to be ceramic overall - important, meaningful, but not life‑ending if I need to slow down.</p>
<p>But inside that sphere, I have:</p>
<ul>
<li><p>A <strong>glass</strong> sphere: my relationship with my client</p>
</li>
<li><p>A <strong>ceramic</strong> sphere: learning Dutch to support more clients</p>
</li>
<li><p>A <strong>rubber</strong> sphere: exploring Kubernetes because it’s interesting</p>
</li>
</ul>
<p>This matters because <strong>the material of the inner sphere determines how I spend my time and energy</strong>, not the material of the outer one.</p>
<h3 id="heading-why-this-matters"><strong>Why this matters</strong></h3>
<p>If my client relationship is a glass sphere inside the ceramic work sphere, then:</p>
<ul>
<li><p>I protect that relationship</p>
</li>
<li><p>I prioritise communication, delivery, and trust</p>
</li>
<li><p>I don’t let that one drop</p>
</li>
</ul>
<p>But learning Dutch - also inside the work sphere - might be ceramic:</p>
<ul>
<li><p>Important</p>
</li>
<li><p>Valuable</p>
</li>
<li><p>But not catastrophic if delayed</p>
</li>
</ul>
<p>So if life gets busy, I can safely extend my Dutch‑learning timeline without guilt, because I’m not dropping a glass sphere - I’m adjusting a ceramic one.</p>
<p>This is the nuance most productivity frameworks miss.</p>
<p>It’s not about “work vs life.”</p>
<p>It’s about <strong>what within work</strong> (or within life) actually matters.</p>
<h1 id="heading-my-spheres-for-2026"><strong>My Spheres for 2026</strong></h1>
<p>A bit of context: I moved to the Netherlands in 2022 and am working toward naturalisation. I love my job, I love my clients, and I’m surrounded by wonderful people (including two cats who believe they are the centre of the universe). I also have… let’s call it an enthusiastic number of hobbies.</p>
<p>So here’s how I’m structuring my spheres for the year.</p>
<h2 id="heading-glass-spheres-nonnegotiables"><strong>Glass Spheres - Non‑Negotiables</strong></h2>
<ul>
<li><p><strong>Health</strong> - sleep, rest, exercise, mental well‑being</p>
</li>
<li><p><strong>Relationships</strong> - partner, friends, family</p>
</li>
</ul>
<p>If these fall, everything else becomes irrelevant.</p>
<h2 id="heading-ceramic-spheres-important-but-flexible"><strong>Ceramic Spheres - Important, But Flexible</strong></h2>
<ul>
<li><p><strong>Career</strong> - I genuinely enjoy what I do and who I work with</p>
</li>
<li><p><strong>Naturalisation</strong> - learning Dutch, preparing for exams</p>
</li>
</ul>
<p>These spheres matter deeply, but they can be paced.</p>
<h2 id="heading-rubber-sphere-joyful-extras"><strong>Rubber Sphere - Joyful Extras</strong></h2>
<ul>
<li><strong>Hobbies</strong> - gaming, pool, Warhammer, model building</li>
</ul>
<p>They enrich my life, but they’ll bounce back whenever I’m ready.</p>
<h1 id="heading-zooming-in-the-work-sphere-example"><strong>Zooming In: The Work Sphere Example</strong></h1>
<p>Revisiting my ceramic work sphere example, here is how I would personally break it down:</p>
<h3 id="heading-glass-sphere-my-client-relationship"><strong>Glass sphere: my client relationship</strong></h3>
<p>I genuinely enjoy working with my current client. They’re engaged, collaborative, and the work is fulfilling. This is something I want to protect.</p>
<h3 id="heading-ceramic-sphere-learning-dutch"><strong>Ceramic sphere: learning Dutch</strong></h3>
<p>Learning Dutch helps me support more clients and aligns with my naturalisation goals. It’s important, but there’s no hard deadline. If I need to slow down, that’s okay.</p>
<h3 id="heading-rubber-sphere-kubernetes-certifications"><strong>Rubber sphere: Kubernetes certifications</strong></h3>
<p>I find Kubernetes fascinating, but I don’t actively use it right now. Preparing for certifications stresses me out, and stress impacts my glass spheres (health and relationships). So Kubernetes goes into the “later” pile.</p>
<p>This structure lets me make decisions without guilt or chaos.</p>
<p>It gives me <em>permission</em> to adjust timelines without feeling like I’m failing.</p>
<h1 id="heading-what-this-looks-like-in-practice"><strong>What This Looks Like in Practice</strong></h1>
<p>At work, I’m fortunate to be in an environment that values learning and knowledge‑sharing. That means I can align my ceramic spheres: using my study budget to learn Dutch helps both my personal goal <em>and</em> my ability to support Dutch‑speaking clients.</p>
<p>I’ll also renew my AWS certifications - partly because they’re expiring, partly because they help me stay sharp for the work I already do.</p>
<p>But I’m not adding extra pressure by stacking more ceramic spheres than I can realistically hold. That’s how burnout happens.</p>
<p>This plan gives me clarity. It lets me focus on the AWSome work I’m doing with my current client, pursue personal goals, and stay healthy without overextending myself.</p>
<h1 id="heading-your-turn"><strong>Your Turn</strong></h1>
<p>Here’s my challenge to you:</p>
<p><strong>Map out your spheres.</strong></p>
<p>Not just the big ones - the inner ones too.</p>
<ul>
<li><p>What are you holding?</p>
</li>
<li><p>What are they made of?</p>
</li>
<li><p>Which ones must stay in your hands?</p>
</li>
<li><p>Which ones can you safely put down?</p>
</li>
<li><p>Which ones are only glass because you <em>assumed</em> they were?</p>
</li>
</ul>
<p>You don’t need to juggle everything.</p>
<p>You just need to know what’s glass, what’s ceramic, and what’s rubber - both on the outside and on the inside.</p>
<p>Once you see it clearly, life gets a whole lot lighter, and juggling becomes a whole lot easier.</p>
]]></content:encoded></item></channel></rss>