<?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>Mon, 07 Sep 2026 23:42:39 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[Cloud Governance Is a Change Management Problem]]></title><description><![CDATA[TL;DR: Most organizations don't struggle to define cloud governance standards. They struggle to make those standards stick. Whether it's tagging, backup policies, security controls, or cost optimizati]]></description><link>https://4cryingout.cloud/cloud-governance-is-a-change-management-problem</link><guid isPermaLink="true">https://4cryingout.cloud/cloud-governance-is-a-change-management-problem</guid><category><![CDATA[Cloud Governance]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Platform Engineering ]]></category><dc:creator><![CDATA[Brandon Haschick]]></dc:creator><pubDate>Mon, 24 Aug 2026 07:41:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6489896ca808488bfb0be516/1c226141-f2a5-4a69-b28c-4935e17a7f2c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p><strong>TL;DR</strong>: Most organizations don't struggle to define cloud governance standards. They struggle to make those standards stick. Whether it's tagging, backup policies, security controls, or cost optimization, the hardest problems are usually organizational rather than technical. Successful cloud governance depends on communication, ownership, prioritization, and change management as much as automation and policy enforcement.</p>
</blockquote>
<p>Much earlier in my career, I found AWS tags slightly strange.</p>
<p>I worked within a single application team. We knew which resources belonged to our application, which environment they supported, and who was responsible for them. The answers were usually visible in the repository, the deployment pipeline, the resource name, or simply sitting inside someone's head.</p>
<p><em>Why did I need to add an</em> <code>Application</code> <em>tag? I knew which application it was.</em></p>
<p><em>Why did I need an</em> <code>Owner</code> <em>tag? I knew who owned it.</em></p>
<p><em>Why add</em> <code>Environment</code> <em>when the account or resource name already made that obvious?</em></p>
<p>From inside one application team, tags looked like administrative metadata added for someone else's benefit. They felt like extra work rather than something that helped us build or run the application.</p>
<p>That view was understandable.</p>
<p>It was also incomplete.</p>
<p>My perspective changed when I began working across multiple environments, AWS accounts, applications, and teams. Suddenly, I was looking at resources without the context of the people who created them.</p>
<p>The questions changed too:</p>
<ul>
<li><p>Who owns this resource?</p>
</li>
<li><p>Which application depends on it?</p>
</li>
<li><p>Is it still needed?</p>
</li>
<li><p>Can it be stopped outside working hours?</p>
</li>
<li><p>Which cost centre should pay for it?</p>
</li>
<li><p>What backup policy applies?</p>
</li>
<li><p>Who should receive the ticket when something is misconfigured?</p>
</li>
</ul>
<p>The resource name rarely contained enough reliable information. Documentation was often incomplete or outdated. The engineer who created the resource might have moved to another team, or left the organization entirely.</p>
<p>I had misunderstood who the tags were for.</p>
<p>They were not primarily for the engineer creating the resource. They were for everybody, and every system, that would later encounter it without the original context.</p>
<p>That realization taught me something broader than the value of tagging:</p>
<blockquote>
<p>Cloud governance does not usually fail because organizations cannot define standards. It fails because standards must travel through imperfect organizations.</p>
</blockquote>
<p>They cross team boundaries, ownership models, product backlogs, communication channels, legacy systems, and competing priorities.</p>
<p>That makes cloud governance a change management problem as much as a technical one.</p>
<hr />
<h2>Context Stops Scaling Before Infrastructure Does</h2>
<p>Within a single application team, context is cheap.</p>
<p>People know what is being deployed and why. They understand naming conventions, architectural decisions, and the history behind unusual resources. Much of that knowledge is informal, but still readily available.</p>
<p>At organizational scale, context becomes distributed.</p>
<p>A FinOps team examining costs may not know the application architecture. A security team investigating a finding may not know which developers to contact. A platform team identifying an unattached volume may not know whether it is abandoned or deliberately retained for recovery.</p>
<p>Tags and other forms of metadata help preserve that context.</p>
<p>AWS positions tagging as a mechanism for categorizing resources and supporting activities such as cost monitoring, operations, incident management, backup, access control, and resource management. AWS also distinguishes between reactive governance, finding resources that do not comply, and proactive governance, where controls prevent noncompliant resources from being created.</p>
<p>But adding metadata is not the same as creating useful context.</p>
<p>A resource carrying this tag is not necessarily well governed:</p>
<pre><code class="language-text">Owner=Platform
</code></pre>
<p>What does Platform mean?</p>
<p>Is that a technical owner, business owner, support team, or cost owner? Is it still accurate? Is there an authoritative list of valid values? Does Platform map to a team that still exists?</p>
<p>Governance depends on shared meaning, not merely the presence of key-value pairs.</p>
<p>And shared meaning is an organizational problem.</p>
<hr />
<h2>Setting the Standard Is the Easy Part</h2>
<p>Most cloud standards begin reasonably.</p>
<p>An organization wants better cost reporting, so it introduces the <code>CostCenter</code> tag.</p>
<p>It wants to route operational findings, so it introduces <code>Owner</code>.</p>
<p>It wants to automate stopping development resources, so it introduces <code>CronSchedule</code>.</p>
<p>The standards may look something like this:</p>
<ul>
<li><p><code>Application</code></p>
</li>
<li><p><code>Environment</code></p>
</li>
<li><p><code>Owner</code></p>
</li>
<li><p><code>CostCenter</code></p>
</li>
<li><p><code>DataClassification</code></p>
</li>
</ul>
<p>A platform, security, FinOps, or governance team documents the requirements. The proposal is reviewed. Stakeholders agree that the information is useful.</p>
<p>The standard is approved.</p>
<p>That is often treated as the end of the decision.</p>
<p>In reality, it is the beginning of the difficult part.</p>
<p>The standard now has to leave the meeting in which it was defined and reach the people who must implement it. More importantly, those people must understand what has changed, why it matters, what action is expected, and where the work fits among everything else they are responsible for.</p>
<p><strong>This is where governance can quickly become the Wild West.</strong></p>
<p>One team receives a detailed explanation during a meeting. Another receives a link to a wiki page. Another gets a spreadsheet listing noncompliant resources. A fourth discovers the requirement when a deployment pipeline starts failing.</p>
<p>New engineers join after the original communication and inherit the implementation without its rationale.</p>
<p>Eventually, multiple versions of the truth emerge:</p>
<ul>
<li><p><em>The standard that was originally approved</em></p>
</li>
<li><p><em>The standard described in the documentation</em></p>
</li>
<li><p><em>The standard application teams remember</em></p>
</li>
<li><p><em>The standard implemented by reusable infrastructure components</em></p>
</li>
<li><p><em>The standard enforced by pipelines</em></p>
</li>
<li><p><em>The standard expected by reporting</em></p>
</li>
<li><p><em>The unofficial collection of known exceptions</em></p>
</li>
</ul>
<p>This does not necessarily happen because anyone is careless.</p>
<p>Communication naturally decays as information moves through an organization. Standards evolve, teams reorganize, documentation becomes stale, and local interpretations appear.</p>
<p>The technical control may still work perfectly while the governance system around it becomes increasingly unreliable.</p>
<hr />
<h2>The Team Defining the Standard Often Does Not Own the Change</h2>
<p>Cloud governance usually involves distributed ownership.</p>
<p>The responsibilities may look like this:</p>
<ul>
<li><p>Platform or governance team -&gt; Defines the desired outcome</p>
</li>
<li><p>Application team -&gt; Owns the infrastructure code</p>
</li>
<li><p>Product owner -&gt; Prioritizes the work</p>
</li>
<li><p>Security, FinOps, or Operations -&gt; Depends on the resulting metadata</p>
</li>
</ul>
<p>The platform team can identify hundreds of resources with missing tags, but it may not be able to safely change every application repository.</p>
<p>The application team can update the infrastructure code, but it may not understand how the metadata is used by central reporting or automation.</p>
<p>The product owner decides whether that work is prioritized over feature development, operational incidents, security remediation, or technical debt.</p>
<hr />
<h2>Everyone Owns a Part of the Problem</h2>
<p>Nobody necessarily owns the complete outcome.</p>
<p>This is why a request to "remediate missing tags" can remain open for months even when everyone agrees that the tags should exist.</p>
<p>It is tempting for a central team to conclude that application teams simply do not care about governance. From the application team's perspective, however, the request may appear as an unexplained internal task with no customer impact, deadline, or visible consequence.</p>
<p>Both perspectives can be rational.</p>
<p>The failure is in the system connecting them.</p>
<p>Technically, adding a tag may be a one-line change. Organizationally, it may require considerably more.</p>
<p>An application team may need to:</p>
<ol>
<li><p>Find the correct repository</p>
</li>
<li><p>Determine where tags are currently applied</p>
</li>
<li><p>Establish the authoritative value</p>
</li>
<li><p>Update CDK, Terraform, or another deployment mechanism</p>
</li>
<li><p>Test inheritance and propagation behaviour</p>
</li>
<li><p>Roll the change through multiple environments</p>
</li>
<li><p>Handle manually created or legacy resources</p>
</li>
<li><p>Verify that central reporting recognizes the value</p>
</li>
<li><p>Coordinate with another team that owns the source data</p>
</li>
</ol>
<p>The work then competes with:</p>
<ul>
<li><p>Customer-facing features</p>
</li>
<li><p>Production incidents</p>
</li>
<li><p>Security vulnerabilities</p>
</li>
<li><p>Reliability improvements</p>
</li>
<li><p>Regulatory deadlines</p>
</li>
<li><p>Technical debt</p>
</li>
<li><p>Other governance findings</p>
</li>
</ul>
<h3>The Idealistic View</h3>
<p>Every approved standard is important, so teams should implement it promptly.</p>
<h3>The Realistic View</h3>
<p>Engineering capacity is limited. Work is prioritized according to perceived risk, business impact, urgency, and leadership attention.</p>
<p>This does not mean governance should always lose to feature development. It means a platform team needs to explain more than the technical requirement.</p>
<p>It should be able to answer:</p>
<ul>
<li><p>What problem does this standard solve?</p>
</li>
<li><p>What happens if a team does nothing?</p>
</li>
<li><p>How urgent is the change?</p>
</li>
<li><p>Which resources matter most?</p>
</li>
<li><p>How much work is expected?</p>
</li>
<li><p>Can part of the remediation be automated?</p>
</li>
<li><p>What support is available?</p>
</li>
<li><p>When will enforcement begin?</p>
</li>
</ul>
<p>A technically small change is not automatically an organizationally small change.</p>
<hr />
<h2>Communication Is Part of the Platform</h2>
<p>The obvious answer is to communicate better.</p>
<p>Unfortunately, that often translates into another email, meeting, Teams announcement, or wiki page.</p>
<p>Those things can help, but none of them provides a complete solution.</p>
<p>People miss announcements. Meetings do not scale. Documentation becomes stale. Dashboards do not create ownership. Tickets do not create priority. Pipeline failures do not explain why a standard exists.</p>
<p>A realistic governance communication model needs several layers.</p>
<h3>1. Maintain One Canonical Source of Truth</h3>
<p>Every standard should have one authoritative location.</p>
<p>For each control, that source should explain:</p>
<ul>
<li><p>The requirement</p>
</li>
<li><p>The purpose</p>
</li>
<li><p>The scope</p>
</li>
<li><p>The standard owner</p>
</li>
<li><p>The affected teams</p>
</li>
<li><p>The effective date</p>
</li>
<li><p>The expected values</p>
</li>
<li><p>The enforcement mechanism</p>
</li>
<li><p>The remediation path</p>
</li>
<li><p>The exception process</p>
</li>
<li><p>The review date</p>
</li>
<li><p>The change history</p>
</li>
</ul>
<p>A canonical page does not guarantee that people will read it.</p>
<p>But without one, every conversation begins with a different version of the truth.</p>
<h3>2. Communicate the Change, Not Just the Document</h3>
<p>An announcement like this is rarely enough:</p>
<blockquote>
<p>The cloud governance policy has been updated. Please review the documentation.</p>
</blockquote>
<p>A useful announcement should explain:</p>
<ul>
<li><p>What changed</p>
</li>
<li><p>Why it changed</p>
</li>
<li><p>Who is affected</p>
</li>
<li><p>What action is required</p>
</li>
<li><p>When action is required</p>
</li>
<li><p>How compliance will be measured</p>
</li>
<li><p>Whether enforcement is changing</p>
</li>
<li><p>Where questions can be raised</p>
</li>
</ul>
<p>The documentation remains the source of truth.</p>
<p>The communication explains the change.</p>
<h3>3. Introduce Standards in Stages</h3>
<p>A new standard should not normally move directly from a meeting into a blocking pipeline control.</p>
<p>A more realistic rollout looks like this:</p>
<ol>
<li><p>Define and document</p>
</li>
<li><p>Measure existing compliance</p>
</li>
<li><p>Communicate the impact</p>
</li>
<li><p>Warn on new noncompliance</p>
</li>
<li><p>Provide a supported remediation path</p>
</li>
<li><p>Enforce the standard for new resources</p>
</li>
<li><p>Prioritize legacy remediation</p>
</li>
</ol>
<p>The exact stages depend on the risk.</p>
<h3>4. Put Guidance Close to the Work</h3>
<p>A standard becomes easier to adopt when engineers encounter it inside their normal workflow.</p>
<p>Examples include:</p>
<ul>
<li><p>Reusable CDK constructs or Terraform modules</p>
</li>
<li><p>Pull request validation</p>
</li>
<li><p>Pipeline warnings</p>
</li>
<li><p>Deployment-time checks</p>
</li>
<li><p>Actionable compliance findings</p>
</li>
<li><p>Clear examples in preferred tooling</p>
</li>
<li><p>Automated remediation where safe and deterministic</p>
</li>
</ul>
<p>Instead of:</p>
<pre><code class="language-text">Missing required tag
</code></pre>
<p>Provide:</p>
<pre><code class="language-text">Resource: AWS::EC2::Instance
Missing tag: Application

Purpose:
Used for resource ownership and cost allocation.

Expected value:
Registered application identifier.

Remediation guidance:
https://example.internal/standards/tags/application
</code></pre>
<p>Automation should reduce the need to remember standards.</p>
<p>It should not remove the need to understand them.</p>
<h3>5. Create a Feedback Loop</h3>
<p>Standards are often designed centrally but implemented locally.</p>
<p>That means application teams will encounter realities that the standard authors did not anticipate.</p>
<p>Examples include:</p>
<ul>
<li><p>Required values unavailable during provisioning</p>
</li>
<li><p>Resources that do not support expected tagging behaviour</p>
</li>
<li><p>Conflicting controls</p>
</li>
<li><p>Automated remediations creating deployment risk</p>
</li>
<li><p>Missing authoritative data sources</p>
</li>
</ul>
<p>A governance standard needs authority, but it should not be immune to feedback.</p>
<hr />
<h2>Exceptions Are Expensive Because Context Expires</h2>
<p>Not every exception is bad.</p>
<p>Legacy workloads, migrations, vendor-managed systems, short-lived experiments, regulatory differences, and technical limitations can all justify deviations from a standard.</p>
<p>The problem is not the existence of exceptions.</p>
<p>The problem is losing the reason they exist.</p>
<p>Every exception should have:</p>
<ul>
<li><p>A documented reason</p>
</li>
<li><p>A clear scope</p>
</li>
<li><p>An owner</p>
</li>
<li><p>An approver</p>
</li>
<li><p>An expiry date</p>
</li>
<li><p>A review mechanism</p>
</li>
</ul>
<p>An exception without an owner and expiry date is not really an exception.</p>
<p>It is a second standard that nobody has documented properly.</p>
<p>That is governance debt.</p>
<hr />
<h2>Detection Is Easier Than Prioritisation</h2>
<p>Cloud environments can produce enormous lists of findings:</p>
<ul>
<li><p>Missing tags</p>
</li>
<li><p>Incorrect retention periods</p>
</li>
<li><p>Oversized compute</p>
</li>
<li><p>Unattached storage</p>
</li>
<li><p>Configuration drift</p>
</li>
<li><p>Missing backups</p>
</li>
<li><p>Outdated runtimes</p>
</li>
<li><p>Public exposure</p>
</li>
</ul>
<p>Detecting these conditions is increasingly straightforward.</p>
<p>Deciding what should be fixed first is much harder.</p>
<p>Findings should be evaluated using factors such as:</p>
<ul>
<li><p>Risk</p>
</li>
<li><p>Financial impact</p>
</li>
<li><p>Environment</p>
</li>
<li><p>Blast radius</p>
</li>
<li><p>Confidence</p>
</li>
<li><p>Effort</p>
</li>
<li><p>Ownership</p>
</li>
<li><p>Urgency</p>
</li>
</ul>
<p>Governance requires judgment.</p>
<p>Automation can detect, classify, and sometimes remediate.</p>
<p>It cannot eliminate the need to agree on risk, ownership, and priority.</p>
<hr />
<h2>The Platform Architect Is a Facilitator, Not Merely an Enforcer</h2>
<p>A weak model of cloud governance looks like this:</p>
<blockquote>
<p>A central team defines the rules, and application teams comply.</p>
</blockquote>
<p>A more effective model recognizes platform architecture as a facilitation role.</p>
<p>The platform architect helps:</p>
<ul>
<li><p>Bring stakeholders together</p>
</li>
<li><p>Translate organizational risk into technical standards</p>
</li>
<li><p>Explain the purpose behind requirements</p>
</li>
<li><p>Challenge standards with no clear consumer</p>
</li>
<li><p>Establish safe defaults</p>
</li>
<li><p>Make standards discoverable</p>
</li>
<li><p>Clarify remediation ownership</p>
</li>
<li><p>Prioritize findings</p>
</li>
<li><p>Automate repetitive work</p>
</li>
<li><p>Keep exceptions visible and temporary</p>
</li>
<li><p>Listen when controls create friction</p>
</li>
<li><p>Measure whether the organization is actually improving</p>
</li>
</ul>
<p>The objective is not maximum enforcement.</p>
<p>It is the right level of governance for the risk, implemented in a way that teams can understand and sustain.</p>
<hr />
<h2>Final Thoughts</h2>
<p>I used to think tags existed to help engineers identify resources they had created themselves.</p>
<p>From that perspective, they did feel pointless. I already knew what everything was.</p>
<p>What I had not yet experienced (all those years ago) was an environment where the person investigating a resource might belong to another team, work in another part of the organization, or arrive several years after the resource was created.</p>
<p>Tags preserve some of the context that organizations otherwise lose.</p>
<p>But writing <code>Owner=TeamA</code> is still the easy part.</p>
<p>The difficult part is agreeing on what ownership means, maintaining the source of truth, communicating changes, deciding who must remediate existing resources, managing legitimate exceptions, and determining where the work belongs among everything else competing for attention.</p>
<p>That lesson extends far beyond tagging.</p>
<p>A cloud standard can be technically correct, thoroughly documented, and perfectly automated, and still fail if the organization does not understand it, trust it, own it, or prioritize it.</p>
<p>That is why cloud governance is not merely a configuration problem.</p>
<p>It is a change management problem.</p>
<p>And helping an organization navigate that change is part of platform architecture.</p>
]]></content:encoded></item><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>