<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Notes on theAEYDR - Architectural Decision Record</title>
    <link>https://writing.aeydr.dev/notes/</link>
    <description>Recent content in Notes on theAEYDR - Architectural Decision Record</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>Aeydr (Jon)</copyright>
    <lastBuildDate>Fri, 09 Jan 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://writing.aeydr.dev/notes/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Inverting IAM Permissions for System-Centric Ownership</title>
      <link>https://writing.aeydr.dev/notes/aws-iam-inverting-iam-permissions-for-system-centric-ownership/</link>
      <pubDate>Fri, 09 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-iam-inverting-iam-permissions-for-system-centric-ownership/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;One of the most common ways organizations model IAM and role-based access control is around teams. You start with the assumption that &amp;ldquo;this team owns this thing,&amp;rdquo; so it makes sense to give them permissions scoped to it. If I own Service A, then of course I should be the one who can restart it, update the code, change its database configuration, and so on. That logic extends out to build systems, artifact stores, CI pipelines. It&amp;rsquo;s a reasonable-enough model.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stale Code and the Cost of Forgetting</title>
      <link>https://writing.aeydr.dev/notes/software-codebase-forgotten-stale-and-rot/</link>
      <pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/software-codebase-forgotten-stale-and-rot/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Stale code, or code rot, which can be generally described as a whole category of long-lingering issues that show up with old code sitting around in the codebase. For example, there was a time when our organization was really into Ansible. That led us to spin up a bunch of reusable repositories full of Ansible roles that were basically little packages you could plug into your playbooks. These were for installing stuff like Java runtimes, &lt;code&gt;jq&lt;/code&gt;, and all sorts of other tiny setup utilities. We went really minimal and micro with it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Letting the Repo Explain Itself</title>
      <link>https://writing.aeydr.dev/notes/explore-code-archaeology-for-branding-and-docs/</link>
      <pubDate>Sat, 03 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/explore-code-archaeology-for-branding-and-docs/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Code archaeology, at least the way I&amp;rsquo;m playing with it, is the idea that a repository can be wired so cleanly that the repo itself starts narrating what&amp;rsquo;s inside. If the metadata is rich enough with sensible folder names and the odd tag sprinkled in, then tools can roam through and surface the big picture without me hand-stitching an overview every time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deliberate Slack Bots as Cultural Infrastructure</title>
      <link>https://writing.aeydr.dev/notes/slack-chatbots-for-company-culture/</link>
      <pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/slack-chatbots-for-company-culture/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;One of the proposals to build more deliberate Slack bots as part of our onboarding flow and general culture. It came up while brainstorming ways we could make culture more of a natural part of how we work, instead of something that only exists in a stale wiki page somewhere. The idea is that these bots would enable small processes that reflect our culture.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using AWS IoT Certificates for Safer External Access</title>
      <link>https://writing.aeydr.dev/notes/aws-iam-assume-role-anywhere-from-cert/</link>
      <pubDate>Mon, 29 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-iam-assume-role-anywhere-from-cert/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;I looked into a pattern of using AWS IoT certificates as a way of granting permissions to automated processes and services that live outside AWS. This ties into the broader conversation around how we typically provision credentials to CI systems either by stuffing IAM access keys into some secrets manager or by piping in temporary credentials from another service that rotates them regularly. Those are the common paths. But I&amp;rsquo;ve been digging into this alternative: using AWS IoT certificates to grant access via IAM roles.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Grafana Dashboards via S3 and CSI</title>
      <link>https://writing.aeydr.dev/notes/k8s-grafana-flux-and-published-dashboards/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/k8s-grafana-flux-and-published-dashboards/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Grafana supports defining dashboards as config JSON files. You can bundle these directly into the Grafana container image, or load them at runtime through a config map. You can even go further and use a volume mount that stays up to date, with Grafana periodically reloading itself to pick up any new changes. The idea I&amp;rsquo;ve been proposing is to take that and pair it with the AWS S3 CSI driver. We&amp;rsquo;d publish our dashboards into an S3 bucket as part of our CI workflow, and then use the CSI driver to mount that bucket into the Grafana pod. Grafana would then keep syncing from that S3 bucket and refreshing dashboards as needed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Simple ALB and S3 Setup for Network Reachability Testing</title>
      <link>https://writing.aeydr.dev/notes/aws-network-testability-with-alb-s3-endpoint/</link>
      <pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-network-testability-with-alb-s3-endpoint/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;How you can build a really simple ALB setup using just S3 and DNS to serve a JSON endpoint that you can hit to test basic network reachability. This is one of those things where, whether you&amp;rsquo;re trying to validate something programmatically or just open a browser and check, it&amp;rsquo;s useful to have a quick way to confirm, yep, I can reach this endpoint from wherever I&amp;rsquo;m running. And doing it with just an ALB and an S3 bucket is pretty lightweight.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes Operators, Ownership and Blue-Green Infrastructure Implications</title>
      <link>https://writing.aeydr.dev/notes/aws-eks-operators-blue-green-deploys-and-cross-cluster-state/</link>
      <pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-eks-operators-blue-green-deploys-and-cross-cluster-state/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;How one of the ways Kubernetes operators persist their state is a little different from something like Terraform. There&amp;rsquo;s no centralized state file that they&amp;rsquo;re managing. Instead, they tend to rely on annotations, tags, and other attached metadata to keep track of the resources they&amp;rsquo;re responsible for. A good example of this is external-dns, which can manage Route 53 records in AWS (or DNS records in other clouds). It uses DNS TXT records to embed identifying metadata so that it knows which records it owns. That way, it can safely find, update, or delete them. Same thing happens with the AWS Load Balancer Controller. It tags the load balancers to claim ownership, so it knows what it can safely manage or remove.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring API Procedures as a Pattern in REST APIs</title>
      <link>https://writing.aeydr.dev/notes/api-programmable-macro-patterns-in-server/</link>
      <pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/api-programmable-macro-patterns-in-server/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Using procedures in REST APIs, similar to something you&amp;rsquo;d see within a database&amp;rsquo;s stored procedures (or GraphQL on the client). It&amp;rsquo;s something that&amp;rsquo;s come up frequently as I&amp;rsquo;ve been working with APIs that require me to do round-trips for retrieving metadata about resources like tags, annotations, or labels. This was partly inspired by my experience with GraphQL on the client side, and stored procedures/views on the database side.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Organizing Private DNS in AWS</title>
      <link>https://writing.aeydr.dev/notes/aws-route53-private-zone-management-models/</link>
      <pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-route53-private-zone-management-models/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;There are a few different ways you can manage private DNS inside AWS, and one of the first things I think is important is making sure you actually own the domain you&amp;rsquo;re planning to use. Not because you want to make it public or publish anything externally, but just so you have full control over it. You want to be able to define how it&amp;rsquo;s used, make sure it&amp;rsquo;s not getting misused for things like spoofing or weird email routing or whatever kind of trickery someone might try.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why We Mirror Artifacts Across AWS Regions</title>
      <link>https://writing.aeydr.dev/notes/aws-artifacts-reliability-of-artifact-stores/</link>
      <pubDate>Fri, 19 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-artifacts-reliability-of-artifact-stores/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;In AWS, you&amp;rsquo;ll run into plenty of situations where artifacts S3 buckets, CodeArtifact, or ECR are mirrored across multiple regions. Maybe you&amp;rsquo;re primarily deploying out of &lt;code&gt;ca-central-1&lt;/code&gt;, but you&amp;rsquo;ve also mirrored those same artifacts into &lt;code&gt;eu-central-1&lt;/code&gt; to support some EU workloads. Part of that is just convenience: having a local copy in-region cuts down on latency and dependency complexity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why point-and-click access control slows everything down</title>
      <link>https://writing.aeydr.dev/notes/organization-the-point-and-click-trap-it-ops-that-don-t-scale/</link>
      <pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/organization-the-point-and-click-trap-it-ops-that-don-t-scale/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Some thoughts on point-and-click operations, even when it&amp;rsquo;s just in isolated groups or limited scopes. I feel like the kind of bottlenecks this creates negatively impact the organization in ways beyond just speed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Well-Architected Repository For Automated Changes</title>
      <link>https://writing.aeydr.dev/notes/software-well-architectured-repositories/</link>
      <pubDate>Sat, 13 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/software-well-architectured-repositories/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The &amp;ldquo;Well-Architected Repository&amp;rdquo; model, in the context of automated code changes. At different points, we&amp;rsquo;ve talked about this idea of well-architected repositories, borrowing from AWS&amp;rsquo;s well-architected infrastructure concepts. The core idea is having a consistent set of files or structures in place across repositories to make it easier when someone&amp;rsquo;s jumping between different repositories or even different parts of a monorepo. It started off as just a guideline, more for when people were doing manual changes to make the developer experience consistent. It was just a helpful way to organize things, define templates, and make onboarding smoother.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mirroring GitHub Actions with Terraform</title>
      <link>https://writing.aeydr.dev/notes/github-actions-cache-through-terraform/</link>
      <pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/github-actions-cache-through-terraform/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A GitHub Actions cache that&amp;rsquo;s managed and enabled through Terraform. One of the core issues with GitHub Actions is that you&amp;rsquo;re depending on external repositories to be available for your workflows to succeed. If those go away or change, your reliability goes with them. Importantly, though, GitHub Actions often uses floating versions, which means anything like &lt;code&gt;v4&lt;/code&gt; or &lt;code&gt;v4.3&lt;/code&gt; is actually referring to a specific patch release (&lt;code&gt;v4.3.7&lt;/code&gt;). These all point to a specific commit in GitHub.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using a Standby OU to Dodge SCP Bootstrap Traps</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-standby-organization-units/</link>
      <pubDate>Tue, 09 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-standby-organization-units/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When juggling AWS Organizations, the moment Service Control Policies become truly useful is also when they start breaking the bootstrap workflow. I absolutely want the guardrails of no deleting VPCs, no tinkering with an account alias, and keep the org-access role cemented in place. All of these are great because those moves protect the critical plumbing that keeps everything else upright. The snag is that slapping those restrictions at the root level means the very pipeline that spins an account up (or tears one down) can&amp;rsquo;t finish its own work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>API-derived status checks for GitHub repos via Terraform</title>
      <link>https://writing.aeydr.dev/notes/github-api-driven-feedback-loop-on-github-repositories-managed-by-terraform/</link>
      <pubDate>Sat, 06 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/github-api-driven-feedback-loop-on-github-repositories-managed-by-terraform/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;How an API-derived feedback loop can help manage GitHub repository status checks using Terraform. One of the things GitHub supports is managing your repositories with Terraform, which lets you do things like set required status checks directly in the repo. The tricky part, though, is that there&amp;rsquo;s this weird chicken-and-egg problem. If you enable a required status check before that check actually exists in the repository, then every pull request just gets blocked.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Language of Slack Emojis</title>
      <link>https://writing.aeydr.dev/notes/slack-emojis-and-the-language-of-reaction/</link>
      <pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/slack-emojis-and-the-language-of-reaction/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;We use Slack emojis a lot. Both for being funny and sometimes for more functional reasons. You&amp;rsquo;ll see the usual fun stuff like &lt;code&gt;:sadcat:&lt;/code&gt; or &lt;code&gt;:thisisfine:&lt;/code&gt; floating around, which are mostly just for tone or jokes. But we&amp;rsquo;ve also got emojis that actually serve a functional purpose. Some are used in automated messages or show up in workflows. Others are deliberately chosen to act as visual cues in specific channels to provide context, help with scanning, or just generally keep things organized. It&amp;rsquo;s about vibes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Useful GitHub Organization Patterns</title>
      <link>https://writing.aeydr.dev/notes/github-organization-pattern-for-internal-and-public/</link>
      <pubDate>Sun, 30 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/github-organization-pattern-for-internal-and-public/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;One of the patterns I sometimes use for managing GitHub organizations which is splitting them up into a couple of distinct types.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Centralizing Slack Notifications from Alerts with EventBridge</title>
      <link>https://writing.aeydr.dev/notes/aws-eventbridge-for-notifications-through-slack/</link>
      <pubDate>Fri, 28 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-eventbridge-for-notifications-through-slack/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Using a centralized EventBridge model, you can make it way easier for services to emit Slack messages. Not by pushing all the logic into the services themselves, but by making their only real responsibility just sending something off to SNS, SQS, or EventBridge inside the account. In some cases, you might not even need to have your code explicitly do that part. You can model it so that the event is derived from metric changes, or a side effect of some other event in the system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Publishing Cross-Account Deployment Metrics with EventBridge</title>
      <link>https://writing.aeydr.dev/notes/aws-eventbridge-metric-publishing-to-cwl/</link>
      <pubDate>Wed, 26 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-eventbridge-metric-publishing-to-cwl/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When you&amp;rsquo;re using a centralized EventBridge model, it&amp;rsquo;s actually pretty straightforward to pass around custom metrics or event signals across accounts. This is especially useful when you&amp;rsquo;re dealing with things that don&amp;rsquo;t really fall neatly into traditional application monitoring. These aren&amp;rsquo;t your standard CPU usage or request latency numbers. They&amp;rsquo;re usually events that reflect some infrastructural or environmental state. Stuff that&amp;rsquo;s meaningful to the broader system but kind of outside the app&amp;rsquo;s own little bubble.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Treating Secrets as Disposable</title>
      <link>https://writing.aeydr.dev/notes/software-secrets-as-disposable/</link>
      <pubDate>Tue, 25 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/software-secrets-as-disposable/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;How I&amp;rsquo;ve been hung up on the idea that secrets are fundamentally disposable, just like binary artifacts. We ship binaries, container layers, Lambda zips, VM images, as long as  the checksum matches, the code runs the same whether the bits came from us-east-1 or a mirror on the far side of the planet. Infrastructure costs, latency, or cache warm-up still exist, but because the bytes are identical, there&amp;rsquo;s zero functional change to the code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Musings on Hirings and the User Experience </title>
      <link>https://writing.aeydr.dev/notes/organization-hiring-and-market-opportunity/</link>
      <pubDate>Mon, 24 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/organization-hiring-and-market-opportunity/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Some of my thoughts on hiring practices in software organizations. I&amp;rsquo;ve got opinions on basically every part of it like most people do, but the one I wanted to focus on is the general flow someone goes through when they&amp;rsquo;re trying to join an organization. It&amp;rsquo;s usually something like:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Injecting Chaos to Expose Rotten Foundations</title>
      <link>https://writing.aeydr.dev/notes/explore-lucky-lotto-resilience-chaos-engineering-for-team-process/</link>
      <pubDate>Fri, 21 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/explore-lucky-lotto-resilience-chaos-engineering-for-team-process/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;I keep circling around the idea of chaos engineering, but not the technical-style that&amp;rsquo;s common but more of an organizational version that stresses our documentation and institutional knowledge. The spark was simple enough: our runbooks look authoritative until someone follows them to the letter and, boom, nothing works. The fix gets pasted into Slack, everybody nods, and the documentation itself stays stale. That tiny cycle made me think about the ways the organization operates on shared memory rather than written truth.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What&#39;s in the !artifacts Directory?</title>
      <link>https://writing.aeydr.dev/notes/github-actions-external-app-manifest-for-versioning-and-build-data/</link>
      <pubDate>Tue, 18 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/github-actions-external-app-manifest-for-versioning-and-build-data/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;What the &lt;code&gt;!artifacts&lt;/code&gt; directory is, why it shows up in our repo after a build, and what those common files like &lt;code&gt;manifest&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, and &lt;code&gt;build&lt;/code&gt; are doing in there. In our setup, the build process has this packaging step that&amp;rsquo;s responsible for gathering up everything we&amp;rsquo;re creating and sticks it all into one place. That place might have a few subfolders, but the idea is that everything under &lt;code&gt;!artifacts&lt;/code&gt; represents the complete output of the build, fully baked and self-contained. The whole point is that you can take this directory and enumerate everything in it for publishing to artifact stores.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why One Might Proxy Secrets Manager Names Through SSM</title>
      <link>https://writing.aeydr.dev/notes/aws-secretsmanager-proxying-secrets-manager-with-ssm-parameters/</link>
      <pubDate>Sat, 15 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-secretsmanager-proxying-secrets-manager-with-ssm-parameters/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Sometimes it&amp;rsquo;s useful to proxy the name of an AWS Secrets Manager secret using an SSM parameter. The main reason for this is how CloudFormation handles references. It has pretty decent support for importing values from SSM parameters, which makes SSM a pretty effective way to pull in something from your infrastructure since it allows other infrastructure-as-code to be responsible for writing the SSM parameter in the first place, ensuring it&amp;rsquo;s current.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why We Separate InternalOps from CorpOps</title>
      <link>https://writing.aeydr.dev/notes/software-internal-and-corp-ops-tenants/</link>
      <pubDate>Fri, 14 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/software-internal-and-corp-ops-tenants/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Why it makes sense to distinguish between InternalOps and CorpOps. CorpOps is just shorthand for corporate operations, which is basically the stuff managed by IT. They&amp;rsquo;re the ones responsible for systems like Okta, which in turn governs access to things like GitHub, payroll, expense reports, all of our internal tools. If there&amp;rsquo;s a system that handles operations for the company as a whole, that&amp;rsquo;s CorpOps territory, and it usually routes through Okta.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reasonable Early Security Controls in AWS</title>
      <link>https://writing.aeydr.dev/notes/aws-reasonable-security-controls/</link>
      <pubDate>Tue, 11 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-reasonable-security-controls/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When you&amp;rsquo;re spinning up an AWS account for a new project, you usually don&amp;rsquo;t need the full buffet of security tooling AWS offers. But some controls, if added early, can save you a ton of pain later. Not because they solve everything upfront but because they prevent you from having to retrofit controls after you&amp;rsquo;ve already scaled. It&amp;rsquo;s not about locking things down on day one. It&amp;rsquo;s more like: &amp;ldquo;You&amp;rsquo;re probably going to need this eventually,&amp;rdquo; and it&amp;rsquo;s easier to set it up now than unwind mistakes later. Think of it like YAGNI, but with security guardrails.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using GUIDs for Terraform State file paths</title>
      <link>https://writing.aeydr.dev/notes/terraform-unique-id-for-remote-state-files/</link>
      <pubDate>Sat, 08 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-unique-id-for-remote-state-files/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Why the organisation stores every Terraform state file under a generated GUID instead of a descriptive path.&lt;/p&gt;&#xA;&lt;p&gt;Remote backends such as S3 or Azure Blob normally let you pick any object key. For example, &lt;code&gt;networking/prod/vpc.tfstate&lt;/code&gt;. At first glance, human-readable keys seem convenient. But in a GitOps repository, it&amp;rsquo;s not ideal to have a fixed repository structure, as any shifting of stack locations will result in drift between where the state is stored and where it lives in the repository.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Minimal state machines within Terraform</title>
      <link>https://writing.aeydr.dev/notes/terraform-state-machine-for-rotation/</link>
      <pubDate>Wed, 05 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-state-machine-for-rotation/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A less-than-ideal pattern for creating a state machine within Terraform. For most development cases, Terraform is only triggered when inputs change, such as a new module version, a new artifact version, or an explicit decision to update the variables in the Terraform stack. You aren&amp;rsquo;t limited to that, though.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Terraform Secrets Retrieval with HCP Vault or SaaS Providers</title>
      <link>https://writing.aeydr.dev/notes/terraform-secrets-retrieval-with-hcp-vault-or-saa-s-providers/</link>
      <pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-secrets-retrieval-with-hcp-vault-or-saa-s-providers/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Why one might adopt a lightweight but suboptimal infrastructure code pattern for retrieving secrets from a password manager (e.g. LastPass, Keeper, 1Password, etc.) and publishing those secrets into something like AWS SecretsManager. In many organisations, there&amp;rsquo;s a password manager-type solution. These are typically intended for use by people which will access them via a browser. This is also used to pass secrets between people within the organisation, such as when the owner of a service gives access tokens to a consumer of the service within the organisation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Challenges with Nested Data-Rich Structures in Terraform</title>
      <link>https://writing.aeydr.dev/notes/terraform-nested-hierarchy-data-with-looping/</link>
      <pubDate>Thu, 30 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-nested-hierarchy-data-with-looping/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When building pipeline-style infrastructure, you sometimes need to describe an entire state machine or multi-step workflow as a single, deeply nested object, which is much richer than the flat variables Terraform typically expects. These definitions capture everything from conditional branches to user-interaction steps, and the shape often resembles any NodeRED, AWS Step Functions, or GitHub Actions YAML.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloud agnostic patterns using build artifact metadata</title>
      <link>https://writing.aeydr.dev/notes/terraform-cloud-agnostic-conventions-by-artifact-metadata/</link>
      <pubDate>Fri, 24 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-cloud-agnostic-conventions-by-artifact-metadata/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Designing infrastructure as code to be cloud agnostic is often a &lt;em&gt;loss-based&lt;/em&gt; effort that sees us trying to encode conditional logic, favour a single cloud environment, or lose out on cloud provider-specific patterns that are better suited to our use case.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deletion, Terraform and Infrastructure as Code Lifecycles</title>
      <link>https://writing.aeydr.dev/notes/terraform-building-with-deletion-in-lifecycle/</link>
      <pubDate>Sun, 19 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-building-with-deletion-in-lifecycle/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Infrastructure as code written in Terraform or CloudFormation often ends up not handling deletion scenarios gracefully. For example, an AWS S3 bucket requires the &lt;code&gt;force_destroy&lt;/code&gt; flag to delete a bucket that still contains objects; otherwise, deletion fails. In CloudFormation, a stack with an S3 bucket containing objects cannot be deleted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building Infrastructure with Deletion in Mind</title>
      <link>https://writing.aeydr.dev/notes/terraform-building-infrastructure-with-deletion-in-mind/</link>
      <pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-building-infrastructure-with-deletion-in-mind/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Designing infrastructure with deletion in mind is an often ignored and surprisingly important consideration when it comes to infrastructure as code. When building systems, it can be easy to focus solely on how to create and change components without considering the implications of tearing them down.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AWS CodePipeline for airgapped-ish Terraform deployments</title>
      <link>https://writing.aeydr.dev/notes/terraform-aws-codepipeline-airgapped-deployments/</link>
      <pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-aws-codepipeline-airgapped-deployments/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;That you can use AWS CodePipeline as a Terraform executor to create pseudo-airgapped deployments of Terraform resources. The basic idea is to execute Terraform entirely inside the VPC by packaging every required provider version and module into a single archive bundle. With the CodeBuild jobs provisioned in the VPC, this locks execution into the VPC, giving you controls to restrict access to internet resources.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Discouragement for Account-ID Conditionals in Terraform</title>
      <link>https://writing.aeydr.dev/notes/terraform-avoiding-environment-injection-into-iac/</link>
      <pubDate>Sun, 05 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-avoiding-environment-injection-into-iac/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;You should avoid, whenever possible, using the region or the account ID as a conditional within Terraform or any infrastructure code. Relying on identifiers such as &amp;ldquo;if the ID equals X, enable this&amp;rdquo; or &amp;ldquo;if the region is Y, create that bucket&amp;rdquo; seems convenient until one wishes to leverage the &lt;em&gt;code&lt;/em&gt; of your Terraform.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Atlantis configuration within Terraform Stacks for distributed configuration</title>
      <link>https://writing.aeydr.dev/notes/terraform-atlantis-generative-projects/</link>
      <pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-atlantis-generative-projects/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Why the organisation splits Atlantis project definitions into each Terraform stack directory and then regenerates the top-level &lt;code&gt;atlantis.yaml&lt;/code&gt; using scripts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why We Use Structured Slack Messages for Deployment Events</title>
      <link>https://writing.aeydr.dev/notes/slack-deployment-notification-events/</link>
      <pubDate>Wed, 24 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/slack-deployment-notification-events/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Since different workloads carry varying levels of risk, we structure Slack messages for deployment events to match the needs of different audiences. For example, infrastructure-as-code modules that manage secrets pose relatively low risk and can be updated frequently. It&amp;rsquo;s straightforward to validate that secrets are intact, so we can release updates as needed. Deployment notifications are therefore rather to the point:&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQL Bundles for Infrastructure as Code Databases</title>
      <link>https://writing.aeydr.dev/notes/postgres-database-pkg-bundles/</link>
      <pubDate>Fri, 19 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/postgres-database-pkg-bundles/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When using the C# EntityFramework for provisioning databases, this relies on a bootstrap step to spin up the database, handled by the application code. While exploring this workflow, the idea emerged that rather than letting application code create tables and views on first run, an AWS RDS instance receives its entire schema from the infrastructure layer. Terraform applies a bundled SQL artifact that declares tables, views, and stored procedures upfront. The database is ready before a single line of application code executes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scaling Gomplate by avoiding logic in templates with module-driven patterns</title>
      <link>https://writing.aeydr.dev/notes/gomplate-scaling-avoiding-logic-in-templates-with-module-driven-patterns/</link>
      <pubDate>Sun, 14 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/gomplate-scaling-avoiding-logic-in-templates-with-module-driven-patterns/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When you mix logic with presentation, you often end up with templates that are difficult to read and maintain. For example, consider a scenario where you need to perform set operations on a list of items. If you were to include this logic directly in your Gomplate template, your code might look something like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gomplate, escape hatches, and the limits of tools</title>
      <link>https://writing.aeydr.dev/notes/gomplate-precomputed-inputs-for-gomplate-templates/</link>
      <pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/gomplate-precomputed-inputs-for-gomplate-templates/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;One of the ways that you can extend the viability of a scripting (or generic) solution is by going beyond the limit of a tool. When you work with languages like PowerShell, Bash, or even CI pipelines written in GitHub Actions YAML, you eventually reach a point where the tool&amp;rsquo;s simplicity no longer meets your needs. Tasks that involve richer data management or complex logic are better suited to a full programming language. When you reach that boundary, there are techniques that let you extend the tool&amp;rsquo;s usefulness a bit further without requiring you to perform the migration.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Structuring Documentation Before Writing It</title>
      <link>https://writing.aeydr.dev/notes/documentation-output-over-organizing/</link>
      <pubDate>Wed, 03 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/documentation-output-over-organizing/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Although the structure of documentation can influence its accessibility and readability, when you have nothing to organise, it isn&amp;rsquo;t worth focusing on frameworks and layout. Discussions over folder hierarchies, documentation locations, and layout frameworks can yield exquisitely organised documentation, but they won&amp;rsquo;t reveal the gaps in your documentation. Structure alone produces nothing. Only writing yields documentation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bazel Toolchains as Files Outside of Bazel Code</title>
      <link>https://writing.aeydr.dev/notes/bazel-toolchains-external-to-rules-in-third-party-dependency/</link>
      <pubDate>Fri, 29 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-toolchains-external-to-rules-in-third-party-dependency/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;In Bazel, when developing rules that wrap an existing CLI tool (for example, &lt;code&gt;jq&lt;/code&gt;, &lt;code&gt;gator&lt;/code&gt;, or &lt;code&gt;terraform&lt;/code&gt;), you can declare the toolchain alongside the rules. Typically, you use &lt;code&gt;http_archive&lt;/code&gt; (or a similar repository rule) to fetch the tool binaries, then register a &lt;code&gt;toolchain&lt;/code&gt; that makes them available to Bazel:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bazel Toolchains as Interface Instead of Embedded in Rules</title>
      <link>https://writing.aeydr.dev/notes/bazel-toolchains-external-to-rules/</link>
      <pubDate>Fri, 22 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-toolchains-external-to-rules/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;In Bazel, when developing rules that wrap an existing CLI tool (for example, &lt;code&gt;jq&lt;/code&gt;, &lt;code&gt;gator&lt;/code&gt;, or &lt;code&gt;terraform&lt;/code&gt;), you can declare the toolchain alongside the rules. Typically, you use &lt;code&gt;http_archive&lt;/code&gt; (or a similar repository rule) to fetch the tool binaries, then register a &lt;code&gt;toolchain&lt;/code&gt; that makes them available to Bazel:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bazel, RulesOCI, and Docker Load for Running Container Images</title>
      <link>https://writing.aeydr.dev/notes/bazel-rules-oci-bazel-and-dockerfiles/</link>
      <pubDate>Sun, 17 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-rules-oci-bazel-and-dockerfiles/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;With the deprecation of &lt;code&gt;rules_docker&lt;/code&gt;, Bazel no longer provides a maintained container run-and-extract pattern. Its successor, &lt;code&gt;rules_oci&lt;/code&gt;, treats containers primarily as an archive format rather than an environment in which you can execute builds. The old &lt;code&gt;container_run_and_extract&lt;/code&gt; rule looked something like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Leveraging bazel query for generic conditional build workflows</title>
      <link>https://writing.aeydr.dev/notes/bazel-queries-for-generic-workflows/</link>
      <pubDate>Sun, 10 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-queries-for-generic-workflows/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Bazel supports the &lt;code&gt;query&lt;/code&gt; subcommand, allowing inspection of the build graph from build scripts. Both single targets and complex patterns can be matched, enabling scripts to make data-driven decisions rather than having strict requirements for build actions to be defined.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bazel workspace directories for runtime emitted files</title>
      <link>https://writing.aeydr.dev/notes/bazel-predictable-runtime-paths/</link>
      <pubDate>Mon, 04 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-predictable-runtime-paths/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This was written before Bazel 5.0; newer versions (or rules) may better support this pattern.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;When you run a Bazel target with &lt;code&gt;bazel run&lt;/code&gt;, you can use the &lt;code&gt;BUILD_WORKSPACE_DIRECTORY&lt;/code&gt; environment variable to write outputs to a predictable location inside your workspace. For example:&lt;/p&gt;</description>
    </item>
    <item>
      <title>An idea on Bazel &amp; Variant-agnostic configurations</title>
      <link>https://writing.aeydr.dev/notes/bazel-multi-architecture-platforms-within-bazel/</link>
      <pubDate>Wed, 30 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-multi-architecture-platforms-within-bazel/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The idea came from reflecting on how Terraform handles modular reuse through its module structure. In Terraform, defining a module is straightforward, and looping through different configurations is seamless. It got me wondering if a similar approach was achievable in Bazel, particularly when managing multi-platform or multi-architecture builds.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reusable Shell-Based Workflows with `bazel run`</title>
      <link>https://writing.aeydr.dev/notes/bazel-as-a-library-driven-build-system/</link>
      <pubDate>Sun, 27 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-as-a-library-driven-build-system/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Bazel can actually be leveraged to make reusable build scripts available that don&amp;rsquo;t necessarily integrate within Bazel itself. By defining custom rules, it becomes possible to wrap standalone shell scripts and run them with &lt;code&gt;bazel run&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Bazel as an Organisation&#39;s Non-Bazel Build System</title>
      <link>https://writing.aeydr.dev/notes/bazel-as-a-better-build-system/</link>
      <pubDate>Mon, 21 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-as-a-better-build-system/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;One of the reasons why the organisation chose Bazel is, surprisingly, not actually related to caching, remote execution, or speed. The compelling draw was Bazel&amp;rsquo;s knack for acting as a library of build actions that can be invoked and parameterised just like functions in code. In practice, that means a shell script, static-analysis tool, or container build can live within a library rather than the source it touches.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dedicated Node Groups for Shared Services for Cost Optimisation</title>
      <link>https://writing.aeydr.dev/notes/aws-eks-dedicated-nodegroups-for-operators/</link>
      <pubDate>Wed, 16 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-eks-dedicated-nodegroups-for-operators/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Dedicated Node Groups for Shared Services within Node Group-based Kubernetes Clusters in AWS could be a practical way to tame operating costs. When an Amazon EKS cluster relies on a single, catch-all node group, most workloads end up on AMD64 on-demand instances due to limited ARM support. That default blocks the cluster from taking advantage of cheaper capacity, particularly ARM64 Graviton nodes on Spot.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Chasing Cost Savings with Spot, Graviton, and Resource Reservations</title>
      <link>https://writing.aeydr.dev/notes/aws-ec2-spot-graviton-and-costs/</link>
      <pubDate>Sat, 12 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-ec2-spot-graviton-and-costs/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When AWS announced the release of Graviton, the roughly 30% compute discount proved extremely appealing for many organisations, triggering a rush toward adoption that often felt myopic. Given how essential compute resources are within AWS, that enthusiasm made sense on paper. Yet I also noticed how many of the pre-existing invisible x86 assumptions continued on. The single-architecture container images, schedulers defaulting to AMD64, metadata not carrying over from artifacts to infrastructure as code. These were quietly carried over as the organisation transitioned towards Graviton machines.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Attribute-Aware Deployments with AWS Account Tags</title>
      <link>https://writing.aeydr.dev/notes/aws-deployment-model-for-target-selectors/</link>
      <pubDate>Sun, 06 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-deployment-model-for-target-selectors/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Attribute-aware deployment patterns are one of the reasons to take the effort to add annotations and metadata to AWS accounts. Tagging each account at the Organisations level means the information lives close to the infrastructure it describes, rather than in a scattered trail of wikis and runbooks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Terraform-Integrated AWS Workflows for Terraform (CodePipeline, Step Functions)</title>
      <link>https://writing.aeydr.dev/notes/aws-codepipeline-terraform-and-step-functions/</link>
      <pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-codepipeline-terraform-and-step-functions/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;You can leverage built-in technologies of AWS like CodePipeline or Step Functions to create deployment workflows for Terraform. By combining these technologies, you can achieve a self-contained deployment pattern within AWS that works with private networking, air-gapped deployments, and strictly controlled artifacts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing Terraform with Conftest, OPA, and Bazel</title>
      <link>https://writing.aeydr.dev/notes/bazel-terraform-verification-via-conftest/</link>
      <pubDate>Thu, 26 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-terraform-verification-via-conftest/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Conftest is a small command-line wrapper around Open Policy Agent that lets you write policies that test configuration files and run them as assertions. Because Terraform state is declared in HCL, you can point Conftest at a &lt;code&gt;*.tf&lt;/code&gt; file and ask, for example, whether every &lt;code&gt;aws_s3_bucket&lt;/code&gt; block turns on server-side encryption. In practice, that feels like writing unit tests for infrastructure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick AWS CLI Multi-Region (and Multi-Account) Queries</title>
      <link>https://writing.aeydr.dev/notes/aws-cli-for-multi-region-queries/</link>
      <pubDate>Wed, 25 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cli-for-multi-region-queries/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Bash supports a neat pattern for quickly running AWS CLI queries across multiple regions using argument expansion. When working with AWS services, it&amp;rsquo;s common to gather information from different regions or accounts. Instead of manually switching regions, you can automate this process with a Bash script.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using ASDF for Operations, and Devcontainers for Build</title>
      <link>https://writing.aeydr.dev/notes/asdf-while-also-using-devcontainers/</link>
      <pubDate>Sat, 21 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/asdf-while-also-using-devcontainers/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Why the organisation would leverage both &lt;code&gt;asdf&lt;/code&gt; and Devcontainers at the same time. To review, a Devcontainer is a development environment running within a container image that allows you to clone a repository and start coding within an environment suited to the repository.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Idiomatic code and an SQL-compatible domain model for codegen</title>
      <link>https://writing.aeydr.dev/notes/postgres-generating-idiomatic-code-from-sql/</link>
      <pubDate>Mon, 16 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/postgres-generating-idiomatic-code-from-sql/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Working with sqlc, the Go tool that converts handwritten SQL into type-safe code, sparked a new line of thinking: could the process be entirely codegen? I wondered whether a reusable domain model, defined once in a neutral format, might generate every SQL artifacts, the matching domain classes layer and the database layer. The idea dovetailed with a long-standing fascination I have with Postgres stored functions (&amp;amp; procedures): let the model emit the functions, views, and idiomatic code so that storage details stay fluid while the interfaces remain stable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Internal Keys, User-Facing URNs and exposing the database to users</title>
      <link>https://writing.aeydr.dev/notes/postgres-musing-on-key-model-urn-for-dbs/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/postgres-musing-on-key-model-urn-for-dbs/</guid>
      <description>&lt;h3 id=&#34;today-i-explored&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explored&#xA;  &#xA;    &lt;a href=&#34;#today-i-explored&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;While working on backend services, I kept seeing the same pattern: database primary keys bubbled up the entire stack until they surfaced in bookmarkable URLs, shell scripts, Terraform configs, and even the user interface. Because those numeric IDs became part of application behaviours, any schema migration switching the primary key poses the risk of disrupting application behaviour even when the IDs are generally treated as existing just for database relational purposes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unified Toolchains with an Ad-Hoc `third_party/toolchains`</title>
      <link>https://writing.aeydr.dev/notes/asdf-third-party-toolchains-with-bespoke-schemas/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/asdf-third-party-toolchains-with-bespoke-schemas/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Repositories have a number of ways in which they can support development environment setup. One of the more common recent additions is &lt;a href=&#34;https://containers.dev/&#34;&gt;DevContainers&lt;/a&gt;, but many other systems exist, like language-specific install scripts, &lt;a href=&#34;https://nixos.org/&#34;&gt;Nix&lt;/a&gt;, or just the tried-and-true Bash script. These systems will lean on version files such as &lt;code&gt;.python-version&lt;/code&gt; or &lt;code&gt;.bazel-version&lt;/code&gt; to pin runtimes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Organisation-Wide Toolchain Management with ASDF</title>
      <link>https://writing.aeydr.dev/notes/asdf-organization-wide-toolchain-management-with-asdf/</link>
      <pubDate>Sun, 08 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/asdf-organization-wide-toolchain-management-with-asdf/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll notice that many repositories contain a &lt;code&gt;.tool-versions&lt;/code&gt; file at the root. Inside this file are space-delimited toolchain names and their versions, like so:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using ASDF in CI to Pin Tool Versions</title>
      <link>https://writing.aeydr.dev/notes/asdf-in-github-actions-for-consistent-toolchains/</link>
      <pubDate>Thu, 05 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/asdf-in-github-actions-for-consistent-toolchains/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;You don&amp;rsquo;t have to pigeon-hole ASDF into a desktop nicety for juggling tool versions on a laptop. The basic idea behind the tool is simple: it installs every binary into a predictable directory and chooses which one runs based on a version you declare. Any environment that can execute those binaries and tolerate a quick ASDF bootstrap can benefit from the same mechanism, whether that&amp;rsquo;s a CI runner or within a production server. Drop the familiar &lt;code&gt;.tool-versions&lt;/code&gt; file into the pipeline, run a short setup script, and the workflow comes up with exactly the versions your local shell expects.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CloudFormation, Applications &amp; Separation of Concerns</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-multi-stack-application-pattern/</link>
      <pubDate>Mon, 15 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-multi-stack-application-pattern/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;CloudFormation supports the resource type &lt;code&gt;AWS::CloudFormation::Stack&lt;/code&gt;, which allows a CloudFormation stack to provision another CloudFormation stack. This is known as a nested stack. These nested stacks allow re-using an already defined CloudFormation stack when deploying a stack, or just as a mechanism for grouping.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quickly initializing tools with ASDF</title>
      <link>https://writing.aeydr.dev/notes/asdf-initialize-from-database/</link>
      <pubDate>Sat, 19 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/asdf-initialize-from-database/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;If you happen to be leveraging a &lt;a href=&#34;../asdf-toolchain-database-by-plugin/&#34;&gt;single plugin strategy&lt;/a&gt; for asdf, as a way of consistently managing toolchains, a quick helper that you can make use of to quickly set up plugins is running the command:&lt;/p&gt;</description>
    </item>
    <item>
      <title>A strict execution pipeline with Terraform</title>
      <link>https://writing.aeydr.dev/notes/terraform-a-strict-execution-pipeline/</link>
      <pubDate>Fri, 18 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-a-strict-execution-pipeline/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Terraform support the concept of the &amp;ldquo;plan&amp;rdquo;, a preview of the &lt;em&gt;speculative&lt;/em&gt; actions that Terraform will take to modify your infrastructure. This is used in most Terraform implementations, performing a plan that will be reviewed before being executed by an apply.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ASDF, Toolchains and a Single Plugin as Package Database</title>
      <link>https://writing.aeydr.dev/notes/asdf-toolchain-database-by-plugin/</link>
      <pubDate>Fri, 18 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/asdf-toolchain-database-by-plugin/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;asdf is a CLI tool that manages multiple language-runtime versions on a per-project basis. It does this through per-tool plugins, which are Bash scripts that install the runtimes onto a developer&amp;rsquo;s workstation. When asdf is installed, this works by first installing the plugin from a Git URL:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Predictable naming of resources in CloudFormation</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-names-for-predictable-lookup/</link>
      <pubDate>Thu, 17 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-names-for-predictable-lookup/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Some AWS Services have naming uniqueness requirements, which are typically within an AWS Account Region, or within an AWS Account. Which you&amp;rsquo;ll typically find out about when encountering an error message that sounds similar to:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Packaged bundles of Infrastructure through Terraform</title>
      <link>https://writing.aeydr.dev/notes/terraform-prebuilt-bundles/</link>
      <pubDate>Wed, 16 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-prebuilt-bundles/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Terraform configuration files have three different ways in which they are able to impose some &lt;em&gt;requirements&lt;/em&gt; about dependencies they have within the terraform ecosystem. The first is the &lt;code&gt;lockfile&lt;/code&gt;, which is used to pin the specific versions of the Terraform Providers to use when executing Terraform. This can be fairly important for both performance and security, as it allows more providers to make use of the same &lt;em&gt;precached&lt;/em&gt; version of a given Terraform provider.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Terraform, AWS &amp; Sourcing Secrets</title>
      <link>https://writing.aeydr.dev/notes/terraform-aws-secretsmanager-for-provider-secrets/</link>
      <pubDate>Mon, 14 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-aws-secretsmanager-for-provider-secrets/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;It isn&amp;rsquo;t always the case that you are solely working with the Terraform AWS provider, and in the cases in which you are working with providers for external services, you don&amp;rsquo;t necessarily have access to the same authentication pattern as IAM. Often you connect to these external services using a URL and a token credential. For working with these kind of terraform modules, the token credential isn&amp;rsquo;t going to be readily available on the workstation. Sometimes a helper may exists within &lt;code&gt;/usr/secrets/bin&lt;/code&gt; to dynamically pull the secret from an external provider, but this isn&amp;rsquo;t always the case.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tags in Terraform, overriding defaults and module-level tags</title>
      <link>https://writing.aeydr.dev/notes/terraform-aws-default-and-override-tags/</link>
      <pubDate>Sun, 13 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-aws-default-and-override-tags/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The Terraform AWS Provider supports a field known as &lt;code&gt;default_tags&lt;/code&gt; which can &lt;em&gt;significantly&lt;/em&gt; cutdown on the amount of copying &amp;amp; pasting when it comes to apply tags on all resources within a deployment. This is especially useful for Terraform modules, as they don&amp;rsquo;t require passing along &lt;code&gt;tags&lt;/code&gt; to each sub-module contained within. This makes the overhead of setting up metadata within a Terraform module more practical, allowing for things like licensing, documentation URL or compliance-driven tags to be defined inside of the module itself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Postgres Delete/Restore by Table Properties</title>
      <link>https://writing.aeydr.dev/notes/postgres-versioning-as-table-mechanism/</link>
      <pubDate>Sat, 12 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/postgres-versioning-as-table-mechanism/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;You&amp;rsquo;ve likely encountered tables where the records within the table are treated as immutable, creating entirely new entries when a change is made. These are versioned tables, and are one way to provide a versioning scheme within a database like Postgres. Typically this is implemented within the table itself, by having a table in which all versions exist, using a &lt;code&gt;VersionID&lt;/code&gt; (or similar ID) to distinguish between the versions:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Soft Deletes as the responsibility of the Database</title>
      <link>https://writing.aeydr.dev/notes/postgres-delete-restore-as-table-property/</link>
      <pubDate>Fri, 11 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/postgres-delete-restore-as-table-property/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;You&amp;rsquo;ve likely heard of the concept of &amp;ldquo;soft delete&amp;rdquo; within tables. These is where a flag exists on a row called &lt;code&gt;deleted&lt;/code&gt; (or similarly named), that can be toggled to indicate whether an entry has been &amp;ldquo;deleted&amp;rdquo;. This doesn&amp;rsquo;t remove the row from the table, and keeps it around allowing a user to restore it (set the flag to &lt;code&gt;false&lt;/code&gt;) at a future date. Should it not be toggled back, after some time it will be removed from the database, based on a &lt;code&gt;deleted-at&lt;/code&gt; and expiration policy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dynamic templating facilitated through gomplate</title>
      <link>https://writing.aeydr.dev/notes/gomplate-exec-pattern-for-writes/</link>
      <pubDate>Thu, 10 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/gomplate-exec-pattern-for-writes/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.gomplate.ca/&#34;&gt;gomplate&lt;/a&gt; is a template renderer CLI that can fit nicely within the niche of lightweight templating solution, as it&amp;rsquo;s support for datasources (like JSON &amp;amp; YAML) and conditional execution pushes it a step up above hand-crafting something in PowerShell or Bash. One of the frustrations that arises with this method of templating is the difficulty with debugging the execution of the conditional logic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bazel, Container Push &amp; Infrastructure in Builds</title>
      <link>https://writing.aeydr.dev/notes/bazel-container-push-and-hardcoded-registries/</link>
      <pubDate>Wed, 09 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/bazel-container-push-and-hardcoded-registries/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;A pattern that I &lt;em&gt;generally&lt;/em&gt; discouraged is the encoding of artifact stores within build systems, such as having a container registry hardcoded into the &lt;code&gt;docker push&lt;/code&gt; (or equivalent actions) in the build system. This isn&amp;rsquo;t to say that the container registry can&amp;rsquo;t be specified within the continuous integration pipeline, but that it should be avoided within the build system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cost Categories, Infrastructure and Tags</title>
      <link>https://writing.aeydr.dev/notes/aws-tagging-and-cost-categorization/</link>
      <pubDate>Tue, 08 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-tagging-and-cost-categorization/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Tags are an extremely useful mechanism within AWS for managing both permissions, categorization, associations &amp;amp; relationships within infrastructure. As IAM supports policies that permit or restrict permissions based on the presence of a tag, it can be tempting to make use of it. However, this can be a &lt;em&gt;risky&lt;/em&gt; approach as it runs the risk of creating IAM policies that are difficult to make attestations about.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pseudo Content Addressable Storage within S3</title>
      <link>https://writing.aeydr.dev/notes/aws-s3-content-addressable-s3/</link>
      <pubDate>Mon, 07 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-s3-content-addressable-s3/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;While reviewing an AWS S3 bucket you may have comes across files named similar to &lt;code&gt;87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7&lt;/code&gt;. This being a file, sometimes a zip archive, with a named composed of what appears to be a random set of numbers and letters. These files aren&amp;rsquo;t actually published into S3 with a random name, but rather are published with their checksum as their name.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Denying point &amp; click EC2s within AWS Accounts</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-deny-scps-for-launchwizard/</link>
      <pubDate>Sun, 06 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-deny-scps-for-launchwizard/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When spinning up an EC2, the AWS Web Console offers an interface wizard, known as Launch Wizard. This wizard offers a guided workflow for configuring &amp;amp; starting an EC2 within an AWS Region. Yet sometimes you may be prevented or strongly discouraged from making use of this wizard when wishing to provision an EC2. Why?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Prebuilt IAM policies, and least privilege in AWS</title>
      <link>https://writing.aeydr.dev/notes/aws-iam-concerns-with-prebuilt-policies/</link>
      <pubDate>Sat, 05 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-iam-concerns-with-prebuilt-policies/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;You may find repositories for which the test pipeline failed when you had recently made a modification to an IAM Policy or Role, which saw the addition of an IAM policy. Specifically, the &lt;a href=&#34;https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html&#34;&gt;managed access policies&lt;/a&gt; which don&amp;rsquo;t grant least privilege, but assist with covering common use cases. These errors sometimes look like:&lt;/p&gt;</description>
    </item>
    <item>
      <title>AWS Accounts and the hidden costs of compliance</title>
      <link>https://writing.aeydr.dev/notes/aws-empty-infrastructure-costs/</link>
      <pubDate>Fri, 04 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-empty-infrastructure-costs/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Even with no deployed applications, an AWS Account &lt;del&gt;will&lt;/del&gt; may still incur costs.&lt;/p&gt;&#xA;&lt;p&gt;The above statement is a bit of a special case. As organization grows they adopt many of AWS&amp;rsquo;s built-in services for meeting compliance expectations, such as CloudTrail, GuardDuty, Inspector &amp;amp; AWS Config. They&amp;rsquo;ll implement things like IAM Roles in accounts that permit tooling to scan infrastructure to identify potential malicious activity within the accounts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Prefix Lists for Common Third Party Services</title>
      <link>https://writing.aeydr.dev/notes/aws-ec2-prefix-lists-for-common-third-party-services/</link>
      <pubDate>Thu, 03 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-ec2-prefix-lists-for-common-third-party-services/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When developing a service within Amazon Web Services (AWS), it isn&amp;rsquo;t always intended to be consumed by any machine in the world wide web. It may only be responsible for communicating with a single third party service, or an internal service hosted in a different part of the company&amp;rsquo;s cloud. For these kind of services, they often have a declared set of CIDR ranges (IPs) that you can expect to receive &amp;amp; interact with for network traffic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Message prompts when connecting to EC2s</title>
      <link>https://writing.aeydr.dev/notes/aws-ec2-motd-on-amis/</link>
      <pubDate>Wed, 02 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-ec2-motd-on-amis/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When you connect to instances within the organization, you&amp;rsquo;ll notice that it sometimes includes a prompt that includes the company logo &amp;amp; an advisory message, this looks something like the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why are Lambda zip names sometimes random strings in CloudFormation?</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-s3-lambdas-with-checksums/</link>
      <pubDate>Tue, 01 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-s3-lambdas-with-checksums/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;While reviewing an AWS S3 bucket you may have comes across files named similar to &lt;code&gt;87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7&lt;/code&gt;. This being a file, sometimes a zip archive, with a named composed of what appears to be a random set of numbers and letters. These files aren&amp;rsquo;t actually published into S3 with a random name, but rather are published with their checksum as their name.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deployment keys for unique deployments Terraform deployments</title>
      <link>https://writing.aeydr.dev/notes/terraform-deployment-keys-for-uniqueness/</link>
      <pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-deployment-keys-for-uniqueness/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Resources within Terraform can be sometimes be created with the &lt;code&gt;name_prefix&lt;/code&gt; field set. Instead of using the fixed &lt;code&gt;name&lt;/code&gt; field which leaves room for collisions, the &lt;code&gt;name_prefix&lt;/code&gt; will generate a unique suffix, typically sourced from the current timestamp. For a stack with multiple resources using these fields, it can generate a large number of uniquely named resources. For resources that don&amp;rsquo;t support this kind of field, the option still exists for using the &lt;a href=&#34;https://registry.terraform.io/providers/hashicorp/random/latest/docs&#34;&gt;random provider&lt;/a&gt; to generate a prefix or suffix.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A workflow for creating new AWS Accounts</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-new-aws-account/</link>
      <pubDate>Sun, 30 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-new-aws-account/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Before automating the creation a new AWS Account using the &lt;a href=&#34;https://docs.aws.amazon.com/organizations/latest/APIReference/API_CreateAccount.html&#34;&gt;API&lt;/a&gt; or through the &lt;a href=&#34;https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_create.html&#34;&gt;AWS Console&lt;/a&gt;, there are some processes that should be considered beforehand.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Third party secrets management with dedicated vault AWS Accounts</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-centralized-secrets-vault-account/</link>
      <pubDate>Sat, 29 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-centralized-secrets-vault-account/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Organizations don&amp;rsquo;t typically grant every individual administrator permissions in third party services, or the ability to create new application integrations. The ability to create &lt;a href=&#34;https://aeydr.slack.com/apps&#34;&gt;slack apps&lt;/a&gt;, &lt;a href=&#34;https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps&#34;&gt;github apps&lt;/a&gt;, &lt;a href=&#34;https://www.oauth.com/oauth2-servers/client-registration/client-id-secret/&#34;&gt;oauth clients&lt;/a&gt; or &lt;a href=&#34;https://en.wikipedia.org/wiki/Service_account&#34;&gt;service accounts&lt;/a&gt; is locked down, typically to the IT or CorpOps groups.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Root domain Hosted Zones within dedicated AWS Accounts</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-isolated-dns-aws-account/</link>
      <pubDate>Fri, 28 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-isolated-dns-aws-account/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When a subdomain hosted zone, such as &lt;code&gt;subdomain.aeydr.dev&lt;/code&gt;, is created within an AWS Account it isn&amp;rsquo;t automatically setup for resolution in the wider AWS Organization or internet. This is because the root domain &lt;code&gt;aeydr.dev&lt;/code&gt; hosted zone isn&amp;rsquo;t delegating to this new subdomain hosted zone for managing those records. Within AWS, &lt;a href=&#34;https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingNewSubdomain.html&#34;&gt;subdomain delegation&lt;/a&gt; is necessary to enable another hosted zone to be responsible for DNS records on a domain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing an AWS Organization using Terraform</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-terraform-management-of-accounts/</link>
      <pubDate>Thu, 27 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-terraform-management-of-accounts/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/recommended-ous-and-accounts.html&#34;&gt;AWS Organizations &amp;amp; accounts&lt;/a&gt; are the de-facto approach for separating workloads based on function, compliance requirements, or facilitating an organization&amp;rsquo;s logical architecture separations. This is because an AWS account is a hard boundary, for which it requires explicit permissions to cross this boundary. For isolating workloads from other areas of the organization (production from staging), it is an effective solution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A re-usable help command for Makefiles</title>
      <link>https://writing.aeydr.dev/notes/makefile-support-for-help/</link>
      <pubDate>Wed, 26 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/makefile-support-for-help/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Makefiles are a solid approach for having a &lt;em&gt;lightweight&lt;/em&gt; task runner within a repository. Other &lt;a href=&#34;https://magefile.org/&#34;&gt;tools&lt;/a&gt; for &lt;a href=&#34;https://github.com/goyek/goyek&#34;&gt;task&lt;/a&gt; &lt;a href=&#34;https://github.com/casey/just&#34;&gt;runners&lt;/a&gt; exist that can be used for running common actions or useful scripts, but Makefiles have an appealing &lt;em&gt;labyrinthine&lt;/em&gt; simplicity to them. One of these benefits is just familiarity with the syntax:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Default provisioning of infrastructure in a standby state</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-standby-infrastructure/</link>
      <pubDate>Tue, 25 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-standby-infrastructure/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Shared infrastructure as code packages often have the number of replicas or minimum size configured with a value of at least 1, or an equivalent to ensure that the service is running when first setup. This is a default behaviour of plug &amp;amp; play to reduce the time to value (TTV). As after running the initial setup, it is possible to begin interacting with the service immediately. This doesn&amp;rsquo;t have to be the default behaviour. One of the consequences of choosing this behaviour is that infrastructure is provisioned without consideration for the expected workload traffic. This results in numerous infrastructure with resource reservations far exceeding the kind of traffic you are actually working with. Especially in the prototyping or development case, it causes the problem of many small wasteful expenses that have the cumulative effect of a significant budget expenditure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Minimal AWS Accounts for permission restrictions</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-minimal-aws-accounts/</link>
      <pubDate>Mon, 24 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-minimal-aws-accounts/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When viewing an AWS Organization you may have come across organization units or AWS Accounts that are named after technologies or responsibilities. Some of these might be similar to the below:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Self-registration of infrastructure with Terraform</title>
      <link>https://writing.aeydr.dev/notes/terraform-aws-self-registration-infrastructure-pattern/</link>
      <pubDate>Sun, 23 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-aws-self-registration-infrastructure-pattern/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Although Terraform uses the concept of &lt;a href=&#34;https://developer.hashicorp.com/terraform/language/modules&#34;&gt;modules&lt;/a&gt; as a container for multiple resources, this doesn&amp;rsquo;t mean that the entire infrastructure of an application must be contained within a single &lt;a href=&#34;https://developer.hashicorp.com/terraform/language/state&#34;&gt;state&lt;/a&gt;. In fact, for practical reasons it is often necessary to split resources across multiple state files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pullthrough cache for mirrored public ECR images</title>
      <link>https://writing.aeydr.dev/notes/aws-ecr-public-for-oss-mirroring/</link>
      <pubDate>Fri, 21 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-ecr-public-for-oss-mirroring/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When working with container images from third-party registries (DockerHub, Quay, GitHub Container Registry), it can sometimes result in you failing to pull the container images. One such example of this error is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Centralizing artifacts for an AWS Organization</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-centralized-artifacts-accounts/</link>
      <pubDate>Thu, 20 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-centralized-artifacts-accounts/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Container images aren&amp;rsquo;t always located within the same AWS Account as the workload, which is why it is possible that you can receive errors when communicating with &lt;a href=&#34;https://aws.amazon.com/ecr/&#34;&gt;AWS Elastic Container Registry (ECR)&lt;/a&gt; about insufficient permissions to pull from the repository:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Entrypoint AWS Accounts for third party services</title>
      <link>https://writing.aeydr.dev/notes/aws-orgs-entrypoint-accounts-for-third-party/</link>
      <pubDate>Wed, 19 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-orgs-entrypoint-accounts-for-third-party/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When setting up third party services with AWS, using technologies like OpenID Connect&lt;a href=&#34;https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services&#34;&gt;¹&lt;/a&gt;&lt;a href=&#34;https://circleci.com/docs/openid-connect-tokens/&#34;&gt;²&lt;/a&gt;, if your AWS organization has many AWS Accounts it can result in many ways in which third party services has access into your infrastructure. Without proper tagging or audit controls, this can become a genuine pain point during compliance &amp;amp; audits, as tracking them all down will be an exercise.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Restricted IAM Roles within continuous integration</title>
      <link>https://writing.aeydr.dev/notes/aws-iam-restricted-role-by-default/</link>
      <pubDate>Tue, 18 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-iam-restricted-role-by-default/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When setting up continuous integration, one of the first challenges faced by newcomers is providing credentials to the service to authenticate with AWS. Typically this will be done with &lt;a href=&#34;https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html&#34;&gt;IAM Access Keys&lt;/a&gt;, potentially something with &lt;a href=&#34;https://docs.aws.amazon.com/iot/latest/developerguide/security-iam.html&#34;&gt;IAM IoT Devices&lt;/a&gt;, or the more recent direction of OpenID Connect if your continuous integration service supports it &lt;a href=&#34;https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services&#34;&gt;¹&lt;/a&gt;&lt;a href=&#34;https://circleci.com/docs/openid-connect-tokens/&#34;&gt;²&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Restricted SSH for instances using session manager &amp; IAM</title>
      <link>https://writing.aeydr.dev/notes/aws-server-permission-to-iam/</link>
      <pubDate>Mon, 17 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-server-permission-to-iam/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html&#34;&gt;AWS Systems Manager Session Manager&lt;/a&gt;] allows for connecting to EC2s running within the AWS cloud. Provided that these instances have been configured with systems manager, it provides a lightweight way of enabling keyless SSH for servers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSM &amp; Pre-defined users for least privilege SSH</title>
      <link>https://writing.aeydr.dev/notes/aws-ssm-with-least-privilege-users-on-ec2s/</link>
      <pubDate>Sun, 16 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-ssm-with-least-privilege-users-on-ec2s/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;By default, &lt;a href=&#34;https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html&#34;&gt;AWS Systems Manager Session Manager&lt;/a&gt; uses the &lt;code&gt;ssm-user&lt;/code&gt; role when connecting to EC2s that has been configured with systems manager. This user &lt;a href=&#34;https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-ssm-user-permissions.html&#34;&gt;can be disabled, but is enabled by default&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Precomputed APIs using AWS S3 buckets</title>
      <link>https://writing.aeydr.dev/notes/aws-s3-for-precomputed-api/</link>
      <pubDate>Sat, 15 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-s3-for-precomputed-api/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Internal datasets in organizations can be tricky, because the internal nature of the data means that approaches for making them accessible are &lt;em&gt;as needs arise&lt;/em&gt;. This can mean that internl datasets are distributed in ways such as:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Infrastructure guards to prevent accidental destruction</title>
      <link>https://writing.aeydr.dev/notes/terraform-infrastructure-guards-for-s3/</link>
      <pubDate>Fri, 14 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-infrastructure-guards-for-s3/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;It isn&amp;rsquo;t always desirable for the lifecycles of resources to be fully managed with single execution within infrastructure as code. The possibility of accidently deleting a database or storage bucket containing product data, or immediately revoking a secret that grants access to resources is less than ideal. These kind of events can cause &lt;em&gt;frustrating&lt;/em&gt; production incidents.&lt;/p&gt;</description>
    </item>
    <item>
      <title>StackSets with Parameter Store for AWS Resource Access Manager Shares</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-ram-shares-and-stacksets/</link>
      <pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-ram-shares-and-stacksets/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When constructing infrastructure that is intended to be leveraged across multiple AWS Accounts, AWS supports &lt;a href=&#34;https://aws.amazon.com/ram/&#34;&gt;resource sharing&lt;/a&gt; through the resource access manager. This can be especially useful when working with &lt;a href=&#34;https://docs.aws.amazon.com/vpc/latest/userguide/managed-prefix-lists.html&#34;&gt;EC2 Prefix Lists&lt;/a&gt;, which allow sharing a group of CIDR blocks for security groups and route tables.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Empty CloudFormation Stacks using WaitConditionHandle</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-empty-template-stacks/</link>
      <pubDate>Wed, 12 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-empty-template-stacks/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;CloudFormation Templates have a requirement that at least one resource exists within the CloudFormation template, which prevents stacks from being created that contain only outputs. An alternative to creating a dummy resource like &lt;a href=&#34;https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html&#34;&gt;AWS::IAM::Role&lt;/a&gt; is to make use of &lt;code&gt;WaitConditionHandle&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes, CloudFormation and OIDC Magic Numbers</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-kubernetes-eks-and-oidc/</link>
      <pubDate>Tue, 11 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-kubernetes-eks-and-oidc/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Magic numbers in programming are numeric-or-other values that appear in code without any explanation of their meaning or any guidance on where they came from. A good example arises with Kubernetes and IAM OIDC identity providers. These provider ARNs look like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mirroring external containers images to internal registries</title>
      <link>https://writing.aeydr.dev/notes/container-registry-mirroring-to-internal-registry/</link>
      <pubDate>Mon, 10 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/container-registry-mirroring-to-internal-registry/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When working with container images from third-party registries (DockerHub, Quay, GitHub Container Registry), it can sometimes result in you failing to pull the container images. One such example of this error is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using empty CloudFormation Stacks to publish outputs for CloudFormation</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-using-outputs-from-terraform/</link>
      <pubDate>Sun, 09 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-using-outputs-from-terraform/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Terraform can be an excellent tool for provisioning infrastructure, as it supports cross-region &amp;amp; cross-account patterns which aren&amp;rsquo;t doable within CloudFormation without the use of Stacksets. This can present challenges when needing to expose outputs from this infrastructure to be consumable by CloudFormation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Conditions within CloudFormation Templates for property overrides</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-parameter-override-monad/</link>
      <pubDate>Sat, 08 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-parameter-override-monad/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;CloudFormation doesn&amp;rsquo;t support any mechanisms that allows for modifying individual properties of resources in a deployed stack within AWS, which is why in the case of hotfixes you&amp;rsquo;ll often see a CloudFormation Template modified using the CloudFormation Web Designer. This constraint is why you&amp;rsquo;ll often see CloudFormation Templates with blank parameters (or a constant like &lt;code&gt;None&lt;/code&gt;) for things like &lt;code&gt;(Min|Max)Size&lt;/code&gt;, &lt;code&gt;InstanceType&lt;/code&gt;, or naming parameters such as fully qualified domain names (FQDNs).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using CloudFormation Mappings to define preset resource reservations for rightsizing</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-preset-resource-reservations/</link>
      <pubDate>Fri, 07 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-preset-resource-reservations/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When developing within AWS (&amp;amp; the cloud in-general), it is often the case that multiple environments of an applications exist. This can be for the purpose of prototyping, staging environments for ensuring new changes are working as intended, or taking advantage of computing savings that can exist within other AWS Regions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using multiple Terraform AWS Providers for global infrastructure</title>
      <link>https://writing.aeydr.dev/notes/terraform-aws-and-globally-enabled-infrastructure/</link>
      <pubDate>Thu, 06 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-aws-and-globally-enabled-infrastructure/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Sometimes when working within Cloud you&amp;rsquo;ll have requirements to ensure data redundancy or operate services within specific geographic areas. When working with AWS, this will mean that you&amp;rsquo;ll need to provision resources within multiple AWS Regions. For applications, this can mean just deploying a lambda or machine within a certain region. For infrastructure, this can present challenges when the infrastructure needs to span across regions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Feature Flags within Terraform for conditional infrastructure</title>
      <link>https://writing.aeydr.dev/notes/terraform-pattern-with-feature-flags/</link>
      <pubDate>Wed, 05 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/terraform-pattern-with-feature-flags/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Resources within Terraform can be conditionally created but not by a toggle like &lt;code&gt;enabled&lt;/code&gt; or &lt;code&gt;disabled&lt;/code&gt;, but instead using the &lt;code&gt;count&lt;/code&gt; meta-argument. This argument takes in whole numbers (&lt;code&gt;&amp;gt;= 0&lt;/code&gt;) to determine how many of a given resource to create, and using a ternary operator you can convert a boolean to a integer for conditional resources:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using built-in CloudFormation macros to source AMI IDs by a friendly identifier</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-ami-ids-by-name-from-inventory/</link>
      <pubDate>Tue, 04 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-ami-ids-by-name-from-inventory/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;CloudFormation doesn&amp;rsquo;t support any look up mechanisms for Amazon Machine Images (AMIs), which is why you&amp;rsquo;ll often see AMIs for EC2s specified either as:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using built-in CloudFormation variables to generate unique resource names</title>
      <link>https://writing.aeydr.dev/notes/aws-cfn-unique-resource-names/</link>
      <pubDate>Sat, 17 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://writing.aeydr.dev/notes/aws-cfn-unique-resource-names/</guid>
      <description>&lt;h3 id=&#34;today-i-explained&#34; class=&#34;scroll-mt-8 group&#34;&gt;&#xA;  Today I Explained&#xA;  &#xA;    &lt;a href=&#34;#today-i-explained&#34;&#xA;        class=&#34;no-underline hidden opacity-50 hover:opacity-100 !text-inherit group-hover:inline-block&#34;&#xA;        aria-hidden=&#34;true&#34; title=&#34;Link to this heading&#34; tabindex=&#34;-1&#34;&gt;&#xA;        &lt;svg&#xA;  xmlns=&#34;http://www.w3.org/2000/svg&#34;&#xA;  width=&#34;16&#34;&#xA;  height=&#34;16&#34;&#xA;  fill=&#34;none&#34;&#xA;  stroke=&#34;currentColor&#34;&#xA;  stroke-linecap=&#34;round&#34;&#xA;  stroke-linejoin=&#34;round&#34;&#xA;  stroke-width=&#34;2&#34;&#xA;  class=&#34;lucide lucide-link w-4 h-4 block&#34;&#xA;  viewBox=&#34;0 0 24 24&#34;&#xA;&gt;&#xA;  &lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; /&gt;&#xA;  &lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; /&gt;&#xA;&lt;/svg&gt;&#xA;&#xA;    &lt;/a&gt;&#xA;  &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;When working within AWS, eventually you will encounter a service that needs unique names, and typically you learn this by an error message that sounds similar to:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
