<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bedrock on ferkakta.dev</title><link>https://ferkakta.dev/tags/bedrock/</link><description>Recent content in Bedrock on ferkakta.dev</description><generator>Hugo</generator><language>en-US</language><copyright>Copyright fizz.</copyright><lastBuildDate>Tue, 24 Mar 2026 21:00:00 -0600</lastBuildDate><atom:link href="https://ferkakta.dev/tags/bedrock/index.xml" rel="self" type="application/rss+xml"/><item><title>The Allow SCP that worked until it didn't</title><link>https://ferkakta.dev/scp-allow-overrides-notaction-deny/</link><pubDate>Tue, 24 Mar 2026 21:00:00 -0600</pubDate><guid>https://ferkakta.dev/scp-allow-overrides-notaction-deny/</guid><description>&lt;p&gt;I run a multi-tenant SaaS platform on AWS with Control Tower managing the organization. Control Tower deploys a region deny guardrail — an SCP that blocks API calls outside your home region. The mechanism is a &lt;code&gt;NotAction&lt;/code&gt; deny: it lists services that are allowed to operate globally (IAM, CloudFront, Route 53, a few dozen others), and denies everything else when &lt;code&gt;aws:RequestedRegion&lt;/code&gt; doesn&amp;rsquo;t match your approved list.&lt;/p&gt;
&lt;p&gt;This guardrail is one of the first things you hit when you try to do anything interesting. And the documentation says you can&amp;rsquo;t override a deny with an allow.&lt;/p&gt;</description></item><item><title>The $233 Day, Part 2: The Inference Iceberg</title><link>https://ferkakta.dev/233-dollar-day-part-2/</link><pubDate>Fri, 20 Mar 2026 17:00:00 -0500</pubDate><guid>https://ferkakta.dev/233-dollar-day-part-2/</guid><description>&lt;p&gt;I posted the part 1 findings to the team thread — model switch, cache invalidation, 20× call volume, $173 training run. Case closed. The numbers were clean, the explanation was satisfying, and the model got reverted within the hour.&lt;/p&gt;
&lt;p&gt;Except $173 was wrong. Not wrong in the analysis — the training run did cost that much. Wrong in scope. I&amp;rsquo;d found the visible part of the spend and stopped looking.&lt;/p&gt;</description></item><item><title>The $173 Training Run</title><link>https://ferkakta.dev/173-dollar-training-run/</link><pubDate>Fri, 20 Mar 2026 15:00:00 -0500</pubDate><guid>https://ferkakta.dev/173-dollar-training-run/</guid><description>&lt;p&gt;The Slack message landed at 3pm on a Wednesday: &amp;ldquo;model training successful, previously 20min, now 1h30m.&amp;rdquo; I had finished an EKS 1.32-to-1.33 upgrade on the ramparts cluster that morning. My upgrade, my timeline, my problem.&lt;/p&gt;
&lt;p&gt;The first theory wrote itself. New cluster version, fresh nodes, cold image caches. I&amp;rsquo;d fixed a broken cluster autoscaler earlier that day — the old autoscaler deployment was pinned to a node selector that no longer matched after the upgrade, so pods were stacking up in Pending until I caught it. First-run penalties after a major version bump are real. Everyone on the call nodded. I almost typed up that explanation and moved on.&lt;/p&gt;</description></item><item><title>Your employees are tenants and you should bill them like it</title><link>https://ferkakta.dev/employees-as-tenants/</link><pubDate>Mon, 16 Mar 2026 14:00:00 -0600</pubDate><guid>https://ferkakta.dev/employees-as-tenants/</guid><description>&lt;p&gt;I built a Lambda that enriches every Bedrock invocation with cost data and routes it to per-tenant CloudWatch log groups. Model ID, input tokens, output tokens, estimated cost in USD, all written to &lt;code&gt;/bedrock/tenants/{tenant}&lt;/code&gt; so each customer&amp;rsquo;s AI spend is visible in near-real-time.&lt;/p&gt;
&lt;p&gt;Then a developer on the team needed Bedrock access for local development, and I had a problem I hadn&amp;rsquo;t anticipated.&lt;/p&gt;
&lt;h2 id="the-invisible-burn"&gt;The invisible burn&lt;/h2&gt;
&lt;p&gt;The developer&amp;rsquo;s use case was reasonable. He was building features against the Bedrock API and needed to iterate against real models, not mocks. I created an SSO permission set with &lt;code&gt;bedrock:InvokeModel&lt;/code&gt; and handed him the profile name.&lt;/p&gt;</description></item></channel></rss>