<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aj</title>
    <description>The latest articles on DEV Community by Aj (@ajbuilds).</description>
    <link>https://dev.to/ajbuilds</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3825798%2F0d0f60ca-1b4d-4a45-bebb-8a365c4c2c97.png</url>
      <title>DEV Community: Aj</title>
      <link>https://dev.to/ajbuilds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajbuilds"/>
    <language>en</language>
    <item>
      <title>Anthropic just admitted Claude Code broke. Here's exactly what happened, what they fixed, and what it means for your workflows.</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Fri, 24 Apr 2026 13:16:41 +0000</pubDate>
      <link>https://dev.to/ajbuilds/anthropic-just-admitted-claude-code-broke-heres-exactly-what-happened-what-they-fixed-and-what-hnm</link>
      <guid>https://dev.to/ajbuilds/anthropic-just-admitted-claude-code-broke-heres-exactly-what-happened-what-they-fixed-and-what-hnm</guid>
      <description>&lt;p&gt;For the past several weeks, engineers using Claude Code have been filing complaints. Responses felt off. Reasoning felt shallower. Coding quality dropped noticeably from what they'd come to expect. Many assumed Anthropic had intentionally degraded the model — what the developer community calls "nerfing."&lt;/p&gt;

&lt;p&gt;Anthropic denied it. Then they proved they were right by publishing a full postmortem.&lt;/p&gt;

&lt;p&gt;On April 20, Anthropic confirmed: Claude Code's quality degraded. The underlying model was not changed. Three separate product-level changes caused the regression, each independently, stacking on top of each other. All three have now been fixed as of April 20 (v2.1.116).&lt;/p&gt;

&lt;p&gt;Here is exactly what broke, why it matters for production workflows, and what changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The three things that actually broke Claude Code
&lt;/h2&gt;

&lt;p&gt;Anthropic traced the complaints to three separate changes that affected Claude Code, the Claude Agent SDK, and Claude Cowork. The API was not impacted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue 1 — Reasoning effort silently dropped&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The default reasoning effort level was reduced at the product level. Engineers were getting shallower responses not because the model was less capable, but because it was being instructed to think less. This change made it past multiple human and automated code reviews, unit tests, end-to-end tests, automated verification, and internal dogfooding. It was subtle enough that even Anthropic's own internal processes didn't catch it immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Restored to higher default reasoning effort across Claude Code, Claude Agent SDK, and Claude Cowork.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue 2 — A caching bug silently dropped thinking history&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A bug in context management caused thinking history to be dropped during stale sessions. This was at the intersection of Claude Code's context management, the Anthropic API, and extended thinking. The regression only appeared in a specific corner case — stale sessions — which made it extremely difficult to reproduce and identify. It took over a week of investigation to confirm the root cause.&lt;/p&gt;

&lt;p&gt;The notable detail: Anthropic back-tested the offending pull requests using Opus 4.7. Opus 4.7 found the bug. Opus 4.6 did not. This is why Opus 4.7's improved code reasoning matters in practice — not just on benchmarks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Caching bug patched in v2.1.101 (April 10). Thinking history now correctly persists across sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue 3 — A verbosity prompt change hurt coding quality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude Opus 4.7 tends to be more verbose than its predecessor — a known behavioral difference noted at launch. To reduce verbosity, a prompt change was made. That change went too far and reduced coding quality alongside verbosity. The tradeoff was not caught before deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Verbosity prompt change reverted. Usage limits also reset for subscribers affected during the degraded period.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters beyond the immediate fix
&lt;/h2&gt;

&lt;p&gt;The three-bug postmortem is worth understanding for reasons that go beyond "Claude Code works again."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product-layer changes can silently degrade model quality.&lt;/strong&gt; The model never changed. What changed were instructions, caching behaviour, and prompting — all at the product layer sitting above the model. Engineers building production systems on Claude Code or the Claude API need to understand that model quality can degrade from sources they don't control and can't directly observe. This is not unique to Anthropic — it is a systemic property of building on top of hosted AI services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extended thinking sessions are sensitive to context management.&lt;/strong&gt; The caching bug only appeared in stale sessions with extended thinking enabled. Engineers using long-horizon agentic workflows — exactly the workflows that Claude Code and AgentCore are designed for — are most exposed to context management bugs. The fix is in, but the lesson is: if your long-running agentic workflow suddenly produces degraded output, context management is now a confirmed failure mode worth investigating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The verbosity-quality tradeoff is real and non-trivial.&lt;/strong&gt; Opus 4.7 is more verbose. The attempts to reduce that verbosity damaged coding quality. This means engineers running Opus 4.7 in production who are trying to manage output length through prompt changes need to be careful — the model's verbosity is partially load-bearing. Reducing it through aggressive prompt constraints may reduce quality alongside token count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opus 4.7 found the bug that Opus 4.6 missed.&lt;/strong&gt; This is the understated line in the postmortem. When Anthropic used Opus 4.7 to code review the PR that introduced the caching bug, Opus 4.7 caught it. Opus 4.6 didn't. For engineers evaluating whether to migrate to Opus 4.7, this is concrete evidence of improved code reasoning beyond benchmark scores.&lt;/p&gt;




&lt;h2&gt;
  
  
  What changed in Claude Code v2.1.116
&lt;/h2&gt;

&lt;p&gt;The April 20 release that contains all three fixes also ships additional stability improvements. From the release notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed connecting to a remote session overwriting local model settings in &lt;code&gt;~/.claude/settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fixed typeahead showing "No commands match" error when pasting file paths starting with &lt;code&gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fixed plugin reinstall not resolving dependencies at the wrong version&lt;/li&gt;
&lt;li&gt;Fixed unhandled errors from file watcher on invalid paths or file descriptor exhaustion&lt;/li&gt;
&lt;li&gt;Fixed Remote Control sessions getting archived on transient CCR initialization during JWT refresh&lt;/li&gt;
&lt;li&gt;Fixed subagents resumed via SendMessage not restoring the explicit &lt;code&gt;cwd&lt;/code&gt; they were spawned with&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;/loop&lt;/code&gt; workflow improvements and Remote Control session stability fixes are particularly relevant for engineers running Claude Code in long-horizon agentic workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Also this week: Anthropic Managed Agents launched
&lt;/h2&gt;

&lt;p&gt;Separately from the Claude Code fix, Anthropic launched Managed Agents — a hosted Claude Platform service specifically designed for long-horizon agent work.&lt;/p&gt;

&lt;p&gt;The key design principle behind Managed Agents: harnesses encode assumptions about what Claude cannot do on its own. Those assumptions go stale as models improve. A concrete example from Anthropic's own engineering work: Claude Sonnet 4.5 would terminate tasks prematurely as it detected its context limit approaching — a behaviour Anthropic calls "context anxiety." The harness added context resets to compensate. With a better model, that compensation may no longer be needed — or may actively limit performance.&lt;/p&gt;

&lt;p&gt;Managed Agents provides stable interfaces for sessions, harnesses, and sandboxes specifically so that as model capabilities improve, the harness can be updated without rebuilding the entire agent infrastructure.&lt;/p&gt;

&lt;p&gt;What Managed Agents provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Durable state&lt;/strong&gt; across long-horizon tasks — the agent does not lose context mid-workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safer tool access&lt;/strong&gt; — tool permissions managed at the infrastructure level, outside the agent's reasoning loop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster startup&lt;/strong&gt; for reliable long-running tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory in public beta&lt;/strong&gt; — persistent memory across sessions using the &lt;code&gt;managed-agents-2026-04-01&lt;/code&gt; header&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the infrastructure layer for production agentic systems — not a demo environment. The stable session interfaces and tool safety boundaries are exactly what the YOLO attack postmortem called for: controls applied outside the model's reasoning loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this means for Claude Code workflows right now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you are running Claude Code in CI/CD pipelines:&lt;/strong&gt; Update to v2.1.116. The stale session caching bug could affect any pipeline step that reuses a session across extended runs. The &lt;code&gt;-p&lt;/code&gt;/&lt;code&gt;--print&lt;/code&gt; non-interactive mode is not affected (the API layer was not impacted), but session-based workflows should be validated post-update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are using extended thinking with Claude Code:&lt;/strong&gt; Verify that thinking history is persisting correctly after the update. The caching bug was specifically in the intersection of extended thinking and session management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are running Opus 4.7:&lt;/strong&gt; Do not add aggressive verbosity constraints to your prompts. The postmortem confirms that reducing verbosity through prompt changes damages coding quality. If output length is a concern, use max_tokens to cap output length rather than prompting the model to be less verbose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are building multi-agent systems:&lt;/strong&gt; Look at Managed Agents for long-horizon workflows. The stable session and harness interfaces are a meaningful improvement over managing session lifecycle yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The CLAUDE.md angle
&lt;/h2&gt;

&lt;p&gt;The Claude Code quality regression is a direct argument for understanding CLAUDE.md configuration at depth. The three issues that caused the regression — reasoning effort, context management, and verbosity — are all areas where CLAUDE.md configuration directly affects agent behaviour.&lt;/p&gt;

&lt;p&gt;Engineers who understand how CLAUDE.md hierarchy composes (global → project → directory), how to configure reasoning effort for specific tasks, and how to structure prompts that don't accidentally trade quality for length are more resilient to this class of regression. They notice degradation faster, diagnose it more accurately, and adapt their configuration rather than waiting for a patch.&lt;/p&gt;

&lt;p&gt;This is Domain 3 of the CCA-001 Claude Certified Architect certification — Claude Code Configuration and Workflows. The exam specifically tests whether you understand how configuration decisions at the CLAUDE.md level affect agent behaviour in production. The regression Anthropic just documented is a real-world exam question.&lt;/p&gt;

&lt;p&gt;The Cloud Edventures CCA-001 track includes the Navigator's Compass path — hands-on missions covering CLAUDE.md configuration, slash commands, plan-execute pipelines, and CI/CD integration with Claude Code in real AWS environments with automated validation.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com/labs/track/claude-certified-architect-cca-001" rel="noopener noreferrer"&gt;cloudedventures.com/labs/track/claude-certified-architect-cca-001&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you noticed the improvement since v2.1.116? What changed in your workflows? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>cloudcomputing</category>
      <category>career</category>
    </item>
    <item>
      <title>Stanford's 2026 AI Index just dropped. Junior developer employment is down 20%. Here's what the data actually says.</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:05:53 +0000</pubDate>
      <link>https://dev.to/ajbuilds/stanfords-2026-ai-index-just-dropped-junior-developer-employment-is-down-20-heres-what-the-36ba</link>
      <guid>https://dev.to/ajbuilds/stanfords-2026-ai-index-just-dropped-junior-developer-employment-is-down-20-heres-what-the-36ba</guid>
      <description>&lt;p&gt;The Stanford Institute for Human-Centered AI released its 2026 AI Index today. It is the most comprehensive annual measurement of where AI actually stands — not where the press releases say it stands.&lt;/p&gt;

&lt;p&gt;One number is going to dominate headlines for the next week.&lt;/p&gt;

&lt;p&gt;Employment among software developers aged 22 to 25 has fallen nearly 20% since 2024, even as their older colleagues' headcount continues to grow.&lt;/p&gt;

&lt;p&gt;Before you panic or dismiss this, it's worth understanding what the data actually says, what it doesn't say, and what the engineers who are not in that declining cohort are doing differently.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Stanford AI Index actually found
&lt;/h2&gt;

&lt;p&gt;The report is 500+ pages. Here is what matters for engineers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The junior developer employment cliff is real.&lt;/strong&gt; The 20% decline in employment for developers aged 22-25 is not anecdotal. It is measured across employers and cross-referenced against broader macroeconomic conditions. The report acknowledges that AI may not be the sole cause — macroeconomic factors play a role — but notes that AI appears to be a significant contributing factor, and that the pattern repeats in other high-AI-exposure roles like customer service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI is boosting productivity by 26% in software development.&lt;/strong&gt; This is the other side of the same coin. The reason fewer junior developers are being hired is not that software is being written less — it is that each senior developer is producing substantially more. A team of five senior engineers with AI tools is now doing what previously required a team of eight, with the eight including three junior developers. The elimination is at the entry level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI adoption has hit 53% of the global population in three years.&lt;/strong&gt; Faster than the personal computer. Faster than the internet. The estimated value of generative AI tools to US consumers alone reached $172 billion annually by early 2026, with the median value per user tripling between 2025 and 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A third of organizations expect AI to shrink their workforce in the coming year.&lt;/strong&gt; The McKinsey survey cited in the report shows planned headcount reductions concentrated in service, supply chain, and software engineering. This is forward-looking, not historical — it is what employers are planning to do next, not what they have already done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic leads global model rankings as of March 2026.&lt;/strong&gt; The report uses community-driven Arena rankings where users compare models on identical prompts. Anthropic's top model leads by 2.7% over the nearest competitor. US and Chinese models have traded places at the top multiple times since early 2025.&lt;/p&gt;




&lt;h2&gt;
  
  
  The actual pattern — who is declining vs who is growing
&lt;/h2&gt;

&lt;p&gt;The 20% number is not distributed evenly. The Stanford data is specific: it is developers aged 22-25. Their older colleagues — developers in their 30s and 40s — are seeing headcount grow.&lt;/p&gt;

&lt;p&gt;This reveals the mechanism. AI is not replacing software engineering as a discipline. It is replacing the specific tasks that junior developers were hired to do: boilerplate code, basic CRUD operations, scripted testing, routine data processing, straightforward bug fixes.&lt;/p&gt;

&lt;p&gt;Senior engineers use AI to do those tasks themselves, without handing off to a junior. The junior developer role — which historically served as the entry point where developers built experience doing those tasks — is being compressed.&lt;/p&gt;

&lt;p&gt;The implication is uncomfortable: the traditional path into software engineering is narrowing precisely at the moment when AI is making senior engineers more productive. You cannot become senior without first being junior. But the junior roles are disappearing.&lt;/p&gt;

&lt;p&gt;This is not unsolvable. It means the path has changed, not closed. But the path that worked five years ago — get hired as a junior, learn on the job, progress — is significantly harder now.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the engineers who are not declining are doing
&lt;/h2&gt;

&lt;p&gt;The headcount growth is in specific areas. From the Stanford data and the broader job market pattern:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure and platform engineering.&lt;/strong&gt; The engineers who build and maintain the systems that AI runs on. Lambda functions, Bedrock agents, SageMaker pipelines, ECS clusters, Kubernetes. These are not roles AI is replacing — they are roles AI is creating demand for. Every agentic AI system deployed needs cloud infrastructure underneath it. As deployment accelerates, demand for infrastructure engineers accelerates with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ML engineering and MLOps.&lt;/strong&gt; Building, training, evaluating, and maintaining machine learning models in production. SageMaker Pipelines, Model Monitor, Bedrock model deployment, real-time inference optimisation. The AWS ML Engineer Associate (MLA-C01) certification maps directly to this job category. It is one of the fastest-growing roles in the market.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI systems architecture.&lt;/strong&gt; Designing multi-agent systems, tool schemas, MCP server integrations, Bedrock Guardrails policies, AgentCore deployments. The engineers who understand how to architect AI systems — not just use them — are on the growing side of the employment curve. This is what the Claude Certified Architect (CCA-001) certification tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security engineering for AI systems.&lt;/strong&gt; As AI agents handle more sensitive operations — accessing databases, processing financial data, making decisions with real consequences — the engineers who understand IAM least privilege, Bedrock Guardrails, and agentic security patterns are in growing demand. The YOLO attack research published this month confirms the attack surface is expanding faster than the defensive architecture being deployed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System design at senior level.&lt;/strong&gt; The engineers who can design distributed systems that handle 100K requests per second, design fault-tolerant architectures, architect data-intensive systems for real-time processing — these engineers are not being replaced by AI. AI cannot sit in the architecture review and make tradeoff decisions based on organisational context, cost constraints, and team capability.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest assessment
&lt;/h2&gt;

&lt;p&gt;The Stanford Index's finding about junior developer employment is not a reason to leave software engineering. It is a reason to be specific about which skills you are building.&lt;/p&gt;

&lt;p&gt;The error is treating "software engineer" as a single category when the employment data clearly shows it is splitting into two trajectories.&lt;/p&gt;

&lt;p&gt;Below the line: tasks that AI can do at $0.10 per hour — routine code generation, basic configuration, scripted testing, standard CRUD. Employment in this layer is declining because AI is replacing the tasks, not necessarily the title.&lt;/p&gt;

&lt;p&gt;Above the line: system design judgment, cloud infrastructure for AI workloads, security architecture for agentic systems, ML operations, multi-agent orchestration. Employment in this layer is growing because every AI system deployed creates more demand for it.&lt;/p&gt;

&lt;p&gt;The question is not "will AI take my job." The question is "which side of the line are my current skills on, and am I moving toward the growing side or the declining side."&lt;/p&gt;




&lt;h2&gt;
  
  
  The certification signal
&lt;/h2&gt;

&lt;p&gt;The Stanford data has a specific implication for certification strategy.&lt;/p&gt;

&lt;p&gt;Certifications that test whether you know API parameter names or can recall service feature lists are in the declining category. AI can answer those questions better than most humans.&lt;/p&gt;

&lt;p&gt;Certifications that test production architecture judgment — whether you can design a multi-agent system that handles failures correctly, implement IAM policies that correctly scope access, build a SageMaker pipeline that doesn't silently fail at 3am — are in the growing category.&lt;/p&gt;

&lt;p&gt;Two certifications that directly correspond to the growing side of the employment data:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS ML Engineer Associate (MLA-C01)&lt;/strong&gt; — tests hands-on competency with SageMaker, Bedrock, Kinesis, Glue, Athena, and MLOps practices. Maps directly to the ML engineering and MLOps roles where headcount is growing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Certified Architect CCA-001&lt;/strong&gt; — tests production architecture judgment for agentic AI systems. Multi-agent orchestration, MCP server design, Bedrock Guardrails, tool schema engineering. The only certification that validates the exact skills required to architect the AI systems that are replacing junior developer tasks.&lt;/p&gt;

&lt;p&gt;Both require demonstrable hands-on competency in real AWS environments. Both test judgment that AI cannot replicate. Both correspond to roles where the Stanford data shows employment growing, not declining.&lt;/p&gt;

&lt;p&gt;The hands-on lab preparation for both — in real isolated AWS Bedrock sandboxes, with automated validation, no personal AWS account required — is what the MLA-C01 and CCA-001 tracks on Cloud Edventures provide.&lt;/p&gt;

&lt;p&gt;The engineers who will not be in the declining cohort in next year's Stanford Index are the ones building depth in infrastructure, ML operations, and AI systems architecture right now, while the scarcity premium on those skills still exists.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com" rel="noopener noreferrer"&gt;cloudedventures.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The Stanford 2026 AI Index is worth reading in full — all 500+ pages are available at aiindex.stanford.edu. Which finding hit you hardest? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>webdev</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Claude Opus 4.7 is on Bedrock. Amazon just bet $25 billion it's the future. Here's what engineers need to know.</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Tue, 21 Apr 2026 11:20:53 +0000</pubDate>
      <link>https://dev.to/ajbuilds/claude-opus-47-is-on-bedrock-amazon-just-bet-25-billion-its-the-future-heres-what-engineers-4ec8</link>
      <guid>https://dev.to/ajbuilds/claude-opus-47-is-on-bedrock-amazon-just-bet-25-billion-its-the-future-heres-what-engineers-4ec8</guid>
      <description>&lt;p&gt;Two things happened this week that belong in the same sentence.&lt;/p&gt;

&lt;p&gt;On April 16, AWS added Claude Opus 4.7 to Amazon Bedrock — Anthropic's most capable publicly available model, with 87.6% on SWE-bench Verified and 69.4% on Terminal-Bench 2.0. Then on April 20, Amazon announced it would invest up to an additional $25 billion in Anthropic, on top of the $8 billion it had already committed — with Anthropic pledging to spend more than $100 billion on AWS technologies over the next ten years.&lt;/p&gt;

&lt;p&gt;This is not routine model news. This is the largest corporate AI infrastructure bet in history, coinciding with a model release that changes what's possible in production agentic systems.&lt;/p&gt;

&lt;p&gt;If you build on AWS and use Claude, both of these developments affect your architecture immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Claude Opus 4.7 actually changes
&lt;/h2&gt;

&lt;p&gt;Claude Opus 4.7 is Anthropic's most intelligent Opus model for advancing performance across coding, long-running agents, and professional work, powered by Amazon Bedrock's next-generation inference engine.&lt;/p&gt;

&lt;p&gt;The numbers are real. The model records 64.3% on SWE-bench Pro, 87.6% on SWE-bench Verified, and 69.4% on Terminal-Bench 2.0. These are not marketing benchmarks — SWE-bench Verified tests whether an AI model can actually resolve real GitHub issues in production software repositories. 87.6% means Opus 4.7 successfully resolves nearly 9 in 10 real software engineering tasks it is given.&lt;/p&gt;

&lt;p&gt;But the headline numbers matter less than the operational changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adaptive thinking.&lt;/strong&gt; The model runs on Bedrock's next-generation inference engine with dynamic capacity allocation, adaptive thinking — letting Claude allocate thinking token budgets based on request complexity — and the full 1M token context window. This is significant. Previous models required you to set a fixed thinking token budget. Opus 4.7 decides how much reasoning the task actually requires and allocates accordingly. Simple tasks use fewer tokens. Complex reasoning tasks use more. Your costs align with actual complexity rather than a fixed overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long-running agent stability.&lt;/strong&gt; The area where Opus 4.7 matters most for production teams is not raw benchmark scores — it is sustained performance over long autonomous runs. Agentic workflows that require 50, 100, or 200+ sequential tool calls have historically degraded in quality as context accumulated. Opus 4.7 was specifically trained to stay on track over longer horizons. For engineers building multi-agent systems, orchestration workflows, or coding agents that run for hours — this is the change that directly affects production quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The migration is not a drop-in swap.&lt;/strong&gt; This is the part most articles skip. Starting with Claude Opus 4.7, temperature, top_p, and top_k parameters are no longer supported. The recommended migration path is to omit these parameters entirely from your requests and use prompting to guide the model's behavior. If your production code passes &lt;code&gt;temperature=0&lt;/code&gt; expecting deterministic outputs, it will not work with Opus 4.7. AWS explicitly flags that teams may need prompt changes and evaluation harness tweaks. Treat this as a migration, test against your specific workloads, and don't assume existing prompts will produce identical results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero operator data access.&lt;/strong&gt; The model provides zero operator access — meaning customer prompts and responses are never visible to Anthropic or AWS operators — keeping sensitive data private. For regulated industries and enterprise deployments, this is the governance requirement that clears the path to production. Your inference runs in hardware-isolated Nitro enclaves with strict separation between hosting and logging systems. FedRAMP High compatible.&lt;/p&gt;




&lt;h2&gt;
  
  
  The $25 billion bet — what it actually means
&lt;/h2&gt;

&lt;p&gt;The dollar figure is staggering. Amazon has agreed to invest up to $25 billion in Anthropic, on top of the $8 billion it has already committed, as part of an expanded agreement to build out AI infrastructure. Anthropic committed to spending more than $100 billion on AWS technologies over the next ten years, including Trainium — Amazon's custom AI chips.&lt;/p&gt;

&lt;p&gt;To understand what this means, you need to understand why Anthropic is doing it.&lt;/p&gt;

&lt;p&gt;Anthropic said enterprise and developer demand for Claude, as well as a "sharp rise" in consumer usage, has led to "inevitable strain" on its infrastructure that has impacted its reliability and performance.&lt;/p&gt;

&lt;p&gt;This is Anthropic publicly acknowledging that Claude is capacity-constrained. The model is in higher demand than the infrastructure can currently serve. The $25 billion is not speculative investment — it is Anthropic buying the compute to keep up with demand it already has.&lt;/p&gt;

&lt;p&gt;"Our users tell us Claude is increasingly essential to how they work, and we need to build the infrastructure to keep pace with rapidly growing demand," Anthropic CEO Dario Amodei said. "Our collaboration with Amazon will allow us to continue advancing AI research while delivering Claude to our customers, including the more than 100,000 building on AWS."&lt;/p&gt;

&lt;p&gt;100,000 customers building on AWS with Claude. That number has more than tripled in under two years. The deal is the infrastructure response to adoption that already happened, not a bet on adoption that might happen.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this means for the architecture stack
&lt;/h2&gt;

&lt;p&gt;Three specific implications for engineers building on Bedrock today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bedrock is where Claude's most capable models live first.&lt;/strong&gt; Claude Opus 4.7 launched on Bedrock. Claude Mythos launched exclusively on Bedrock. The pattern is consistent: Anthropic's most advanced and most restricted models enter production through AWS first. If you're building systems that need access to frontier models under enterprise governance, Bedrock is not one option among several — it is the path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The inference engine upgrade matters for production scale.&lt;/strong&gt; The new Bedrock inference engine uses updated scheduling and scaling logic. Instead of hard throttling during demand spikes, it queues requests with dynamic capacity allocation. For teams running agentic workflows with bursty, unpredictable request patterns, this changes the failure mode from "hard 503 errors" to "slight latency increase under load." That is a significant improvement in production reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Anthropic-AWS relationship is now a decade-long structural commitment.&lt;/strong&gt; $100 billion in AWS compute over ten years is not a partnership that gets reconsidered at the next annual review. Anthropic has committed its model training and serving infrastructure to AWS Trainium and Bedrock through 2036. Engineers betting their production AI stack on Bedrock are betting on a platform with a committed ten-year runway, not a quarter-to-quarter cloud deal.&lt;/p&gt;




&lt;h2&gt;
  
  
  The migration checklist for Opus 4.7
&lt;/h2&gt;

&lt;p&gt;If you're running Opus 4.6 in production and considering upgrading:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Remove temperature, top_p, top_k from all API calls.&lt;/strong&gt; These parameters are no longer supported. Passing them will cause errors. Remove them and adjust model behaviour through prompting instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Budget for higher token usage.&lt;/strong&gt; Opus 4.7 uses approximately 1.0x to 1.35x more output tokens than Opus 4.6 depending on content type and reasoning load. Adaptive thinking means complex requests will use more tokens than before. Reprice your cost models before switching production traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Test your eval harness explicitly.&lt;/strong&gt; Don't assume benchmark improvements translate directly to your specific use case. Run your existing evaluation suite against Opus 4.7 before migrating any production traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Use the new model ID.&lt;/strong&gt; Model ID: &lt;code&gt;anthropic.claude-opus-4-7&lt;/code&gt;. Available via the Anthropic Messages API, the Converse API, Invoke API, AWS SDK, and CLI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — Check your region.&lt;/strong&gt; Claude Opus 4.7 is available at launch in US East (N. Virginia), Asia Pacific (Tokyo), Europe (Ireland), and Europe (Stockholm), with up to 10,000 requests per minute per account per region. If your production workload runs in another region, verify availability before migrating.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python — Anthropic SDK via Bedrock Mantle
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AnthropicBedrockMantle&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AnthropicBedrockMantle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aws_region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Design a distributed architecture for 100k RPS across 3 AWS regions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python — boto3 via bedrock-runtime
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock-runtime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;converse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;modelId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Design a fault-tolerant SQS consumer with DLQ and CloudWatch alerting.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why the CCA-001 certification matters more now than it did last month
&lt;/h2&gt;

&lt;p&gt;The $25 billion commitment has a specific implication for engineers holding or pursuing the Claude Certified Architect certification.&lt;/p&gt;

&lt;p&gt;When Anthropic and AWS commit a combined $125 billion to the Claude-on-Bedrock stack over the next decade, they are signalling the longevity of that architecture. Engineers building expertise in Bedrock Guardrails, AgentCore Policy, MCP server design, and multi-agent orchestration on Claude are building expertise in infrastructure that has a ten-year committed runway.&lt;/p&gt;

&lt;p&gt;Certifications in deprecated or transitional technology depreciate. Certifications in infrastructure with that level of committed backing appreciate.&lt;/p&gt;

&lt;p&gt;The CCA-001 Claude Certified Architect certification covers the exact architecture stack that Opus 4.7 operates within — agentic loops, tool design, multi-agent orchestration, Bedrock Guardrails, context management for long-running tasks. All of these domains become more important as Opus 4.7 makes longer autonomous runs more reliable and more common.&lt;/p&gt;

&lt;p&gt;The hands-on lab preparation for the CCA-001 — 22 missions in real AWS Bedrock sandboxes, covering all five exam domains with automated validation — is what the Cloud Edventures CCA-001 track provides. As of today, you can run those labs against the same Bedrock infrastructure that now hosts Opus 4.7.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com/labs/track/claude-certified-architect-cca-001" rel="noopener noreferrer"&gt;cloudedventures.com/labs/track/claude-certified-architect-cca-001&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Are you migrating from Opus 4.6 to 4.7 in production? What's your eval harness showing? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>anthropic</category>
      <category>cloud</category>
    </item>
    <item>
      <title>The YOLO Attack: how hackers are hijacking AI agents by flipping one switch</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Mon, 20 Apr 2026 12:31:19 +0000</pubDate>
      <link>https://dev.to/ajbuilds/the-yolo-attack-how-hackers-are-hijacking-ai-agents-by-flipping-one-switch-1fmh</link>
      <guid>https://dev.to/ajbuilds/the-yolo-attack-how-hackers-are-hijacking-ai-agents-by-flipping-one-switch-1fmh</guid>
      <description>&lt;p&gt;There is a mode in AI coding agents called YOLO mode.&lt;/p&gt;

&lt;p&gt;The name was coined by security researcher Johann Rehberger. It refers to a single configuration state where an agent approves every tool call automatically — no user confirmation required. The agent just runs. Whatever it is asked to do, it does.&lt;/p&gt;

&lt;p&gt;YOLO mode exists because it is genuinely useful. When you trust the environment and want maximum throughput, stopping to approve every tool call is friction. So developers turn it on.&lt;/p&gt;

&lt;p&gt;Attackers have noticed.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the YOLO Attack actually is
&lt;/h2&gt;

&lt;p&gt;The exploit is deceptively simple. Here is the sequence Rehberger demonstrated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An attacker embeds a malicious prompt somewhere the agent will encounter it — a web page it browses, a GitHub issue it reads, a code comment it processes, a document it summarises&lt;/li&gt;
&lt;li&gt;The injected prompt contains one instruction: enable YOLO mode (auto-approve all tools)&lt;/li&gt;
&lt;li&gt;The agent follows the instruction — because it cannot distinguish between data it is processing and instructions it should execute&lt;/li&gt;
&lt;li&gt;The attacker's second instruction then runs arbitrary commands: open a terminal, delete files, exfiltrate credentials, install software, make network requests&lt;/li&gt;
&lt;li&gt;All of it executes without any user prompt, because the user confirmation gate has been disabled by the injected content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not a theoretical demonstration. The complete exploitation chain was documented against GitHub Copilot: an attacker embeds prompt injection in public repository code comments, the victim opens the repository with Copilot active, the injected prompt instructs Copilot to modify &lt;code&gt;.vscode/settings.json&lt;/code&gt; enabling YOLO mode, subsequent commands execute without user approval, and the attacker achieves arbitrary code execution.&lt;/p&gt;

&lt;p&gt;The vulnerability is not in the AI model. The vulnerability is in the architecture. An agent operating with broad tool access and an auto-approve mode has no mechanism to verify whether the instruction to enable that mode came from its legitimate user or from adversarial content in something it was asked to read.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this is getting worse, not better
&lt;/h2&gt;

&lt;p&gt;The attack surface for YOLO-style exploits is expanding on three fronts simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents are getting more autonomous.&lt;/strong&gt; The entire direction of AI development in 2026 is toward less human intervention in the loop. Agentic AI that stops to ask for permission on every action is considered poorly designed. AWS AgentCore, Claude Code, and every major AI development framework is pushing toward longer autonomous runs, more tool calls per session, and higher trust levels. YOLO mode is not a bug — it is a design goal. Which means the attack surface is growing by intention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP has created a new trust boundary.&lt;/strong&gt; The Model Context Protocol introduces a trust boundary between LLM agents and external tools. A malicious MCP server receives tool-call requests in plaintext and can return forged results, so the same manipulation and collection techniques transfer with adaptation to the MCP message format. Every MCP server your agent connects to is a potential injection point. The agent trusts that the MCP server is returning legitimate tool results. A compromised or malicious MCP server can return results that contain injection payloads — which the agent processes as instructions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third-party routers are an unexamined attack surface.&lt;/strong&gt; API routers — used as intermediaries between agents and model APIs — drop TLS sessions and have access to all plaintext data, including API keys and credentials being transferred between the agent and the models. Among a corpus of free routers, 8 inject malicious code into returned tool calls, and 2 deploy adaptive evasion — waiting for 50 prior calls before activating, or restricting payload delivery to autonomous YOLO mode sessions. Developers use third-party LLM routers routinely. Most have never considered that the router sits at a trust boundary capable of rewriting tool call responses in transit.&lt;/p&gt;




&lt;h2&gt;
  
  
  The structural problem no one wants to say out loud
&lt;/h2&gt;

&lt;p&gt;LLMs cannot distinguish between data and instructions. This is not a failure of current models that future models will fix. It is a property of how transformer-based language models work. The model processes all input as tokens. Whether those tokens represent "the text you were asked to summarise" or "a new instruction superseding your previous ones" — to the model, they are both sequences of tokens.&lt;/p&gt;

&lt;p&gt;Every defence against prompt injection — system prompt hardening, output filtering, input sanitisation — reduces the attack surface. None of them eliminate it. As of mid-2026, prompt injection continues to be ranked number one in the OWASP LLM Top 10, and complete prevention remains elusive due to the probabilistic nature of LLMs, necessitating defence-in-depth strategies combining technical controls and human awareness training.&lt;/p&gt;

&lt;p&gt;The implication: security for AI agents cannot be achieved by making the model smarter. It must be achieved by the architecture surrounding the model — the policies, gates, and controls that operate outside the model's reasoning loop.&lt;/p&gt;

&lt;p&gt;This is precisely why Bedrock Guardrails, AgentCore Policy, and IAM least-privilege matter as architectural decisions, not as optional hardening steps. If you are building agents that call tools, the question is not whether to implement these controls. The question is whether you understand them well enough to implement them correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What YOLO mode looks like in your architecture
&lt;/h2&gt;

&lt;p&gt;If you are building AI agents — with Claude Code, Bedrock AgentCore, LangGraph, CrewAI, or any framework — your architecture either has explicit controls on tool approval, or it effectively has YOLO mode enabled by default.&lt;/p&gt;

&lt;p&gt;The questions that determine your exposure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who can enable auto-approve in your agent?&lt;/strong&gt; Is YOLO mode (or equivalent) gated by an IAM policy, a runtime configuration, or just a developer preference that any injected prompt could override?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is your agent reading?&lt;/strong&gt; Every external data source an agent processes — web pages, documents, database records, code files, API responses — is a potential injection vector. The attack surface is as wide as the agent's data access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What tools does your agent have access to?&lt;/strong&gt; An agent that can only read an S3 bucket and write to a DynamoDB table has a bounded blast radius when compromised. An agent with file system access, network access, and the ability to spawn processes does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when your MCP server returns unexpected content?&lt;/strong&gt; Does your agent validate MCP tool results before acting on them? Does it have a policy that prevents certain tool calls regardless of what the MCP server requests?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you using third-party LLM routers?&lt;/strong&gt; If so — do you know whether those routers can inspect or modify the tool call responses your agent receives?&lt;/p&gt;




&lt;h2&gt;
  
  
  The defence architecture
&lt;/h2&gt;

&lt;p&gt;The research community has converged on three complementary controls that meaningfully reduce the YOLO attack surface without eliminating agent autonomy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fail-closed policy gates&lt;/strong&gt; — explicit allow-lists of tool calls that can execute without user confirmation, with everything else defaulting to denied. This is what AgentCore Policy implements: policies applied outside the agent's reasoning loop, at the tool call intercept point, so the agent cannot instruct its way around them. Even if injection succeeds and YOLO mode is "enabled" within the model's reasoning, the policy gate at the infrastructure layer still applies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response-side anomaly screening&lt;/strong&gt; — examining tool call responses for content that looks like instructions before returning them to the agent. Flags when an MCP tool result contains language patterns that suggest injection rather than legitimate data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Append-only transparency logging&lt;/strong&gt; — immutable logs of every tool call the agent made, what it received, and what it did next. When an incident occurs, the audit trail exists. CloudTrail with Bedrock inference logging provides this at the infrastructure level when configured correctly.&lt;/p&gt;

&lt;p&gt;The layered model: IAM restricts what tools the agent can access at all. AgentCore Policy restricts what tool calls execute without confirmation. Guardrails filter model inputs and outputs for harmful patterns. CloudTrail logs every action. This is defence-in-depth — not because any single layer is sufficient, but because attackers who bypass one layer still hit the next.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this means for AI engineers right now
&lt;/h2&gt;

&lt;p&gt;The YOLO attack is not a niche security concern. It is the default failure mode of agentic AI built without explicit security architecture.&lt;/p&gt;

&lt;p&gt;As the ecosystem moves toward longer autonomous runs, more MCP integrations, and higher trust levels — every AI engineer building agents needs to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why the architecture surrounding the model matters as much as the model itself&lt;/li&gt;
&lt;li&gt;How to design tool schemas and tool approval gates that limit blast radius&lt;/li&gt;
&lt;li&gt;How to configure Bedrock Guardrails and AgentCore Policy to enforce controls outside the reasoning loop&lt;/li&gt;
&lt;li&gt;How to use IAM least privilege to constrain what any single agent can actually touch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not advanced security concepts. They are foundational architecture decisions for anyone building production AI systems in 2026.&lt;/p&gt;

&lt;p&gt;The MCP server on AWS Lambda lab in StackHawks Pro covers exactly how MCP trust boundaries work — what the server can see, what it can return, and where the security boundary sits. The CCA-001 Claude Certified Architect track covers Bedrock Guardrails and AgentCore Policy in depth — not as theory but as hands-on lab missions in real Bedrock sandbox environments.&lt;/p&gt;

&lt;p&gt;The Security and Resilience path in Blueprint Bay takes this further: hands-on system design challenges covering zero-trust architecture, GuardDuty integration, and production incident response — including scenarios that mirror exactly the class of attack the YOLO exploit represents.&lt;/p&gt;

&lt;p&gt;Understanding the attack is step one. Being able to architect the defence is what the certification tests.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com" rel="noopener noreferrer"&gt;cloudedventures.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What tool approval controls are you using in your agent architecture right now? Drop it in the comments — this conversation is worth having.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>CCA-001 study guide: how to pass the Claude Certified Architect exam in 2026</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:10:18 +0000</pubDate>
      <link>https://dev.to/ajbuilds/cca-001-study-guide-how-to-pass-the-claude-certified-architect-exam-in-2026-h7p</link>
      <guid>https://dev.to/ajbuilds/cca-001-study-guide-how-to-pass-the-claude-certified-architect-exam-in-2026-h7p</guid>
      <description>&lt;p&gt;The Claude Certified Architect Foundations (CCA-001) is Anthropic's first official technical certification. Launched March 12, 2026, it tests whether you can actually build production AI systems with Claude — not whether you can answer trivia about API parameters.&lt;/p&gt;

&lt;p&gt;This is the study guide I wish existed when I started preparing for it.&lt;/p&gt;

&lt;p&gt;It covers the exact exam structure, all five domains with their weightings, the six production scenarios, the concepts that trip most candidates, and the hands-on preparation path that actually works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the CCA-001 exam tests
&lt;/h2&gt;

&lt;p&gt;The exam is 60 questions, 120 minutes, proctored. Passing score is 720 on a scaled 100–1,000 range. Cost: $99, available through the Anthropic Claude Partner Network.&lt;/p&gt;

&lt;p&gt;The most important thing to understand upfront: every question is anchored to a production scenario. You are not asked "what is an agentic loop?" — you are placed in a specific system design situation and asked which architectural decision is correct, which failure mode you're facing, or which implementation pattern will hold in production.&lt;/p&gt;

&lt;p&gt;Candidates who have only read documentation fail because the distractors are genuinely tempting if you have surface-level knowledge. The correct answers consistently point toward real engineering judgment — the kind that only develops from having actually built and broken agentic systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  The five exam domains
&lt;/h2&gt;

&lt;p&gt;The exam is weighted across five domains. Know these ratios — they tell you where to spend study time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 1 — Agentic Architecture and Orchestration (27%)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The heaviest domain. Tests multi-agent system design, task decomposition, hub-and-spoke orchestration models, and the failure modes that emerge when agents interact.&lt;/p&gt;

&lt;p&gt;Key concepts you must understand at depth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coordinator-subagent architecture: when a central coordinator delegates to specialist subagents vs when a single agent handles the full task&lt;/li&gt;
&lt;li&gt;Agentic loop design: how agents reason, act, observe, and re-reason — and where loops break in production&lt;/li&gt;
&lt;li&gt;Context isolation for subagents: why you isolate context per subagent to prevent context leakage and token bloat&lt;/li&gt;
&lt;li&gt;Token economics in multi-agent systems: how coordinator overhead compounds when subagents don't have focused context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most common mistake candidates make in this domain: treating orchestration as a purely logical problem. The exam tests whether you understand the operational reality — latency, cost, failure propagation, partial completion handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 2 — Tool Design and MCP Integration (18%)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tests how you design tools that agents use reliably, and how Model Context Protocol servers connect agents to external systems.&lt;/p&gt;

&lt;p&gt;Key concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool schema design: why description quality determines whether Claude calls the tool correctly, not the implementation&lt;/li&gt;
&lt;li&gt;MCP server architecture: transport types (stdio vs HTTP), session management, tool registration patterns&lt;/li&gt;
&lt;li&gt;Tool boundary design: how to prevent reasoning overload from too many tools or overlapping tool responsibilities&lt;/li&gt;
&lt;li&gt;Error handling in tool execution: what the agent receives when a tool fails and how that shapes recovery behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most common mistake: thinking MCP is just "an API wrapper." MCP introduces specific session lifecycle and discovery patterns that the exam tests at depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 3 — Claude Code Configuration and Workflows (20%)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tests CLAUDE.md hierarchy, custom slash commands, the &lt;code&gt;-p&lt;/code&gt; flag for CI/CD, and the &lt;code&gt;context:fork&lt;/code&gt; pattern for skill isolation.&lt;/p&gt;

&lt;p&gt;Key concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLAUDE.md hierarchy: global (&lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;) vs project-level vs directory-level, and how they compose&lt;/li&gt;
&lt;li&gt;Slash commands: how to define them, when to use &lt;code&gt;context:fork&lt;/code&gt; to isolate skill execution from the main session&lt;/li&gt;
&lt;li&gt;CI/CD integration: the &lt;code&gt;--print&lt;/code&gt; / &lt;code&gt;-p&lt;/code&gt; flag for non-interactive mode, &lt;code&gt;--output-format json&lt;/code&gt; for structured output in pipelines&lt;/li&gt;
&lt;li&gt;Skills architecture: &lt;code&gt;context:fork&lt;/code&gt; in frontmatter runs the skill in a sub-agent, keeping verbose output out of the main session context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Domain 3 catches people who have only used Claude as a chat tool but haven't used Claude Code in production pipelines. The exam gets specific about flag combinations and config file locations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 4 — Prompt Engineering and Structured Output (20%)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tests how to make production prompts reliable and how to enforce structured output at scale.&lt;/p&gt;

&lt;p&gt;Key concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON schema enforcement: constraining model output to a schema through system prompts and validation retry loops&lt;/li&gt;
&lt;li&gt;Few-shot techniques for complex formats: when examples are necessary vs when zero-shot is sufficient&lt;/li&gt;
&lt;li&gt;Self-evaluation patterns: implementing retry loops where the model receives its own error logs and corrects them without human intervention&lt;/li&gt;
&lt;li&gt;System prompt architecture for complex applications: modular prompt composition, how to structure prompts that are maintainable across a team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The exam distinguishes between prompt engineering for demos (optimise for the impressive case) and for production (optimise for failure rate and consistency). Nearly every question in this domain has a "looks right" distractor that would work for a demo but fail at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 5 — Context Management and Reliability (15%)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tests how to handle long-context tasks, agent handoff patterns, and confidence calibration.&lt;/p&gt;

&lt;p&gt;Key concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context window management: strategies for tasks that exceed context limits — summarisation, chunking, external memory&lt;/li&gt;
&lt;li&gt;Handoff patterns: how one agent passes state to another agent cleanly, what must be preserved vs what can be reconstructed&lt;/li&gt;
&lt;li&gt;Confidence calibration: how agents should signal uncertainty and when to escalate vs retry vs fail gracefully&lt;/li&gt;
&lt;li&gt;Session continuity: how AgentCore Memory supports cross-session persistence for long-running workflows&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The six production scenarios
&lt;/h2&gt;

&lt;p&gt;The exam presents four of these six scenarios randomly. Every question in your exam is anchored to those four scenarios. Study all six — they overlap significantly in the skills they test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1 — Customer Support Resolution Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An agent that handles customer support queries end-to-end. Tests: multi-turn conversation management, tool use for account lookups, escalation patterns, confidence calibration for edge cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2 — Code Generation with Claude Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using Claude Code in a development workflow. Tests: CLAUDE.md configuration, slash command design, CI/CD integration with the &lt;code&gt;-p&lt;/code&gt; flag, context management for large codebases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 3 — Multi-Agent Research System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A coordinator agent that delegates research subtasks to specialist subagents. Tests: task decomposition, context isolation per subagent, result synthesis, failure handling when a subagent returns an error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 4 — Developer Productivity with Claude&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude integrated into an engineering team's daily workflow. Tests: Claude Code configuration, memory and context persistence across sessions, CLAUDE.md hierarchy for team-wide settings vs individual developer settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 5 — Claude Code for CI/CD&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude Code embedded in a continuous integration pipeline. Tests: non-interactive mode (&lt;code&gt;-p&lt;/code&gt; flag), structured JSON output, schema-enforced PR comments, failure modes when Claude Code encounters ambiguity in automated context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 6 — Structured Data Extraction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An agent that extracts structured data from unstructured documents. Tests: JSON schema design, validation retry loops, few-shot examples for format consistency, handling documents that don't match expected patterns.&lt;/p&gt;




&lt;h2&gt;
  
  
  The concepts that trip most candidates
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Context leakage in multi-agent systems&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a coordinator passes its full context to a subagent, the subagent inherits reasoning, instructions, and conversation history that are irrelevant to its task. This bloats token usage and degrades subagent performance. The correct pattern: isolate context per subagent, passing only the task specification and the minimum necessary context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool description vs tool implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most candidates focus on the implementation of tool functions. The exam tests whether you understand that Claude's tool-calling behaviour is determined almost entirely by the description field in the tool schema — not the code. A perfectly implemented tool with a vague description will be called incorrectly or not at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;context:fork&lt;/code&gt; pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Skills defined in CLAUDE.md with &lt;code&gt;context: fork&lt;/code&gt; in frontmatter run in an isolated sub-agent. This prevents verbose skill output from polluting the main conversation context. Understanding when to use &lt;code&gt;context:fork&lt;/code&gt; vs running inline is a Domain 3 question type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-interactive Claude Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In CI/CD pipelines, Claude Code runs in non-interactive mode using the &lt;code&gt;-p&lt;/code&gt; flag (or &lt;code&gt;--print&lt;/code&gt;). Combined with &lt;code&gt;--output-format json&lt;/code&gt; and &lt;code&gt;--json-schema&lt;/code&gt;, it produces structured output that can be parsed by pipeline tooling. The exam tests specific flag combinations and failure modes when the agent encounters ambiguity it cannot resolve without human input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pigouvian retry loops&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The self-evaluation pattern: the model generates output, a validation function checks it against a schema, and if validation fails, the error message is fed back to the model for correction — without human intervention. Understanding when this pattern is appropriate (deterministic validation criteria) vs when it creates loops (ambiguous validation criteria) is a Domain 4 question type.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to prepare
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Official resources first&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the Anthropic Academy courses on Skilljar before anything else. The flagship course is 8+ hours and covers the foundational architecture concepts the exam assumes. These are not optional — the exam references specific Anthropic design patterns that appear in the official curriculum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then build, not just read&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The exam rewards candidates who have built real Claude systems. The scenarios are grounded in production problems — partial completions, tool failures, context limits, schema validation errors. Reading about these doesn't build the intuition the exam tests.&lt;/p&gt;

&lt;p&gt;What to build before the exam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A multi-agent system where a coordinator delegates to at least two specialist subagents&lt;/li&gt;
&lt;li&gt;A Claude Code workflow with custom slash commands and a CLAUDE.md that sets project-wide context&lt;/li&gt;
&lt;li&gt;A CI/CD integration using &lt;code&gt;-p&lt;/code&gt; flag with JSON schema output&lt;/li&gt;
&lt;li&gt;A tool schema where you've deliberately written a poor description and observed the resulting tool-calling behaviour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The official practice exam&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After registering, Anthropic provides access to a 60-question official practice exam in the same scenario format as the real exam. Complete it before booking your real exam slot. The explanations for incorrect answers are specifically useful — they clarify exactly why the distractor is wrong, which is harder to learn from any other source.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hands-on lab preparation
&lt;/h2&gt;

&lt;p&gt;The gap the exam is designed to close: most AI certification study involves reading documentation and answering multiple-choice questions. The CCA-001 tests production architecture judgment that only develops from actually building systems.&lt;/p&gt;

&lt;p&gt;The CCA-001 track on Cloud Edventures provides 22 hands-on lab missions in isolated real AWS Bedrock sandboxes — covering all five exam domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigator's Compass&lt;/strong&gt; (Domain 3): CLAUDE.md configuration, slash commands, plan-execute pipelines, CI/CD integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Architect&lt;/strong&gt; (Domain 2): Custom tool schema design, MCP server builds, function calling patterns, tool boundary design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt Engineering&lt;/strong&gt; (Domain 4): JSON schema enforcement, few-shot techniques, validation retry loops, system prompt architecture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Agent Systems&lt;/strong&gt; (Domain 1): Coordinator-subagent architecture, context isolation, task decomposition, failure handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production Reliability&lt;/strong&gt; (Domain 5): Context window management, handoff patterns, confidence calibration, AgentCore Memory integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each mission runs in a real AWS Bedrock environment with automated step validation. You get immediate feedback on whether your architecture decision is correct — the same kind of feedback loop the exam demands.&lt;/p&gt;

&lt;p&gt;No AWS account needed. No billing risk.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com/labs/track/claude-certified-architect-cca-001" rel="noopener noreferrer"&gt;cloudedventures.com/labs/track/claude-certified-architect-cca-001&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Who should take the CCA-001?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Backend and full-stack engineers adding AI architecture skills, cloud engineers specialising in AI infrastructure, AI/ML engineers wanting formal validation of agentic system skills, solutions architects designing Claude-powered systems for enterprise clients. The exam assumes at least 6 months of hands-on experience with the Claude API and Claude Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does the exam cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;$99 USD. Available through the Anthropic Claude Partner Network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long is the certification valid?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anthropic has not published an expiry date for the Foundations certification, consistent with how it was launched as the entry point to a multi-level credential stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What comes after CCA-001?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anthropic has confirmed additional certifications targeting advanced architects are planned for later in 2026. The Foundations certification is explicitly positioned as the entry point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the passing score?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;720 on a scaled score of 100–1,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it multiple choice?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, 60 multiple-choice questions. But unlike typical multiple-choice exams, the distractors are carefully constructed to be plausible if you have partial knowledge. Candidates who have studied documentation but not built real systems routinely find the exam harder than expected.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have a specific CCA-001 preparation question? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>career</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Mathematicians just proved that AI layoffs are a trap — and why cloud and AI engineers are on the right side of it</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Thu, 16 Apr 2026 15:37:29 +0000</pubDate>
      <link>https://dev.to/ajbuilds/mathematicians-just-proved-that-ai-layoffs-are-a-trap-and-why-cloud-and-ai-engineers-are-on-the-3ekn</link>
      <guid>https://dev.to/ajbuilds/mathematicians-just-proved-that-ai-layoffs-are-a-trap-and-why-cloud-and-ai-engineers-are-on-the-3ekn</guid>
      <description>&lt;p&gt;I read a paper last week that made me put my laptop down and stare at the wall for a bit.&lt;/p&gt;

&lt;p&gt;Not because it said AI will take jobs. Everyone says that now. Most of it is either doom scrolling dressed up as analysis, or breathless optimism about upskilling your way out of a structural problem.&lt;/p&gt;

&lt;p&gt;This paper was different.&lt;/p&gt;

&lt;p&gt;Two researchers at the University of Pennsylvania and Boston University — Brett Hemenway Falk and Gerry Tsoukalas — built a formal game-theoretic model, ran the mathematics, and proved something genuinely unsettling: &lt;strong&gt;even when every firm in a market knows that mass automation will destroy the consumer demand they all depend on, they automate anyway.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rationality doesn't save you. Perfect information doesn't save you. The structure of competition itself is the trap.&lt;/p&gt;

&lt;p&gt;The paper is "The AI Layoff Trap," posted to arXiv on March 21, 2026. It has 1,500+ reactions on LinkedIn, been cited by JPMorgan's CEO, and is now circulating at every level of the technology industry. Here's what it actually says — and more importantly, what it means for where you want to position yourself in the labor market right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Prisoner's Dilemma hiding inside every AI layoff announcement
&lt;/h2&gt;

&lt;p&gt;The logic of the trap is worth understanding clearly because it changes how you interpret every headline about AI-driven job cuts.&lt;/p&gt;

&lt;p&gt;Start with ten competing firms. AI arrives and offers each a choice: replace some human workers, cut your cost structure, gain a competitive edge. Each firm that automates gets cheaper to run. Each firm that doesn't gets undercut by the ones that did.&lt;/p&gt;

&lt;p&gt;So far, this is the story everyone already knows. Here's the part that makes it a trap.&lt;/p&gt;

&lt;p&gt;The workers being replaced are also consumers. When they lose their income, they stop spending. Every round of layoffs erodes the purchasing power that all ten firms depend on for revenue. Push this logic to its limit and you reach the cliff: firms automate their way to boundless productivity and zero demand. A market full of AI doing work for customers who can no longer afford to buy anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every firm running this analysis can see the cliff. They automate anyway.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because if your competitors automate and you don't, your cost structure is worse, your margins compress, you get undercut, you eventually exit the market. The individually rational move — automate — is the collectively catastrophic one. That is the Prisoner's Dilemma. And unlike a coordination failure, which can theoretically be solved by agreement, a dominant strategy is different. Rational players defect regardless of what they know. There is no stable voluntary agreement to not automate when the incentive to defect is this strong.&lt;/p&gt;

&lt;p&gt;The paper proves this rigorously. The formal result: competitive firms automate past the socially optimal level even with perfect foresight. And two factors make the trap worse, not better:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More competition&lt;/strong&gt; — as the number of firms increases, each firm's share of the collective demand loss from automation gets smaller. Smaller share means weaker incentive to restrain. A monopolist fully internalises the externality and restrains voluntarily. As you approach a perfectly competitive market, the wedge between private incentives and collective wellbeing approaches its maximum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better AI&lt;/strong&gt; — as AI capability improves and its cost falls relative to human labour, the individual cost savings from automation increase. The trap bites harder. More displacement. Less consumer demand. Faster toward the cliff.&lt;/p&gt;

&lt;p&gt;The sectors that are most competitive and have the best AI tools are headed toward the edge the fastest. This is not a bug. It is the mechanism.&lt;/p&gt;




&lt;h2&gt;
  
  
  The numbers are not hypothetical
&lt;/h2&gt;

&lt;p&gt;Over 100,000 tech workers were laid off in 2025 alone, with AI cited as the primary driver in more than half the cases. Concentrated in customer support, operations, and middle management.&lt;/p&gt;

&lt;p&gt;In February 2026, Block cut nearly half its 10,000-person workforce. CEO Jack Dorsey stated that AI had made those roles unnecessary and predicted that within a year, most companies would reach the same conclusion.&lt;/p&gt;

&lt;p&gt;Salesforce replaced 4,000 customer support agents with agentic AI. Cognition's Devin, deployed at Goldman Sachs and Infosys, enables one senior engineer to do the work of a five-person team.&lt;/p&gt;

&lt;p&gt;The exposure extends beyond tech. Roughly 80% of US workers hold jobs with tasks susceptible to automation by large language models. And the cost differential that drives the calculation: human knowledge work runs $50 to $200 per hour fully loaded. AI knowledge work runs $0.10 to $1.00 per hour. Two to three orders of magnitude. When the cost difference is that extreme, the trap activates regardless of foresight.&lt;/p&gt;

&lt;p&gt;None of this is hidden from the CEOs making these decisions. They can read the same data. They automate anyway because the Prisoner's Dilemma doesn't care about awareness. It only cares about incentives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the obvious solutions don't work
&lt;/h2&gt;

&lt;p&gt;The paper is unusually thorough about apparent fixes. Understanding why they fail is as important as understanding the trap itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upskilling and retraining:&lt;/strong&gt; Partially reduces the gap. Cannot close it. The problem is not that workers lack skills — it is that firms have a structural incentive to automate past the optimal level regardless of worker capability. Upskilling helps individuals. It doesn't change the game-theoretic structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Universal Basic Income:&lt;/strong&gt; Raises living standards for displaced workers. Doesn't change the per-task automation incentive for firms. They still race. UBI addresses the aftermath, not the mechanism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worker equity participation:&lt;/strong&gt; Helpful at the margin. If workers own shares, they partially internalise the demand loss from their own displacement. The externality persists — just reduced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voluntary industry agreements:&lt;/strong&gt; Fail completely. Automation is a dominant strategy. Any voluntary restraint agreement is unstable. The firm that defects captures the cost advantage. No agreement is self-enforcing when defection is individually rational.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capital income taxes:&lt;/strong&gt; Zero effect on the automation rate. A multiplicative tax on profits doesn't alter the first-order condition for the automation decision.&lt;/p&gt;

&lt;p&gt;One instrument corrects the distortion: a Pigouvian automation tax — charging firms the uninternalised social cost when they replace workers with AI. This forces the individual calculation to align with the collective one. The paper also notes this tax does double duty: its revenue can fund retraining and demand support, compounding the correction over time.&lt;/p&gt;

&lt;p&gt;Whether you find this policy politically viable or not, the structural argument about why everything else fails stands independently. The trap is real. The mechanisms that seem like they should stop it don't.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which side of the automation layer do you want to be on
&lt;/h2&gt;

&lt;p&gt;Here is where this conversation becomes directly practical.&lt;/p&gt;

&lt;p&gt;The roles displaced first are not the ones building and operating AI systems. They are the roles applying known processes to routine tasks — customer support, operations, data processing, middle management. The paper notes that the current displacement wave is disproportionately hitting entry-level workers in these categories.&lt;/p&gt;

&lt;p&gt;The roles on the other side of the boundary — the ones building, deploying, securing, and operating the automation infrastructure — are growing. Someone has to build the agentic AI system that replaced those 4,000 Salesforce support agents. Someone has to write the Bedrock workflows, configure the IAM policies, manage the API costs, monitor the CloudWatch metrics, debug the Lambda function when it breaks at 3am. Someone has to architect the multi-agent orchestration layer that coordinates specialised AI models across an enterprise.&lt;/p&gt;

&lt;p&gt;That person is a cloud engineer or AI architect. And the trap the paper describes is, for now, actively working in their favour.&lt;/p&gt;

&lt;p&gt;As automation deepens, four specific skill areas become more valuable, not less:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS and cloud infrastructure for AI workloads&lt;/strong&gt; — Lambda, Bedrock, SageMaker, ECS need engineers who understand them at genuine depth. Not surface familiarity from documentation. The kind of understanding that only comes from deploying real systems, watching them break, and debugging them under pressure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security of agentic systems&lt;/strong&gt; — as AI agents handle more sensitive operations — accessing databases, reading customer records, making financial decisions — IAM policy engineering, Bedrock Guardrails, and data governance become critical architectural concerns. The cost savings from automation evaporate the moment a poorly-governed agent causes a breach or regulatory violation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-agent architecture&lt;/strong&gt; — the Salesforce case is not one model responding to queries. It is an orchestrated system of specialised agents, each calling tools, reading data, writing records. Building these systems requires understanding agentic loops, tool use, coordinator-subagent patterns, MCP server integration, and the failure modes that emerge when agents interact at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Machine learning operations&lt;/strong&gt; — as AI inference becomes a core production workload, engineers who understand SageMaker, Bedrock model deployment, MLflow pipeline management, and real-time inference optimisation hold skills that simply didn't exist as a profession five years ago.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest version of "you need to upskill"
&lt;/h2&gt;

&lt;p&gt;The paper explicitly shows that individual upskilling is insufficient as macro policy. It doesn't change the structural incentive that drives collective over-automation. Knowing this is clarifying.&lt;/p&gt;

&lt;p&gt;What it does not mean is that individual skill development is irrelevant. It means the direction matters enormously.&lt;/p&gt;

&lt;p&gt;There is a clear dividing line. Below it: routine software tasks, basic configuration, scripted testing, repetitive data processing. These are the tasks AI handles at $0.10 per hour. Being in this layer is structurally precarious regardless of proficiency.&lt;/p&gt;

&lt;p&gt;Above it: systems design for AI workloads, security architecture for agentic systems, infrastructure engineering for real-time ML inference pipelines, multi-agent coordination, debugging complex agent failures at depth. These require judgment and pattern recognition from real-world failures that current AI cannot yet replicate.&lt;/p&gt;

&lt;p&gt;The gap between someone with genuine hands-on experience — who has deployed and debugged real IAM policies, watched real CloudWatch alarms fire, recovered from real Terraform state corruption, built and tested real Bedrock agents — versus someone who has consumed tutorials about these topics, is exactly the gap that automation closes slowly and reluctantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The window where these skills are scarce and highly compensated is real. It is not permanent.&lt;/strong&gt; Building depth now, while the scarcity premium exists, is the rational individual response to a structural dynamic you can see but cannot individually stop.&lt;/p&gt;




&lt;h2&gt;
  
  
  The certifications that signal you're on the right side
&lt;/h2&gt;

&lt;p&gt;Two certifications matter specifically in this context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS ML Engineer Associate (MLA-C01)&lt;/strong&gt; — the certification for engineers building and operating machine learning systems on AWS. Covers SageMaker, Bedrock, data pipelines with Glue and Athena, Kinesis for real-time ingestion, and MLOps practices. As more organisations move AI workloads to production, the engineers who understand this stack are the ones on the growing side of the automation boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Certified Architect (CCA-001)&lt;/strong&gt; — Anthropic's first official technical certification. Launched March 2026, backed by a $100M Claude Partner Network. Covers agentic loops, MCP server architecture, multi-agent coordination, Bedrock Guardrails, and CI/CD for Claude-powered systems. As the agentic AI stack on AWS matures — and the Mythos and AgentCore launches this month confirm it is maturing fast — the engineers who understand how to architect, constrain, and audit these systems will be the ones organisations trust to deploy them.&lt;/p&gt;

&lt;p&gt;These are not certifications that signal you studied documentation. They require demonstrating hands-on competency with real systems under real conditions.&lt;/p&gt;




&lt;h2&gt;
  
  
  One more thing the paper says that most summaries skip
&lt;/h2&gt;

&lt;p&gt;The paper's formal model shows that the over-automation wedge is strictly increasing in N — where N is the number of firms in the market.&lt;/p&gt;

&lt;p&gt;More competitive markets exhibit wider automation gaps. This runs directly counter to the standard economic intuition that competition disciplines firms to act in consumers' interests. Here, more competition dilutes each firm's share of the demand loss, weakening the private incentive to restrain.&lt;/p&gt;

&lt;p&gt;The implication: the sectors where you are most likely to see aggressive AI-driven displacement are not the monopolised ones. They are the highly competitive ones — exactly the tech industry, the SaaS market, the enterprise software space where most engineers work.&lt;/p&gt;

&lt;p&gt;If you are in a competitive tech sector, the automation pressure on the roles around you is higher than average. The acceleration is not going to stop because the competitive structure that drives it is not going to change.&lt;/p&gt;

&lt;p&gt;The question that actually matters is not whether automation is happening. It is whether the specific skills you are building put you on the operating side of AI systems or the replaced side.&lt;/p&gt;




&lt;p&gt;The research skills above the automation boundary — real AWS infrastructure, Bedrock agent architecture, SageMaker and MLOps, multi-agent system design — are what the Cloud Edventures platform is built around. Three tracks of hands-on labs in isolated real AWS sandboxes: Core AWS Foundations, AWS ML Engineer MLA-C01, and Claude Certified Architect CCA-001.&lt;/p&gt;

&lt;p&gt;Not simulations. Not click-through walkthroughs. Real Lambda functions, real IAM policies, real Bedrock agents — with automated validation that tells you whether your configuration is actually correct. No AWS account needed.&lt;/p&gt;

&lt;p&gt;The paper is worth reading in full: arxiv.org/abs/2603.20617. And the skills worth building are the ones the trap cannot reach.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com" rel="noopener noreferrer"&gt;cloudedventures.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where do you think the automation boundary sits in your own role right now? This is the conversation worth having in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Claude Mythos is on AWS Bedrock. Here's what engineers need to know.</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Wed, 15 Apr 2026 14:13:01 +0000</pubDate>
      <link>https://dev.to/ajbuilds/claude-mythos-is-on-aws-bedrock-heres-what-engineers-need-to-know-2lhj</link>
      <guid>https://dev.to/ajbuilds/claude-mythos-is-on-aws-bedrock-heres-what-engineers-need-to-know-2lhj</guid>
      <description>&lt;p&gt;Something significant happened on April 7, 2026.&lt;/p&gt;

&lt;p&gt;Anthropic launched Claude Mythos — a model they describe as "too powerful to be released publicly" — and made it available exclusively through Amazon Bedrock as a gated research preview under Project Glasswing.&lt;/p&gt;

&lt;p&gt;It achieved a record-breaking 93.9% score on SWE-bench Verified. For context, the best human performance on that benchmark is around 40–50%. Claude Mythos didn't just cross a threshold — it obliterated it.&lt;/p&gt;

&lt;p&gt;This is not another incremental model release. It is a category shift. And if you work in cloud engineering, DevOps, or AI infrastructure, the implications are significant enough that you need to understand what just shipped.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Claude Mythos actually is
&lt;/h2&gt;

&lt;p&gt;Claude Mythos Preview is a fundamentally new model class focused on cybersecurity — capable of identifying sophisticated security vulnerabilities in software, analyzing large codebases, and delivering state-of-the-art performance across cybersecurity, coding, and complex reasoning tasks.&lt;/p&gt;

&lt;p&gt;The critical distinction from every other large language model release: Mythos was not built to be a generalist assistant. It was built to be a specialist at finding and exploiting software vulnerabilities — and then immediately applying that capability to defence.&lt;/p&gt;

&lt;p&gt;Anthropic's positioning is explicit: "AI models have reached a level of coding capability where they can surpass all but the most elite humans in discovering and exploiting software vulnerabilities."&lt;/p&gt;

&lt;p&gt;Read that again. Not "approach" human level. Not "match some professionals." Surpass all but the most elite.&lt;/p&gt;

&lt;p&gt;This is the first time a lab has shipped a model with that specific framing — acknowledging that the capability is genuinely dangerous, that release requires extraordinary caution, and that the primary use case during preview is defensive: find vulnerabilities before adversaries do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why AWS Bedrock specifically
&lt;/h2&gt;

&lt;p&gt;Claude Mythos Preview is available in gated preview in the US East (N. Virginia) Region through Amazon Bedrock as part of Project Glasswing.&lt;/p&gt;

&lt;p&gt;The choice of Bedrock as the delivery vehicle is not incidental. It means:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enterprise access control&lt;/strong&gt; — Bedrock's IAM integration means access to Mythos can be governed at the role and policy level. Organisations can control which teams, workloads, and applications can invoke the model, with full CloudTrail audit trails of every API call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance infrastructure&lt;/strong&gt; — Bedrock provides VPC endpoints, PrivateLink support, and data residency controls. For the security teams most likely to use Mythos — those working on critical infrastructure — operating inside an existing compliance perimeter without sending data to a public API is a hard requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost allocation&lt;/strong&gt; — AWS just launched Bedrock support for cost allocation by IAM user and role, allowing teams to tag IAM principals with attributes like team or cost center and see model inference spending flow into AWS Cost Explorer. For security research workloads that run intensive codebase analysis, cost visibility is operationally necessary.&lt;/p&gt;

&lt;p&gt;The pattern emerging here: AWS is becoming the enterprise control plane for AI. Not because their models are the most capable — they're not — but because the surrounding infrastructure (IAM, CloudTrail, VPC, Cost Explorer, GuardDuty) is already where enterprise security teams live.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who can access it right now
&lt;/h2&gt;

&lt;p&gt;Access is currently limited to allowlisted organisations. Anthropic and AWS are prioritising internet-critical companies and open-source maintainers whose software and digital services impact hundreds of millions of users.&lt;/p&gt;

&lt;p&gt;If you run a payment processor, a DNS provider, a major open-source project that ships in billions of devices, or critical government infrastructure — your AWS account team may reach out directly.&lt;/p&gt;

&lt;p&gt;For everyone else: Anthropic does not currently plan to release Claude Mythos publicly, but their ultimate goal is to enable users to safely deploy Mythos-level models at scale. Within 90 days (by approximately July 2026), Anthropic will publicly report on discovered vulnerabilities, patches, and improvements.&lt;/p&gt;

&lt;p&gt;The broader release path runs through Claude Opus. Mythos-level capabilities are expected to be integrated into a future Opus release once the safety evaluation framework from Glasswing has been proven.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this means for cloud engineers and security architects
&lt;/h2&gt;

&lt;p&gt;If you work in cloud security or platform engineering, the Mythos release changes your threat model — and your tooling landscape — in several specific ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vulnerability discovery is no longer human-speed
&lt;/h3&gt;

&lt;p&gt;The primary use case Anthropic has demonstrated: feed Mythos a large codebase, ask it to find security vulnerabilities, and it produces actionable findings with less manual guidance than any previous AI system.&lt;/p&gt;

&lt;p&gt;The implication: if this capability becomes broadly accessible (and the 90-day disclosure timeline suggests it will), both defensive and offensive security teams will have access to automated vulnerability discovery at a scale and speed that has never existed. The time between a vulnerability existing and being exploited in the wild will compress dramatically.&lt;/p&gt;

&lt;p&gt;For cloud engineers: the security configurations you set today — IAM policies, VPC security groups, S3 bucket policies, GuardDuty rules — will be tested against systems that can analyse their logic at codebase depth. Not just scan for known CVEs. Understand the actual logical structure of your access controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI agent governance just became urgent
&lt;/h3&gt;

&lt;p&gt;The simultaneous launch of AWS Agent Registry and Bedrock AgentCore Policy is not coincidental timing.&lt;/p&gt;

&lt;p&gt;Policy in AgentCore gives organisations control over the actions agents can take, applied outside of the agent's reasoning loop, treating agents as autonomous actors whose decisions require verification before reaching tools, systems, or data.&lt;/p&gt;

&lt;p&gt;The AWS Agent Registry provides organisations with a private catalogue for discovering and managing AI agents, tools, skills, MCP servers, and custom resources, with semantic and keyword search, approval workflows, and CloudTrail audit trails.&lt;/p&gt;

&lt;p&gt;The pattern: as AI agents become more capable, the infrastructure for governing them becomes as critical as the agents themselves. The cloud engineers building agent systems in 2026 need to understand policy enforcement and audit logging as core architecture concerns, not afterthoughts.&lt;/p&gt;

&lt;h3&gt;
  
  
  The CCA-001 certification just became more relevant
&lt;/h3&gt;

&lt;p&gt;The Claude Certified Architect certification — Anthropic's first official AI technical credential — covers exactly the architectural patterns that the Mythos/Bedrock/AgentCore ecosystem requires: agentic loops, Bedrock Guardrails, multi-agent coordination, MCP servers, and policy enforcement.&lt;/p&gt;

&lt;p&gt;Mythos running on Bedrock inside AgentCore is not a standalone tool. It is an agent. It calls tools. It reads codebases. It produces findings. It operates within a policy and governance framework. The engineers who understand how to build, constrain, and audit agentic systems on AWS Bedrock are the engineers who will deploy these capabilities safely.&lt;/p&gt;

&lt;p&gt;That architecture knowledge is precisely what the CCA-001 track builds hands-on.&lt;/p&gt;




&lt;h2&gt;
  
  
  The broader picture: what Mythos signals about where AI is going
&lt;/h2&gt;

&lt;p&gt;Three things are happening simultaneously and they are connected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capability is outpacing comprehension.&lt;/strong&gt; Mythos scored 93.9% on SWE-bench. The best human software engineers score around 40-50%. The gap between what the model can do and what the humans deploying it can verify is widening. This is the core challenge that AgentCore Policy, Bedrock Guardrails, and the CCA-001 certification address from different angles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Anthropic-AWS partnership is deepening.&lt;/strong&gt; Mythos was not released on the public Anthropic API. It was released exclusively through Bedrock. AWS Agent Registry launched the same week. Bedrock cost allocation for IAM principals launched the same week. This is a coordinated platform play — Anthropic provides the model capability, AWS provides the enterprise control plane.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security is the first production use case for frontier AI agents.&lt;/strong&gt; Not customer service. Not code generation. Not document summarisation. Security — specifically vulnerability discovery — is the first domain where a frontier AI agent is being deployed in production settings with explicit acknowledgement that its capabilities exceed human expert performance. That is a remarkable statement about where we are.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to do with this information
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're a cloud security engineer:&lt;/strong&gt; The threat model changes. Begin reviewing your most critical IAM policies, S3 bucket policies, and VPC security configurations with the assumption that automated analysis at Mythos-level depth will eventually be widely available. Your misconfigurations that are currently obscure will not remain obscure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a platform engineer building on Bedrock:&lt;/strong&gt; Start understanding AgentCore Policy and the AWS Agent Registry now, before they're mandatory. The governance infrastructure is being built; the engineers who understand it will be the ones organisations rely on to deploy AI agents safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're studying for cloud certifications:&lt;/strong&gt; The CCA-001 Claude Certified Architect certification is the only hands-on certification that covers the Bedrock/AgentCore/MCP architecture that Mythos operates within. There are no other options for validated hands-on skills in this specific stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a student or early-career engineer:&lt;/strong&gt; The combination of AWS security skills and AI agent architecture is the highest-value skill pairing in cloud engineering right now. The Mythos launch confirms this direction — security + AI on AWS is where the critical infrastructure work is happening.&lt;/p&gt;




&lt;h2&gt;
  
  
  A note on what we don't know yet
&lt;/h2&gt;

&lt;p&gt;Mythos is in gated preview. The public knows very little about its actual performance outside of SWE-bench and the specific vulnerability discovery framing Anthropic has chosen.&lt;/p&gt;

&lt;p&gt;What Anthropic has said they will share: within 90 days, a public report on discovered vulnerabilities, patches applied, and improvements made based on the Glasswing preview period. That report — expected by approximately July 2026 — will be the first detailed public evidence of what Mythos-level AI actually found in production systems.&lt;/p&gt;

&lt;p&gt;That disclosure is worth watching closely. It will either confirm or significantly revise the current understanding of what this generation of AI can do to real-world codebases.&lt;/p&gt;




&lt;p&gt;The engineers who understand what's happening at the infrastructure level — how Bedrock delivers it, how AgentCore governs it, how IAM and CloudTrail audit it — will be the ones building and operating the next generation of AI systems.&lt;/p&gt;

&lt;p&gt;That infrastructure knowledge is hands-on. You learn it by building with real Bedrock environments, real IAM configurations, real agentic loops — not by reading about them.&lt;/p&gt;

&lt;p&gt;The CCA-001 Claude Certified Architect track covers exactly this: Bedrock model deployment, AgentCore agent architecture, MCP server integration, Guardrails policy enforcement, and multi-agent coordination — in isolated real AWS sandboxes with automated validation.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com/labs/track/claude-certified-architect-cca-001" rel="noopener noreferrer"&gt;cloudedventures.com/labs/track/claude-certified-architect-cca-001&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What do you think the 90-day Glasswing disclosure will reveal? Drop a comment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>security</category>
      <category>anthropic</category>
    </item>
    <item>
      <title>DevOps jobs in 2026: roles, salaries, and how to actually get hired</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Tue, 14 Apr 2026 17:01:53 +0000</pubDate>
      <link>https://dev.to/ajbuilds/devops-jobs-in-2026-roles-salaries-and-how-to-actually-get-hired-3bbf</link>
      <guid>https://dev.to/ajbuilds/devops-jobs-in-2026-roles-salaries-and-how-to-actually-get-hired-3bbf</guid>
      <description>&lt;p&gt;DevOps engineer is one of the most in-demand roles in tech right now. Job boards have thousands of open positions. Salaries are strong. Companies are actively hiring.&lt;/p&gt;

&lt;p&gt;And most people applying are getting screened out before their resume reaches a human.&lt;/p&gt;

&lt;p&gt;This guide covers what DevOps jobs actually require in 2026, the roles that exist and what separates them, realistic salary ranges, where to find real openings, and the portfolio that gets you past the filter.&lt;/p&gt;




&lt;h2&gt;
  
  
  What DevOps actually means in a job description
&lt;/h2&gt;

&lt;p&gt;DevOps started as a philosophy — break down silos between development and operations, ship faster, fail smaller. By 2026 it has become a specific technical skill set that hiring managers test for in interviews.&lt;/p&gt;

&lt;p&gt;When a job posting says "DevOps Engineer," it almost always means someone who can do some combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build and maintain CI/CD pipelines (GitHub Actions, Jenkins, AWS CodePipeline)&lt;/li&gt;
&lt;li&gt;Write infrastructure as code (Terraform, CloudFormation, Pulumi)&lt;/li&gt;
&lt;li&gt;Manage containerized workloads (Docker, Kubernetes, ECS)&lt;/li&gt;
&lt;li&gt;Implement monitoring and observability (CloudWatch, Datadog, Grafana)&lt;/li&gt;
&lt;li&gt;Automate everything that used to be done manually&lt;/li&gt;
&lt;li&gt;Integrate security into the pipeline (DevSecOps)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The degree of emphasis varies by company and seniority. An entry-level role might focus entirely on CI/CD and basic cloud. A senior role might require designing multi-account AWS organization structures and leading an SRE team.&lt;/p&gt;




&lt;h2&gt;
  
  
  DevOps roles in 2026 (and what each actually does)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  DevOps Engineer
&lt;/h3&gt;

&lt;p&gt;The generalist. Owns the CI/CD pipeline, manages cloud infrastructure, writes Terraform, keeps things running. This is the role most job postings are hiring for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do day to day:&lt;/strong&gt; Deploy pipelines, write infrastructure code, debug production incidents, automate repetitive operational tasks, handle on-call rotations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Salary range:&lt;/strong&gt; $90,000 – $160,000 USD (US). Varies heavily by location, company size, and experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Site Reliability Engineer (SRE)
&lt;/h3&gt;

&lt;p&gt;Google invented SRE. The concept: apply software engineering to operations problems. SREs write code to eliminate toil, set SLOs, manage error budgets, and own production reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What separates SRE from DevOps:&lt;/strong&gt; More emphasis on reliability metrics, error budgets, and post-incident analysis. More software engineering, less pure infrastructure configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Salary range:&lt;/strong&gt; $120,000 – $200,000 USD. Typically pays more than DevOps Engineer titles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform Engineer
&lt;/h3&gt;

&lt;p&gt;Platform engineers build internal developer platforms — the tooling, templates, and self-service infrastructure that let application developers deploy without needing to know Kubernetes internals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What separates Platform from DevOps:&lt;/strong&gt; Building for internal developer experience rather than directly shipping products. Golden paths, internal CLIs, developer portals (Backstage).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Salary range:&lt;/strong&gt; $110,000 – $180,000 USD.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud Engineer
&lt;/h3&gt;

&lt;p&gt;Cloud-focused infrastructure. AWS, Azure, or GCP architecture, cost optimization, migration projects. Often overlaps heavily with DevOps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Salary range:&lt;/strong&gt; $95,000 – $165,000 USD.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevSecOps Engineer
&lt;/h3&gt;

&lt;p&gt;DevOps with security shifted left. Integrates SAST, DAST, container scanning, secrets management, and compliance into the pipeline. Growing fast as organizations realize security needs to move at DevOps speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Salary range:&lt;/strong&gt; $110,000 – $180,000 USD. Security premium is real.&lt;/p&gt;




&lt;h2&gt;
  
  
  What companies are actually hiring for in 2026
&lt;/h2&gt;

&lt;p&gt;Job descriptions lie. They list 15 requirements and actually care about 4. Here is what actually gets you hired based on what interviewers test for:&lt;/p&gt;

&lt;h3&gt;
  
  
  Non-negotiable regardless of level
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Git proficiency&lt;/strong&gt; — not just commits and pushes. Branch strategy, pull request workflows, merge vs rebase, tagging releases. Interviewers notice when you don't know these.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux fundamentals&lt;/strong&gt; — filesystem navigation, process management, reading logs, basic shell scripting. Everything runs on Linux. If you can't navigate it confidently you can't debug production incidents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At least one cloud platform deeply&lt;/strong&gt; — AWS dominates job postings (62% of cloud DevOps roles mention AWS). Knowing what services exist is table stakes. Being able to architect and debug is what gets you offers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD hands-on experience&lt;/strong&gt; — not "I know what a pipeline is." Can you build one from scratch? Can you debug why a deployment failed at the Terraform apply step? Can you add a new stage?&lt;/p&gt;

&lt;h3&gt;
  
  
  What separates candidates at different levels
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Entry level:&lt;/strong&gt; Can follow existing patterns, fix broken pipelines, deploy changes. Needs supervision on architecture decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mid level:&lt;/strong&gt; Can design a new pipeline from requirements, write Terraform modules, make reasonable architecture decisions independently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior:&lt;/strong&gt; Can design multi-environment deployment strategies, evaluate tooling trade-offs, mentor others, lead incident response.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where DevOps jobs are actually posted
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn Jobs&lt;/strong&gt; — largest volume. Use filters: "DevOps Engineer", location, "Past 24 hours" for fresh postings. Apply within the first 24 hours — applications drop off sharply after 3 days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indeed&lt;/strong&gt; — strong for mid-market companies and smaller engineering teams. Larger companies post here but LinkedIn is stronger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Glassdoor&lt;/strong&gt; — use primarily for salary data and interview reviews, not job discovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;levels.fyi&lt;/strong&gt; — tech company compensation data. Use to understand what "competitive salary" actually means at specific companies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Company career pages directly&lt;/strong&gt; — larger tech companies (AWS, Google, Microsoft, Stripe, Cloudflare) have dedicated engineering job boards. Applying directly is often faster than LinkedIn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter/X and LinkedIn posts&lt;/strong&gt; — engineering managers at smaller companies frequently post openings informally before posting officially. Follow DevOps engineers at companies you want to work at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;r/devops on Reddit&lt;/strong&gt; — monthly "who's hiring" threads, often with roles from teams that don't post conventionally.&lt;/p&gt;




&lt;h2&gt;
  
  
  The portfolio that gets you past the ATS
&lt;/h2&gt;

&lt;p&gt;Certifications get your resume through the automated filter. Projects get you through the technical screen.&lt;/p&gt;

&lt;p&gt;A hiring manager looking at two candidates — one with AWS Solutions Architect cert but no projects, one with no cert but a GitHub repo showing a deployed Terraform + GitHub Actions + Kubernetes stack — picks the second one almost every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three projects that cover the full DevOps interview surface:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project 1: Serverless API with full IaC&lt;/strong&gt;&lt;br&gt;
Lambda + API Gateway + DynamoDB, deployed entirely with Terraform. No console clicks — everything in code, version controlled, deployable with &lt;code&gt;terraform apply&lt;/code&gt;. CloudWatch alarms for errors. IAM least privilege on every role.&lt;/p&gt;

&lt;p&gt;This demonstrates: Lambda, IaC, IAM, monitoring, serverless architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project 2: Complete CI/CD pipeline&lt;/strong&gt;&lt;br&gt;
GitHub Actions workflow: lint and test on every PR, Docker build and push to ECR on merge, Terraform plan in staging, manual approval gate, Terraform apply to production. Use GitHub Actions OIDC for AWS authentication — no stored secrets.&lt;/p&gt;

&lt;p&gt;This demonstrates: CI/CD, Docker, Terraform, secrets management, deployment strategy, the OIDC pattern that replaces stored AWS keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project 3: Event-driven architecture&lt;/strong&gt;&lt;br&gt;
SQS + Lambda + DynamoDB Streams + SNS fan-out. An application that processes events asynchronously, handles failures with a dead letter queue, and notifies downstream systems.&lt;/p&gt;

&lt;p&gt;This demonstrates: async architecture, error handling, distributed systems thinking — the category of questions that separate mid from senior.&lt;/p&gt;




&lt;h2&gt;
  
  
  The skills gap that actually blocks people
&lt;/h2&gt;

&lt;p&gt;Most DevOps job seekers have consumed a lot of content — YouTube tutorials, Udemy courses, documentation. The problem: consuming content does not build the skills interviewers test.&lt;/p&gt;

&lt;p&gt;The skills that come only from hands-on practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debugging&lt;/strong&gt; — you only develop debugging intuition by actually breaking things and fixing them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terraform state management&lt;/strong&gt; — remote state, locking, drift detection only makes sense after you've dealt with state corruption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM least privilege&lt;/strong&gt; — understanding what permissions to grant is only clear after over-permissioning something and seeing the blast radius&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident response&lt;/strong&gt; — reading about blameless postmortems is different from having run one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge: practicing on your own AWS account involves billing risk. Misconfigured resources, forgotten instances, data transfer costs. The anxiety about billing is why most developers consume content instead of building.&lt;/p&gt;

&lt;p&gt;Isolated sandbox environments solve this. Cloud Edventures provides real AWS environments — Lambda, S3, IAM, DynamoDB, CloudFormation, CodePipeline, Terraform, GitHub Actions OIDC — where you complete guided lab missions with automated validation. No AWS account needed. No billing risk. The feedback loop is immediate — the system tells you whether your IAM policy is correctly scoped or your pipeline is failing for the right reasons.&lt;/p&gt;

&lt;p&gt;The Core AWS Foundations track covers exactly the hands-on skills that DevOps job interviews test: IAM least privilege, VPC security, CI/CD with GitHub Actions OIDC, Terraform IaC, event-driven architectures with SQS and SNS.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com/labs/track/aws-cloud-foundations" rel="noopener noreferrer"&gt;cloudedventures.com/labs/track/aws-cloud-foundations&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  DevOps interview prep: what to expect
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Round 1 — Technical screen (phone/video)&lt;/strong&gt;&lt;br&gt;
Linux commands, basic cloud concepts, what CI/CD is, describe a deployment you've worked on. Behavioral questions about past incidents or team conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round 2 — Technical deep dive&lt;/strong&gt;&lt;br&gt;
Walk through a project you built. They will ask follow-up questions specifically to verify you actually built it. "Why did you choose DynamoDB over RDS here?" "How does your Terraform state locking work?" "What happens if the Lambda times out?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round 3 — System design&lt;/strong&gt;&lt;br&gt;
Design a deployment system for a new microservice. Design a blue/green deployment strategy. How would you approach migrating a monolith to containers?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question that trips most people:&lt;/strong&gt; "Walk me through a production incident you handled." If you've only watched tutorials you don't have an answer. If you've built and broken real systems you do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Salary negotiation for DevOps roles
&lt;/h2&gt;

&lt;p&gt;DevOps engineers are in high demand. Companies expect negotiation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting point:&lt;/strong&gt; Research on levels.fyi and Glassdoor for the specific company and level before your first offer call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The counter:&lt;/strong&gt; Always counter. Even "I was hoping for X" without justification gets a 5-10% bump at most companies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The strongest counter:&lt;/strong&gt; A competing offer. If you have two offers, both go up. If you only have one, mention you're in final rounds elsewhere (if true).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What moves salary the most:&lt;/strong&gt; Specialization. AWS + Kubernetes + security = higher than AWS alone. AWS + Terraform + security + SRE experience = higher still.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Where are you in the DevOps job search right now? Drop a comment — especially if you're trying to break in without prior DevOps experience.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>career</category>
      <category>aws</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AWS cloud security: the complete guide for 2026 (IAM, VPC, KMS, GuardDuty)</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Mon, 13 Apr 2026 13:30:41 +0000</pubDate>
      <link>https://dev.to/ajbuilds/aws-cloud-security-the-complete-guide-for-2026-iam-vpc-kms-guardduty-2jah</link>
      <guid>https://dev.to/ajbuilds/aws-cloud-security-the-complete-guide-for-2026-iam-vpc-kms-guardduty-2jah</guid>
      <description>&lt;p&gt;AWS cloud security is not a single feature you turn on. It is a set of overlapping controls — identity, network, data, and detection — that work together to reduce your attack surface.&lt;/p&gt;

&lt;p&gt;Most security breaches on AWS are not caused by AWS failures. They are caused by misconfigured IAM policies, publicly accessible S3 buckets, unencrypted data, and missing detection controls. All of them are preventable. All of them are things you control.&lt;/p&gt;

&lt;p&gt;This guide covers the six pillars of AWS security, the specific controls in each, and the mistakes that get teams breached.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AWS shared responsibility model (your security starts here)
&lt;/h2&gt;

&lt;p&gt;AWS secures the infrastructure — the physical data centers, the hypervisor, the hardware, the global network. You secure everything you put on that infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS is responsible for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Physical data centers and hardware&lt;/li&gt;
&lt;li&gt;Global network infrastructure&lt;/li&gt;
&lt;li&gt;Hypervisor and host OS&lt;/li&gt;
&lt;li&gt;Managed service infrastructure (the RDS database engine, the Lambda runtime)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You are responsible for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IAM users, roles, and policies&lt;/li&gt;
&lt;li&gt;Network configuration (VPCs, security groups, NACLs)&lt;/li&gt;
&lt;li&gt;Data encryption at rest and in transit&lt;/li&gt;
&lt;li&gt;Operating system patches on EC2 instances&lt;/li&gt;
&lt;li&gt;Application security&lt;/li&gt;
&lt;li&gt;Monitoring and detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important sentence in AWS security: &lt;strong&gt;misconfigured, not breached&lt;/strong&gt;. The vast majority of AWS security incidents are self-inflicted — someone configured something wrong. Understanding what you own prevents most of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 1 — IAM: Identity and Access Management
&lt;/h2&gt;

&lt;p&gt;IAM controls who can do what in your AWS account. It is the most critical security control and the most commonly misconfigured.&lt;/p&gt;

&lt;h3&gt;
  
  
  The principle of least privilege
&lt;/h3&gt;

&lt;p&gt;Every IAM user, role, and service should have the minimum permissions required to do its job — nothing more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this looks like in practice:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:GetObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"s3:PutObject"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::my-app-bucket/*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This Lambda function can read and write objects in one specific bucket. It cannot list buckets, delete objects, create buckets, or touch any other AWS service. Least privilege means your blast radius when something goes wrong is limited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What least privilege is not:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;code&gt;AdministratorAccess&lt;/code&gt;. Never attach it to application roles, Lambda functions, or EC2 instance profiles. Save it for break-glass admin scenarios with MFA enforcement.&lt;/p&gt;

&lt;h3&gt;
  
  
  IAM security rules every account needs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Enable MFA on the root account — immediately&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The root account has unlimited access to everything in your AWS account including billing and account closure. It cannot be restricted by SCPs or permission boundaries. Protect it with MFA and never use it for daily work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never create IAM access keys for the root account&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If root access keys exist, delete them. There is no legitimate reason for them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use roles, not users, for application access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EC2 instances, Lambda functions, ECS tasks — none of them should have IAM users or access keys. Attach an IAM role. AWS automatically rotates the temporary credentials. No secrets to store, no rotation to manage, no credentials to leak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use IAM roles for cross-account access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your application needs to access resources in another AWS account, use a cross-account IAM role. Never pass IAM access keys between accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  IAM Access Analyzer
&lt;/h3&gt;

&lt;p&gt;IAM Access Analyzer identifies resources that are accessible from outside your account — S3 buckets, IAM roles, KMS keys, Lambda functions, SQS queues, Secrets Manager secrets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable Access Analyzer for your account&lt;/span&gt;
aws accessanalyzer create-analyzer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--analyzer-name&lt;/span&gt; &lt;span class="s2"&gt;"account-analyzer"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--type&lt;/span&gt; ACCOUNT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this in every region you use. Review findings weekly. Any external access that isn't intentional is a finding worth investigating.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 2 — VPC: Network Security
&lt;/h2&gt;

&lt;p&gt;Your VPC is your private network in AWS. Network security controls what can reach your resources and what your resources can reach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security groups vs NACLs
&lt;/h3&gt;

&lt;p&gt;These two controls are frequently confused. They serve different purposes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Security Groups&lt;/th&gt;
&lt;th&gt;NACLs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Level&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Instance (resource) level&lt;/td&gt;
&lt;td&gt;Subnet level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stateful&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes — return traffic automatic&lt;/td&gt;
&lt;td&gt;No — must allow both directions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Allow only (no deny)&lt;/td&gt;
&lt;td&gt;Allow and deny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deny all inbound, allow all outbound&lt;/td&gt;
&lt;td&gt;Allow all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Controlling access to specific resources&lt;/td&gt;
&lt;td&gt;Broad subnet-level controls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Security group best practices:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a security group for a web server&lt;/span&gt;
aws ec2 create-security-group &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-name&lt;/span&gt; web-server-sg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Web server security group"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--vpc-id&lt;/span&gt; vpc-0123456789abcdef0

&lt;span class="c"&gt;# Allow HTTPS from anywhere (not HTTP — use HTTPS only)&lt;/span&gt;
aws ec2 authorize-security-group-ingress &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-id&lt;/span&gt; sg-0123456789abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--protocol&lt;/span&gt; tcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cidr&lt;/span&gt; 0.0.0.0/0

&lt;span class="c"&gt;# Allow SSH only from your office IP — never from 0.0.0.0/0&lt;/span&gt;
aws ec2 authorize-security-group-ingress &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-id&lt;/span&gt; sg-0123456789abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--protocol&lt;/span&gt; tcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 22 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cidr&lt;/span&gt; 203.0.113.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The most dangerous security group rule:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Port 22 (SSH), Source: 0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens SSH to the entire internet. Your server will be receiving brute force attempts within minutes of being created. Use AWS Systems Manager Session Manager instead of SSH — no open ports required.&lt;/p&gt;

&lt;h3&gt;
  
  
  VPC design for security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Public subnet:&lt;/strong&gt; Resources that need direct internet access — Load Balancers, NAT Gateways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private subnet:&lt;/strong&gt; Application servers, databases — never directly internet-accessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Isolated subnet:&lt;/strong&gt; Databases and sensitive data stores that should not even reach the internet outbound.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet Gateway
      ↓
Public Subnet (ALB, NAT Gateway)
      ↓
Private Subnet (EC2, ECS — outbound via NAT)
      ↓
Isolated Subnet (RDS, ElastiCache — no internet)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most applications only need one thing in the public subnet: the load balancer. Everything else — application servers, databases, caches — should be in private or isolated subnets.&lt;/p&gt;

&lt;h3&gt;
  
  
  VPC Flow Logs
&lt;/h3&gt;

&lt;p&gt;Enable VPC Flow Logs to capture all network traffic metadata for your VPC. This is essential for security investigation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 create-flow-logs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-type&lt;/span&gt; VPC &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-ids&lt;/span&gt; vpc-0123456789abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--traffic-type&lt;/span&gt; ALL &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log-destination-type&lt;/span&gt; cloud-watch-logs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log-group-name&lt;/span&gt; /aws/vpc/flow-logs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--deliver-logs-permission-arn&lt;/span&gt; arn:aws:iam::123456789012:role/flowlogsRole
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without flow logs, when something suspicious happens you have no record of what network traffic occurred.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 3 — S3: Data Security
&lt;/h2&gt;

&lt;p&gt;S3 misconfiguration is one of the most common causes of AWS data breaches. Public S3 buckets have exposed customer data, credentials, and intellectual property at companies of all sizes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Block public access — account level
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Block all public access for the entire account&lt;/span&gt;
aws s3control put-public-access-block &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account-id&lt;/span&gt; 123456789012 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--public-access-block-configuration&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;BlockPublicAcls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;,IgnorePublicAcls&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;,BlockPublicPolicy&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;,RestrictPublicBuckets&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single command prevents any S3 bucket in your account from being made public — even if someone accidentally applies a public bucket policy. Run it on every AWS account you own.&lt;/p&gt;

&lt;h3&gt;
  
  
  S3 bucket policies: what to deny
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DenyNonHTTPS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"s3:*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::my-bucket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::my-bucket/*"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Bool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"aws:SecureTransport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This denies any request that doesn't use HTTPS. No application should be reading S3 over unencrypted HTTP.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable default encryption
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws s3api put-bucket-encryption &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bucket&lt;/span&gt; my-bucket &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server-side-encryption-configuration&lt;/span&gt; &lt;span class="s1"&gt;'{
    "Rules": [{
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "aws:kms",
        "KMSMasterKeyID": "arn:aws:kms:us-east-1:123456789012:key/your-key-id"
      }
    }]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable S3 encryption by default for every bucket. Use KMS (not SSE-S3) for buckets containing sensitive data — KMS gives you audit logs of every decryption.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 4 — KMS: Encryption Key Management
&lt;/h2&gt;

&lt;p&gt;AWS Key Management Service manages the encryption keys for your data at rest. When you enable encryption on RDS, S3, EBS, or DynamoDB, KMS is managing the key.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customer managed keys vs AWS managed keys
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS managed keys (aws/service):&lt;/strong&gt; AWS creates and manages these. You cannot see or control the key policy. Fine for basic encryption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer managed keys (CMKs):&lt;/strong&gt; You create and control these. You can restrict who can use the key, enable automatic rotation, and see audit logs of every encryption and decryption operation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a customer managed key&lt;/span&gt;
aws kms create-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Production database encryption key"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-usage&lt;/span&gt; ENCRYPT_DECRYPT

&lt;span class="c"&gt;# Enable automatic annual rotation&lt;/span&gt;
aws kms enable-key-rotation &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-id&lt;/span&gt; your-key-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For sensitive data (PII, financial records, health information), use CMKs. The audit log alone — every encryption and decryption recorded in CloudTrail — is worth the small cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  CloudTrail + KMS = who accessed what data
&lt;/h3&gt;

&lt;p&gt;Every KMS decrypt operation is logged in CloudTrail with: who made the request, what key was used, when, and from what IP. This is the audit trail that compliance frameworks require and that incident responders use to determine the scope of a breach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 5 — GuardDuty: Threat Detection
&lt;/h2&gt;

&lt;p&gt;Amazon GuardDuty is AWS's managed threat detection service. It analyzes CloudTrail, VPC Flow Logs, and DNS logs to identify malicious activity — without you configuring any rules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable GuardDuty&lt;/span&gt;
aws guardduty create-detector &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--finding-publishing-frequency&lt;/span&gt; SIX_HOURS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What GuardDuty detects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unusual API calls from impossible geographic locations (credential compromise)&lt;/li&gt;
&lt;li&gt;EC2 instances communicating with known malicious IPs&lt;/li&gt;
&lt;li&gt;Cryptocurrency mining on your compute resources&lt;/li&gt;
&lt;li&gt;IAM access from Tor exit nodes&lt;/li&gt;
&lt;li&gt;S3 bucket reconnaissance from external accounts&lt;/li&gt;
&lt;li&gt;Port scanning from your EC2 instances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GuardDuty findings go to Security Hub, EventBridge, and SNS. Wire a finding to a Lambda function that auto-remediates or alerts your on-call channel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create EventBridge rule: GuardDuty HIGH finding → SNS alert&lt;/span&gt;
aws events put-rule &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"guardduty-high-findings"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--event-pattern&lt;/span&gt; &lt;span class="s1"&gt;'{
    "source": ["aws.guardduty"],
    "detail-type": ["GuardDuty Finding"],
    "detail": {
      "severity": [{"numeric": ["&amp;gt;=", 7]}]
    }
  }'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--state&lt;/span&gt; ENABLED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cost: $4/month for a low-traffic account. This is mandatory. The detection value far exceeds the cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 6 — CloudTrail: Audit Logging
&lt;/h2&gt;

&lt;p&gt;CloudTrail records every API call made in your AWS account — who called what API, when, from where, and with what result. It is the foundation of all AWS security investigation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable CloudTrail in all regions (mandatory for security)&lt;/span&gt;
aws cloudtrail create-trail &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"global-audit-trail"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--s3-bucket-name&lt;/span&gt; my-cloudtrail-logs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--is-multi-region-trail&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-log-file-validation&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--include-global-service-events&lt;/span&gt;

aws cloudtrail start-logging &lt;span class="nt"&gt;--name&lt;/span&gt; global-audit-trail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;--is-multi-region-trail&lt;/code&gt;&lt;/strong&gt; — captures API calls in every region, including global services. Without this, an attacker operating in &lt;code&gt;eu-west-1&lt;/code&gt; while your trail only covers &lt;code&gt;us-east-1&lt;/code&gt; leaves no trace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;--enable-log-file-validation&lt;/code&gt;&lt;/strong&gt; — CloudTrail signs log files so you can verify they haven't been tampered with.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AWS Security Checklist
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Immediate (do today)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Enable MFA on root account&lt;/li&gt;
&lt;li&gt;[ ] Delete root account access keys if they exist&lt;/li&gt;
&lt;li&gt;[ ] Block public S3 access at account level&lt;/li&gt;
&lt;li&gt;[ ] Enable GuardDuty in every region&lt;/li&gt;
&lt;li&gt;[ ] Enable CloudTrail as a multi-region trail&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  This week
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Enable EBS default encryption per region&lt;/li&gt;
&lt;li&gt;[ ] Enable S3 default encryption on all buckets&lt;/li&gt;
&lt;li&gt;[ ] Run IAM Access Analyzer and review external findings&lt;/li&gt;
&lt;li&gt;[ ] Audit security groups for &lt;code&gt;0.0.0.0/0&lt;/code&gt; SSH/RDP rules&lt;/li&gt;
&lt;li&gt;[ ] Enable VPC Flow Logs on all VPCs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  This month
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Implement least-privilege IAM for all application roles&lt;/li&gt;
&lt;li&gt;[ ] Move all EC2 access to SSM Session Manager (eliminate SSH)&lt;/li&gt;
&lt;li&gt;[ ] Enable AWS Config for configuration compliance monitoring&lt;/li&gt;
&lt;li&gt;[ ] Set up GuardDuty findings → SNS/PagerDuty alerting&lt;/li&gt;
&lt;li&gt;[ ] Enable AWS Security Hub as unified findings dashboard&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the most common AWS security mistake?&lt;/strong&gt;&lt;br&gt;
Overly permissive IAM policies — either &lt;code&gt;AdministratorAccess&lt;/code&gt; attached to application roles, or wildcard actions on specific services when only 2-3 actions are needed. The second most common is publicly accessible S3 buckets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is AWS secure by default?&lt;/strong&gt;&lt;br&gt;
AWS infrastructure is secure by default. Your configuration is not. S3 buckets are private by default but can be made public. Security groups deny all inbound by default but can be opened to &lt;code&gt;0.0.0.0/0&lt;/code&gt;. The defaults are secure — the common mistakes are configurations that override those defaults.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need all six pillars for a small project?&lt;/strong&gt;&lt;br&gt;
At minimum: enable GuardDuty, block public S3 access, use IAM roles (not users) for application access, and enable MFA on root. These four controls prevent most common AWS security incidents regardless of project size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does AWS security cost?&lt;/strong&gt;&lt;br&gt;
GuardDuty: ~$4/month for low traffic. CloudTrail: free for management events, ~$2/month per region for S3 storage. Security Hub: ~$0.001 per finding after the first 10,000. KMS: $1/key/month + $0.03 per 10,000 API calls. Total for a properly secured small account: under $20/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the AWS Well-Architected Framework security pillar?&lt;/strong&gt;&lt;br&gt;
AWS's security pillar covers six areas: identity and access management, detection, infrastructure protection, data protection, incident response, and application security. It maps directly to the six pillars in this guide. The full documentation is at docs.aws.amazon.com/wellarchitected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practice these controls hands-on
&lt;/h2&gt;

&lt;p&gt;Reading about IAM policies and security groups is useful. Deploying them incorrectly in a real environment — seeing what breaks and why — builds the intuition that actually matters in production.&lt;/p&gt;

&lt;p&gt;The Security Fortress path in Cloud Edventures covers every control in this guide hands-on: IAM least privilege lab, VPC security groups and NACLs, S3 bucket policy configuration, KMS key creation and rotation, GuardDuty enabling and findings, and CloudTrail audit trail setup — in isolated real AWS sandboxes with automated validation.&lt;/p&gt;

&lt;p&gt;No AWS account needed. No billing risk.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com/labs/track/aws-cloud-foundations" rel="noopener noreferrer"&gt;cloudedventures.com/labs/track/aws-cloud-foundations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Which AWS security control has caused you the most pain to configure? Drop a comment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>cloud</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AWS EBS explained: volume types, snapshots, and when NOT to use it</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Fri, 10 Apr 2026 13:29:43 +0000</pubDate>
      <link>https://dev.to/ajbuilds/aws-ebs-explained-volume-types-snapshots-and-when-not-to-use-it-1hp3</link>
      <guid>https://dev.to/ajbuilds/aws-ebs-explained-volume-types-snapshots-and-when-not-to-use-it-1hp3</guid>
      <description>&lt;p&gt;Most AWS tutorials treat EBS like it's just a cloud hard drive you attach to EC2. Plug it in, store your files, done.&lt;/p&gt;

&lt;p&gt;That mental model is why developers end up with the wrong volume type for their workload, surprise bills from forgotten snapshots, and architecture decisions that are hard to reverse six months later.&lt;/p&gt;

&lt;p&gt;This is the guide that actually explains how EBS works — the volume types, when to use each, when to use something else entirely, and what the common expensive mistakes look like.&lt;/p&gt;




&lt;h2&gt;
  
  
  What AWS EBS actually is
&lt;/h2&gt;

&lt;p&gt;EBS (Elastic Block Store) is &lt;strong&gt;persistent block storage&lt;/strong&gt; for EC2 instances. The two words that matter: &lt;em&gt;persistent&lt;/em&gt; and &lt;em&gt;block&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persistent&lt;/strong&gt; means your data survives instance stop and termination. This is different from instance store (ephemeral storage that disappears when the instance stops). If you stop an EC2 instance and start it again tomorrow, EBS data is still there. Instance store data is gone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Block storage&lt;/strong&gt; means the OS sees it as a raw disk — a device like &lt;code&gt;/dev/xvda&lt;/code&gt; or &lt;code&gt;/dev/nvme0n1&lt;/code&gt;. You format it with a filesystem (ext4, xfs), mount it, and use it like any disk. This is different from S3 (object storage, accessed via API) or EFS (file storage, accessed via NFS protocol).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key operational fact:&lt;/strong&gt; Each EBS volume lives in one Availability Zone and can only be attached to instances in the same AZ. If your instance is in &lt;code&gt;us-east-1a&lt;/code&gt;, your EBS volume must also be in &lt;code&gt;us-east-1a&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  EBS volume types: which one do you actually need?
&lt;/h2&gt;

&lt;p&gt;AWS offers six EBS volume types. Most workloads need one of two. Here is the complete breakdown:&lt;/p&gt;

&lt;h3&gt;
  
  
  gp3 — General Purpose SSD (the default, and usually the right choice)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IOPS:&lt;/strong&gt; 3,000 baseline, up to 16,000 provisioned independently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throughput:&lt;/strong&gt; 125 MB/s baseline, up to 1,000 MB/s independently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; ~$0.08/GB-month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use for:&lt;/strong&gt; Boot volumes, development environments, small to medium databases, web servers, almost everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important upgrade from gp2: on gp3, IOPS and throughput are &lt;strong&gt;independent&lt;/strong&gt; of storage size. On gp2, you got 3 IOPS per GB (so a 100GB volume had 300 IOPS). On gp3, you always get 3,000 IOPS regardless of size, and you can add more without buying more storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you have gp2 volumes today, migrate them to gp3.&lt;/strong&gt; Same performance, 20% cheaper.&lt;/p&gt;

&lt;h3&gt;
  
  
  gp2 — General Purpose SSD (legacy, stop using this)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IOPS:&lt;/strong&gt; 3 IOPS/GB, minimum 100, maximum 16,000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; ~$0.10/GB-month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use for:&lt;/strong&gt; Nothing new. Migrate existing gp2 to gp3.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  io2 Block Express — Provisioned IOPS SSD (when you need extreme performance)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IOPS:&lt;/strong&gt; Up to 256,000&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throughput:&lt;/strong&gt; Up to 4,000 MB/s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; ~$0.125/GB-month + $0.065/provisioned IOPS-month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use for:&lt;/strong&gt; Large critical databases (Oracle, SQL Server, SAP HANA), workloads requiring sub-millisecond latency with consistent performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;io2 Block Express is expensive. A 1TB io2 volume with 32,000 IOPS costs roughly $180/month vs $80/month for the same size gp3. The performance difference is real — if your database latency is the bottleneck, io2 is worth it. If it's not your bottleneck, it's waste.&lt;/p&gt;

&lt;h3&gt;
  
  
  io1 — Provisioned IOPS SSD (legacy io2, skip this)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use io2 instead. Better durability (99.999% vs 99.8%), same price or cheaper per IOPS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  st1 — Throughput Optimized HDD (big sequential reads)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Throughput:&lt;/strong&gt; Up to 500 MB/s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IOPS:&lt;/strong&gt; Low (not the right metric for HDDs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; ~$0.045/GB-month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use for:&lt;/strong&gt; Big data, data warehouses, log processing — workloads that read/write large files sequentially&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cannot be used as boot volume&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;st1 is significantly cheaper than SSDs. If your workload reads Kafka log files, Hadoop data, or large sequential datasets where throughput matters but IOPS don't, st1 saves significant money.&lt;/p&gt;

&lt;h3&gt;
  
  
  sc1 — Cold HDD (infrequently accessed archives)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Throughput:&lt;/strong&gt; Up to 250 MB/s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; ~$0.015/GB-month (cheapest EBS option)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use for:&lt;/strong&gt; Infrequently accessed data that still needs block storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cannot be used as boot volume&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sc1 is basically archival storage. If you're storing data you access rarely and can tolerate slow access, sc1 is the cheapest block storage available on AWS.&lt;/p&gt;




&lt;h2&gt;
  
  
  The decision framework
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is this a boot volume?
  → Yes: gp3 (required — st1/sc1 can't boot)

Does your workload need &amp;gt;16,000 IOPS or consistent sub-ms latency?
  → Yes: io2 Block Express
  → No: Continue

Is your workload sequential large reads/writes (logs, Hadoop, analytics)?
  → Yes: st1 (throughput optimized)

Is the data infrequently accessed?
  → Yes: sc1 (cheapest)

Everything else: gp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nine out of ten workloads should be on gp3. The other one is a large database that needs io2.&lt;/p&gt;




&lt;h2&gt;
  
  
  EBS vs EFS vs S3: choosing the right storage
&lt;/h2&gt;

&lt;p&gt;This is where most architecture decisions go wrong. Block, file, and object storage serve fundamentally different purposes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;EBS&lt;/th&gt;
&lt;th&gt;EFS&lt;/th&gt;
&lt;th&gt;S3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;
&lt;td&gt;File (NFS)&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access pattern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single EC2 instance&lt;/td&gt;
&lt;td&gt;Multiple EC2 instances&lt;/td&gt;
&lt;td&gt;Any client via API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Protocol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OS disk (mounted)&lt;/td&gt;
&lt;td&gt;NFS&lt;/td&gt;
&lt;td&gt;HTTP REST API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Until deleted&lt;/td&gt;
&lt;td&gt;Until deleted&lt;/td&gt;
&lt;td&gt;Until deleted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sub-millisecond&lt;/td&gt;
&lt;td&gt;Low milliseconds&lt;/td&gt;
&lt;td&gt;Milliseconds to seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Availability Zone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single AZ&lt;/td&gt;
&lt;td&gt;Multi-AZ&lt;/td&gt;
&lt;td&gt;Global&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price (storage)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;From $0.015/GB&lt;/td&gt;
&lt;td&gt;From $0.30/GB&lt;/td&gt;
&lt;td&gt;From $0.023/GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Databases, boot volumes&lt;/td&gt;
&lt;td&gt;Shared file systems, CMS&lt;/td&gt;
&lt;td&gt;Media, backups, static assets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Use EBS when:&lt;/strong&gt; You need a disk that one EC2 instance treats as its own — databases, application servers, boot volumes, anything requiring filesystem-level access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use EFS when:&lt;/strong&gt; Multiple EC2 instances need to read/write the same files simultaneously — shared CMS uploads, distributed application configs, dev environments shared across instances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use S3 when:&lt;/strong&gt; You're storing objects via API — static website assets, images, videos, backups, data lake files, anything accessed via URL or SDK rather than a mounted filesystem.&lt;/p&gt;

&lt;p&gt;The most common wrong decision: using EBS for something that should be S3 (backups, logs, static files). S3 is cheaper, more durable (99.999999999%), and globally accessible. EBS is more expensive, tied to one AZ, and appropriate only when your application needs a real disk.&lt;/p&gt;




&lt;h2&gt;
  
  
  Snapshots: what they are and how to not forget them
&lt;/h2&gt;

&lt;p&gt;An EBS snapshot is a point-in-time backup of a volume stored in S3. Snapshots are incremental — the first one copies everything, subsequent ones only copy what changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a snapshot:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 create-snapshot &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--volume-id&lt;/span&gt; vol-0123456789abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Production DB backup &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y-%m-%d&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Restore a volume from snapshot:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 create-volume &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--snapshot-id&lt;/span&gt; snap-0123456789abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--availability-zone&lt;/span&gt; us-east-1a &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--volume-type&lt;/span&gt; gp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The expensive mistake:&lt;/strong&gt; Creating snapshots and never deleting old ones. Snapshots cost $0.05/GB-month for the data stored. A 500GB production database with daily snapshots and no retention policy generates 500GB × 30 days × $0.05 = $750/month in snapshot storage — more than the EC2 instance itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set a lifecycle policy immediately:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a Data Lifecycle Manager policy&lt;/span&gt;
aws dlm create-lifecycle-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Daily snapshots, keep 7 days"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--state&lt;/span&gt; ENABLED &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--execution-role-arn&lt;/span&gt; arn:aws:iam::123456789012:role/AWSDataLifecycleManagerDefaultRole &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-details&lt;/span&gt; &lt;span class="s1"&gt;'{
    "PolicyType": "EBS_SNAPSHOT_MANAGEMENT",
    "ResourceTypes": ["VOLUME"],
    "TargetTags": [{"Key": "Backup", "Value": "daily"}],
    "Schedules": [{
      "Name": "Daily",
      "CreateRule": {"Interval": 24, "IntervalUnit": "HOURS", "Times": ["03:00"]},
      "RetainRule": {"Count": 7},
      "CopyTags": true
    }]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tag your volumes with &lt;code&gt;Backup: daily&lt;/code&gt;, and this policy automatically creates and expires snapshots. No manual management, no forgotten snapshots accumulating cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  EBS encryption with KMS
&lt;/h2&gt;

&lt;p&gt;Encrypt EBS volumes using AWS KMS. Two ways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Enable default encryption for all new volumes (recommended — set this once):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 enable-ebs-encryption-by-default &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running this, every new EBS volume in &lt;code&gt;us-east-1&lt;/code&gt; is automatically encrypted using your default KMS key. No per-volume configuration needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Encrypt a specific volume:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 create-volume &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--availability-zone&lt;/span&gt; us-east-1a &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--size&lt;/span&gt; 100 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--volume-type&lt;/span&gt; gp3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--encrypted&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kms-key-id&lt;/span&gt; arn:aws:kms:us-east-1:123456789012:key/your-key-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Encryption adds zero latency overhead. There is no reason not to encrypt. Enable default encryption by default in every region you use.&lt;/p&gt;




&lt;h2&gt;
  
  
  EBS cost optimization: where teams overpay
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Unattached volumes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you terminate an EC2 instance, the root EBS volume is deleted (by default). But additional data volumes are not. They keep charging until explicitly deleted.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find all unattached volumes&lt;/span&gt;
aws ec2 describe-volumes &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;status,Values&lt;span class="o"&gt;=&lt;/span&gt;available &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Volumes[*].[VolumeId,Size,VolumeType,CreateTime]'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this monthly. Delete volumes you don't need. An unused 100GB gp3 volume is $8/month, quietly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. gp2 volumes that haven't been migrated to gp3&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find all gp2 volumes&lt;/span&gt;
aws ec2 describe-volumes &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;volume-type,Values&lt;span class="o"&gt;=&lt;/span&gt;gp2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Volumes[*].[VolumeId,Size]'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Migrate each to gp3 for an instant 20% cost reduction with no performance loss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Over-provisioned io2 volumes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;io2 charges per provisioned IOPS regardless of usage. If you provisioned 16,000 IOPS but your CloudWatch &lt;code&gt;VolumeReadOps&lt;/code&gt; and &lt;code&gt;VolumeWriteOps&lt;/code&gt; show average usage of 2,000 IOPS, you're paying for 14,000 idle IOPS.&lt;/p&gt;

&lt;p&gt;Check your EBS volume metrics in CloudWatch. Right-size io2 to match actual usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Snapshots with no retention policy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use Data Lifecycle Manager (shown above). One-time setup, saves money indefinitely.&lt;/p&gt;




&lt;h2&gt;
  
  
  EC2 instance store vs EBS: the critical difference
&lt;/h2&gt;

&lt;p&gt;Instance store is temporary storage physically attached to the EC2 host. It is &lt;strong&gt;not&lt;/strong&gt; EBS. Key differences:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;EBS&lt;/th&gt;
&lt;th&gt;Instance Store&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Survives stop/start/reboot&lt;/td&gt;
&lt;td&gt;Gone on stop, termination, failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very fast (NVMe gp3/io2)&lt;/td&gt;
&lt;td&gt;Fastest (direct physical attach)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Charged separately&lt;/td&gt;
&lt;td&gt;Included in instance price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any size up to 64TB&lt;/td&gt;
&lt;td&gt;Fixed to instance type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Instance store is appropriate for: cache data you can regenerate, Hadoop temporary files, database buffer pools that can be rebuilt. Never use instance store for data you cannot regenerate from another source.&lt;/p&gt;

&lt;p&gt;If your EC2 instance is stopped for any reason — scheduled maintenance, capacity issue, failure — instance store data is gone with no recovery path.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I attach one EBS volume to multiple EC2 instances?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;io1 and io2 volumes support Multi-Attach, allowing up to 16 instances in the same AZ to attach the same volume simultaneously. This requires careful application-level coordination to prevent data corruption — your application must handle concurrent writes. gp2 and gp3 do not support Multi-Attach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens to my EBS volume if the EC2 instance fails?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The EBS volume is unaffected. You can detach it and attach it to a new instance. This is one of EBS's core advantages over instance store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I move an EBS volume to a different Availability Zone?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not directly. Create a snapshot, then create a new volume from that snapshot in the target AZ. The snapshot → new volume path is the standard way to move EBS storage across AZs or regions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does EBS cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;gp3: $0.08/GB-month. io2: $0.125/GB-month + $0.065/provisioned IOPS-month. st1: $0.045/GB-month. sc1: $0.015/GB-month. Snapshots: $0.05/GB-month for changed data stored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is EBS encrypted at rest by default?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not by default, but you can enable account-level default encryption with one command (&lt;code&gt;aws ec2 enable-ebs-encryption-by-default&lt;/code&gt;). After that, every new volume is encrypted automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practice this in a real AWS environment
&lt;/h2&gt;

&lt;p&gt;Understanding EBS volume types is one thing. Knowing which type your workload actually needs — and what happens when you get it wrong — requires working with real volumes, real IOPS metrics, and real cost dashboards.&lt;/p&gt;

&lt;p&gt;The Core AWS Foundations track on Cloud Edventures includes hands-on labs covering EBS volume creation, snapshot lifecycle management, KMS encryption, and cost optimization — in isolated real AWS sandboxes with automated validation. No AWS account needed.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com/labs/track/aws-cloud-foundations" rel="noopener noreferrer"&gt;cloudedventures.com/labs/track/aws-cloud-foundations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What EBS scenario are you trying to solve? Drop a comment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I built an MCP server on AWS Bedrock in 30 minutes. Here's the exact code.</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Thu, 09 Apr 2026 11:13:10 +0000</pubDate>
      <link>https://dev.to/ajbuilds/i-built-an-mcp-server-on-aws-bedrock-in-30-minutes-heres-the-exact-code-2e32</link>
      <guid>https://dev.to/ajbuilds/i-built-an-mcp-server-on-aws-bedrock-in-30-minutes-heres-the-exact-code-2e32</guid>
      <description>&lt;p&gt;MCP (Model Context Protocol) is the most important AI infrastructure pattern of 2026. Anthropic built it, the Linux Foundation now owns it, and AWS just made it a first-class citizen in Bedrock AgentCore.&lt;/p&gt;

&lt;p&gt;97 million SDK downloads. 13,000+ servers built by the community. And as of this month, AWS is deploying them as managed services inside your existing cloud infrastructure.&lt;/p&gt;

&lt;p&gt;This is the tutorial I wish existed when I started. Not theory. Actual working code that deploys a real MCP server connected to AWS services in under 30 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MCP Actually Is (In One Paragraph)
&lt;/h2&gt;

&lt;p&gt;MCP is the protocol that lets AI agents use external tools reliably. Without it, your agent either hardcodes tool integrations (brittle, unmaintainable) or hallucinates function calls that don't exist.&lt;/p&gt;

&lt;p&gt;With MCP, you define tools once as a server. Any agent — Claude, Cursor, your own custom Bedrock agent — can discover and use those tools via a standardized interface. Think USB-C for AI tools. Build once, plug in anywhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Agent (Claude / Bedrock)
        ↓
   MCP Client (asks: what tools are available?)
        ↓
   MCP Server (returns: tool schemas + executes calls)
        ↓
   Your actual APIs, databases, AWS services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;A working MCP server that exposes two AWS tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;query_dynamodb&lt;/code&gt;&lt;/strong&gt; — lets Claude query a DynamoDB table using natural language&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_s3_summary&lt;/code&gt;&lt;/strong&gt; — lets Claude list and summarize files in an S3 bucket&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then we'll connect it to a Bedrock agent and watch Claude use both tools autonomously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; Python 3.11+, AWS credentials configured, boto3 installed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Install the MCP SDK
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mcp boto3 fastmcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FastMCP is the Python framework that makes building MCP servers significantly less painful than raw MCP. It handles the protocol layer so you write tools, not JSON-RPC boilerplate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Build the MCP Server
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;aws_mcp_server.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize FastMCP server
&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWS Tools Server&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# AWS clients
&lt;/span&gt;&lt;span class="n"&gt;dynamodb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dynamodb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s3_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_dynamodb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Query a DynamoDB table by primary key.
    Use this when the user wants to look up specific records from a database.

    Args:
        table_name: The DynamoDB table to query
        key_name: The primary key attribute name
        key_value: The value to look up
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dynamodb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;key_value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Item&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No record found for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;table&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;record&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;table&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_s3_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    List and summarize files in an S3 bucket.
    Use this when the user asks about files, documents, or data stored in S3.

    Args:
        bucket_name: The S3 bucket to inspect
        prefix: Optional folder prefix to filter results (e.g., &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;reports/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; or &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data/2026/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;paginator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s3_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_paginator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list_objects_v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paginator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;Bucket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bucket_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;PaginationConfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MaxItems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;total_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Contents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
                &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;size_kb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;last_modified&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LastModified&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;
                &lt;span class="n"&gt;total_size&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bucket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bucket_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prefix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(root)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file_count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_size_kb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_size&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;files&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# Return first 20 for context window efficiency
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;note&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Showing &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; files&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bucket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bucket_name&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Run as stdio MCP server (for local testing with Claude Desktop / Claude Code)
&lt;/span&gt;    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;@mcp.tool()&lt;/code&gt; decorator does the heavy lifting — it generates the JSON schema from your Python type hints and docstring. Claude uses the docstring to decide &lt;strong&gt;when&lt;/strong&gt; to call each tool. Write it from Claude's perspective: "Use this when the user wants to..."&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Test Locally With Claude Code
&lt;/h2&gt;

&lt;p&gt;Before deploying to Bedrock, test the MCP server locally. Add it to your Claude Code MCP config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add to Claude Code's MCP servers&lt;/span&gt;
claude mcp add aws-tools &lt;span class="nt"&gt;--&lt;/span&gt; python /path/to/aws_mcp_server.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Claude Code, then ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;How many files are in my logs-bucket-prod S3 bucket?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see Claude invoke &lt;code&gt;get_s3_summary&lt;/code&gt; automatically. If it works locally, it'll work on Bedrock.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Deploy to Bedrock AgentCore Runtime
&lt;/h2&gt;

&lt;p&gt;AWS Bedrock AgentCore Runtime lets you deploy MCP servers as managed services — serverless, auto-scaling, with session isolation handled for you. This is the new way to run MCP in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4a — Create a Dockerfile&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; aws_mcp_server.py .&lt;/span&gt;

&lt;span class="c"&gt;# AgentCore expects MCP servers to run on port 8080&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;

&lt;span class="c"&gt;# Run as HTTP MCP server for AgentCore&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "aws_mcp_server.py", "--transport", "http", "--port", "8080"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;requirements.txt&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;fastmcp&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.9.0&lt;/span&gt;
&lt;span class="py"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.35.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4b — Push to ECR&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create ECR repo&lt;/span&gt;
aws ecr create-repository &lt;span class="nt"&gt;--repository-name&lt;/span&gt; aws-tools-mcp-server

&lt;span class="c"&gt;# Get ECR login&lt;/span&gt;
aws ecr get-login-password &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 | &lt;span class="se"&gt;\&lt;/span&gt;
  docker login &lt;span class="nt"&gt;--username&lt;/span&gt; AWS &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--password-stdin&lt;/span&gt; 123456789.dkr.ecr.us-east-1.amazonaws.com

&lt;span class="c"&gt;# Build and push&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; aws-tools-mcp-server &lt;span class="nb"&gt;.&lt;/span&gt;
docker tag aws-tools-mcp-server:latest &lt;span class="se"&gt;\&lt;/span&gt;
  123456789.dkr.ecr.us-east-1.amazonaws.com/aws-tools-mcp-server:latest
docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/aws-tools-mcp-server:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4c — Deploy to AgentCore Runtime&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="n"&gt;agentcore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock-agentcore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agentcore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_agent_runtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agentRuntimeName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws-tools-mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agentRuntimeArtifact&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;containerConfiguration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;containerUri&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;123456789.dkr.ecr.us-east-1.amazonaws.com/aws-tools-mcp-server:latest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;networkConfiguration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;networkMode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PUBLIC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AgentCore Runtime ARN:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agentRuntimeArn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Endpoint:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agentRuntimeEndpoint&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AgentCore handles: session isolation (each user gets their own MCP session in a dedicated microVM), automatic scaling, authentication, and 8-hour maximum session support for long-running operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Connect to a Bedrock Agent
&lt;/h2&gt;

&lt;p&gt;Now wire the deployed MCP server into a Bedrock agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;bedrock_runtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock-runtime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Your MCP server endpoint from Step 4c
&lt;/span&gt;&lt;span class="n"&gt;MCP_ENDPOINT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://your-agentcore-endpoint.bedrock-agentcore.us-east-1.amazonaws.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_agent_with_mcp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Bedrock agent that uses your deployed MCP server as its tool provider.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are an AWS assistant with access to DynamoDB and S3 tools.
        Use your tools to answer questions about the user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s AWS data.
        Always use tools to get real data — never guess or make up values.
        MCP Server: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;MCP_ENDPOINT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;

    &lt;span class="c1"&gt;# Tool config pointing to your MCP server
&lt;/span&gt;    &lt;span class="n"&gt;tool_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toolSpec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_dynamodb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Query a DynamoDB table by primary key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputSchema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;table_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key_value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="p"&gt;},&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;table_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key_value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toolSpec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_s3_summary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List and summarize files in an S3 bucket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputSchema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bucket_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prefix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="p"&gt;},&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bucket_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Agentic loop
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bedrock_runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;converse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;modelId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-3-sonnet-20240229-v1:0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;toolConfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tool_config&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stopReason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end_turn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;tool_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toolUse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;continue&lt;/span&gt;

                &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toolUse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;tool_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;tool_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

                &lt;span class="c1"&gt;# Route to correct tool
&lt;/span&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tool_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_dynamodb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;query_dynamodb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;tool_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;tool_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_s3_summary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_s3_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;tool_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown tool: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

                &lt;span class="n"&gt;tool_results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toolResult&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toolUseId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toolUseId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;

            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_results&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Agent reached iteration limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="c1"&gt;# Test it
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_agent_with_mcp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How many files are in my data-lake-prod bucket? &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;And look up user ID &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_123&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; in my Users table.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Three Things That Break MCP in Production
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1 — Vague tool descriptions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude decides which tool to call based entirely on the &lt;code&gt;description&lt;/code&gt; field. If your description is vague, Claude either skips the tool or calls it when it shouldn't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Weak — Claude might not call this when it should
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get data from a table.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Strong — Claude knows exactly when to use this
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_dynamodb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Query a DynamoDB table by primary key.
    Use this when the user wants to look up specific records,
    find customer data, retrieve order information, or access
    any structured data stored in DynamoDB.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2 — Returning too much data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP tool results flow back into the agent's context window. A tool that returns 10,000 rows from DynamoDB will burn your context window in one call.&lt;/p&gt;

&lt;p&gt;Always limit your returns: paginate aggressively, return summaries not raw dumps, use &lt;code&gt;limit&lt;/code&gt; parameters in every database query.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 — Not handling tool failures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your tool raises an exception, the entire agentic loop breaks. Every tool should return structured JSON even on failure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;do_the_thing&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent can read the error message and respond gracefully. An uncaught exception just crashes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stateful MCP: AWS's New Feature (March 2026)
&lt;/h2&gt;

&lt;p&gt;AWS just shipped stateful MCP server support in AgentCore Runtime. This is significant.&lt;/p&gt;

&lt;p&gt;Previously, each MCP call was stateless — the server had no memory between tool invocations. Now, each user session gets a &lt;strong&gt;dedicated microVM&lt;/strong&gt; with session context preserved using an &lt;code&gt;Mcp-Session-Id&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;This enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Elicitation&lt;/strong&gt; — the server can ask the user follow-up questions mid-tool execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sampling&lt;/strong&gt; — the server can request Claude to generate content as part of a tool's operation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress notifications&lt;/strong&gt; — real-time updates for long-running operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For long-running tasks (ML training jobs, large data exports, multi-hour simulations), this changes the architecture completely. The server can now maintain state across a multi-hour operation without requiring the agent session to stay open.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Build Next
&lt;/h2&gt;

&lt;p&gt;With this foundation working, the natural next steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add more AWS tools&lt;/strong&gt; — CloudWatch metrics querier, RDS query executor, Lambda invoker, Step Functions status checker. Each becomes a tool your agent can use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add Bedrock Guardrails&lt;/strong&gt; — wrap your MCP server with content filtering and PII detection that operates outside the agent's reasoning loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-agent coordination&lt;/strong&gt; — one coordinator agent that routes requests to specialist subagents, each with their own focused MCP server and tool set.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AgentCore Gateway&lt;/strong&gt; — instead of embedding tool schemas in your agent, register your MCP server with AgentCore Gateway and let multiple agents discover the same tools via a central registry.&lt;/p&gt;




&lt;p&gt;The full production version of this architecture — agentic loops, multi-agent systems, MCP server builds, Bedrock Guardrails, CloudWatch observability — is covered hands-on in the CCA-001: Claude Certified Architect track. Real Bedrock sandboxes, automated validation, no AWS account needed.&lt;/p&gt;

&lt;p&gt;If you want to build the architecture in this article in a real environment without worrying about AWS billing, that's the path.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cloudedventures.com/labs/track/claude-certified-architect-cca-001" rel="noopener noreferrer"&gt;cloudedventures.com/labs/track/claude-certified-architect-cca-001&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What are you building with MCP? Drop a comment — especially if you hit a specific architecture problem I can help with.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude Code Power User Guide: /ghost, OODA, L99, KAIROS and Every Hidden Feature From the Source Code Leak</title>
      <dc:creator>Aj</dc:creator>
      <pubDate>Wed, 08 Apr 2026 18:09:35 +0000</pubDate>
      <link>https://dev.to/ajbuilds/claude-code-power-user-guide-ghost-ooda-l99-kairos-and-every-hidden-feature-from-the-source-57jg</link>
      <guid>https://dev.to/ajbuilds/claude-code-power-user-guide-ghost-ooda-l99-kairos-and-every-hidden-feature-from-the-source-57jg</guid>
      <description>&lt;p&gt;If you're using Claude Code the same way you use ChatGPT — typing conversational prompts and hoping for the best — you're leaving 80% of its power on the table.&lt;/p&gt;

&lt;p&gt;I've been deep in Claude Code for 90+ days building a production AWS learning platform. What I've learned: the difference between average and power-user results comes down to &lt;strong&gt;knowing what's under the hood&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The March 2026 source code leak gave us that knowledge. Here's the complete, tested guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Got Leaked (Quick Summary)
&lt;/h2&gt;

&lt;p&gt;On March 31, 2026, Anthropic published Claude Code version 2.1.88 to npm with a &lt;code&gt;.map&lt;/code&gt; source file included by accident. 512,000 lines of TypeScript. 1,900 files. 44 feature flags. The complete system prompt. Everything.&lt;/p&gt;

&lt;p&gt;The key takeaways for power users:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude Code has &lt;strong&gt;40+ built-in tools&lt;/strong&gt; — most people use 3-4&lt;/li&gt;
&lt;li&gt;The system prompt &lt;strong&gt;explicitly tells Claude to be direct&lt;/strong&gt; — conversational prompts work against this&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel tool execution&lt;/strong&gt; is built-in but only triggers with properly structured prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLAUDE.md&lt;/strong&gt; is a first-class feature that loads automatically every session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;20+ unreleased features&lt;/strong&gt; are built and tested but flagged off in public builds&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's turn each of these into actionable techniques.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Prompt Frameworks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/ghost&lt;/code&gt; — Kill the AI Voice
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;/ghost&lt;/code&gt; when Claude Code's output will be read by humans (docs, READMEs, PR descriptions, emails).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Without /ghost&lt;/span&gt;
/ghost rewrite this README to sound like a senior engineer wrote it, not an AI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output drops the hedging ("It's worth noting that..."), the filler ("In order to..."), and the corporate tone. You get clean, direct prose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt; Documentation, blog posts, commit messages, Slack messages, code comments.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;OODA&lt;/code&gt; — Force a Decision
&lt;/h3&gt;

&lt;p&gt;OODA (Observe-Orient-Decide-Act) is a military decision framework. In Claude Code, it prevents the "here are the pros and cons" non-answer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;OODA: Our API currently uses REST. We&lt;span class="s1"&gt;'re adding real-time features. 
Should we add WebSockets, use SSE, or switch to GraphQL subscriptions? 
We have 3 engineers and ship weekly.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude will &lt;strong&gt;observe&lt;/strong&gt; your constraints, &lt;strong&gt;orient&lt;/strong&gt; around your team size and shipping cadence, &lt;strong&gt;decide&lt;/strong&gt; on one approach, and &lt;strong&gt;act&lt;/strong&gt; by providing the implementation plan.&lt;/p&gt;

&lt;p&gt;No more "it depends." You get a decision with reasoning.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;L99&lt;/code&gt; — Expert Depth
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;L99: Design a DynamoDB single-table schema &lt;span class="k"&gt;for &lt;/span&gt;a multi-tenant SaaS 
with per-tenant billing, usage metering, and team permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without L99, you get a tutorial answer. With L99, you get GSI overloading patterns, composite sort keys for time-series queries, TTL-based cleanup strategies, and the exact access patterns with their key conditions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;SCAFFOLD&lt;/code&gt; — Full Project Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SCAFFOLD: Production Next.js 15 app
- Prisma + PostgreSQL
- NextAuth with GitHub + Google
- Tailwind CSS
- Vitest + Playwright
- GitHub Actions CI/CD
- Vercel deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude generates the full directory structure, all config files, and boilerplate before touching business logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;PERSONA&lt;/code&gt; — Domain Expert Mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PERSONA: Senior AWS Solutions Architect with 10 years experience. 
Review this CloudFormation template &lt;span class="k"&gt;for &lt;/span&gt;production readiness.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This frames Claude's entire response through that expertise lens.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. System Prompt Insights You Can Exploit
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Be Terse
&lt;/h3&gt;

&lt;p&gt;The system prompt tells Claude Code to be direct. Mirror that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ❌ This triggers verbose mode&lt;/span&gt;
&lt;span class="s2"&gt;"Hey Claude, could you take a look at this function and let me know 
if there's anything that might be improved? Thanks!"&lt;/span&gt;

&lt;span class="c"&gt;# ✅ This gets the system prompt working for you&lt;/span&gt;
&lt;span class="s2"&gt;"What's wrong with this function? Fix it."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parallel Execution
&lt;/h3&gt;

&lt;p&gt;Claude Code can run tools simultaneously, but only when you make independence explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ❌ Sequential — Claude plays it safe&lt;/span&gt;
&lt;span class="s2"&gt;"Check the frontend components and then run the API tests"&lt;/span&gt;

&lt;span class="c"&gt;# ✅ Parallel — both fire at once  &lt;/span&gt;
&lt;span class="s2"&gt;"Two independent tasks:
1. Audit src/components/ for React anti-patterns
2. Run and fix failing tests in src/api/__tests__/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On large codebases, this cuts response time significantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bash Tool is King
&lt;/h3&gt;

&lt;p&gt;The leaked tool definitions show &lt;code&gt;bash&lt;/code&gt; is Claude Code's most capable tool. It can install packages, run tests, check git status, read files, and execute arbitrary commands.&lt;/p&gt;

&lt;p&gt;Power users lean into this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s2"&gt;"Run the test suite. If anything fails, read the failing test file, 
understand what it expects, then fix the source code. Repeat until green."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates an autonomous debugging loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. CLAUDE.md — Your Project's AI Memory
&lt;/h2&gt;

&lt;p&gt;The source confirms CLAUDE.md is loaded automatically. Here's a battle-tested template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project: [Name]&lt;/span&gt;

&lt;span class="gu"&gt;## Stack&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [Framework] + [Database] + [Deploy target]
&lt;span class="p"&gt;-&lt;/span&gt; Key deps: [list the non-obvious ones]

&lt;span class="gu"&gt;## Architecture Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [Decision 1]: [Why]
&lt;span class="p"&gt;-&lt;/span&gt; [Decision 2]: [Why]

&lt;span class="gu"&gt;## Code Conventions  &lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [Pattern]: [Where to use]
&lt;span class="p"&gt;-&lt;/span&gt; [Anti-pattern]: [What to avoid]

&lt;span class="gu"&gt;## Current Context&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Working on: [Current feature/sprint]
&lt;span class="p"&gt;-&lt;/span&gt; Recent changes: [What changed this week]
&lt;span class="p"&gt;-&lt;/span&gt; Known issues: [Active bugs]

&lt;span class="gu"&gt;## Testing&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Framework: [Vitest/Jest/Playwright]
&lt;span class="p"&gt;-&lt;/span&gt; Run: [exact command]
&lt;span class="p"&gt;-&lt;/span&gt; Coverage: [current %]

&lt;span class="gu"&gt;## Deploy&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Staging: [command]
&lt;span class="p"&gt;-&lt;/span&gt; Production: [command + checklist]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This replaces 10 minutes of context-setting at the start of every session.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Unreleased Features (From the Leak)
&lt;/h2&gt;

&lt;p&gt;These are built, tested, and hidden behind compile-time flags:&lt;/p&gt;

&lt;h3&gt;
  
  
  KAIROS — Background Agent Mode
&lt;/h3&gt;

&lt;p&gt;Referenced 150+ times in the source. An autonomous daemon that runs memory consolidation while you're idle. It can plan tasks, execute them in the background, and surface results when you return. Think: "Fix all the lint warnings while I'm at lunch."&lt;/p&gt;

&lt;h3&gt;
  
  
  BUDDY — AI Coding Companion
&lt;/h3&gt;

&lt;p&gt;A Tamagotchi-style pet that lives in your terminal. Species deterministically generated from your userId hash (salt: &lt;code&gt;friend-2026-401&lt;/code&gt;). Cosmetic hats. Speech bubbles. Claude generates its name and "soul description" on first hatch.&lt;/p&gt;

&lt;p&gt;Leaked internal notes suggest an April 1-7 teaser with full launch in May 2026. The &lt;code&gt;/buddy&lt;/code&gt; command did activate on April 1 as predicted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Voice Mode
&lt;/h3&gt;

&lt;p&gt;Talk to Claude Code. Useful for pair programming. In the source but not shipped.&lt;/p&gt;

&lt;h3&gt;
  
  
  ULTRAPLAN
&lt;/h3&gt;

&lt;p&gt;Extended planning mode with multi-step task decomposition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Undercover Mode
&lt;/h3&gt;

&lt;p&gt;Details sparse, but it's referenced in the feature flags.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. My Daily Workflow
&lt;/h2&gt;

&lt;p&gt;After 90 days, here's my exact process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Morning:
  claude --resume          # pick up where I left off
  /init                    # if new project, generate CLAUDE.md

Planning:
  Shift+Tab → plan mode    # architecture first
  OODA for decisions       # no "it depends"
  L99 for deep dives       # principal-engineer answers

Building:
  Parallel task prompts    # 2x speed on independent work
  SCAFFOLD for new modules # structure before code
  Autonomous bash loops    # "fix until green"

Shipping:
  /ghost for PR descriptions
  /ghost for changelog entries
  Review with PERSONA: "Senior reviewer focused on security"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Hands-On Practice
&lt;/h2&gt;

&lt;p&gt;If you want to practice these techniques with real AWS infrastructure, I've been building &lt;a href="https://cloudedventures.com" rel="noopener noreferrer"&gt;Cloud Edventures&lt;/a&gt; — guided missions in sandbox environments with automated validation. The AI Navigator path specifically covers Claude + Bedrock integration where you'll use a lot of these patterns.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/ghost&lt;/code&gt; and &lt;code&gt;OODA&lt;/code&gt; frameworks work in any AI tool though — start there.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Your Power-User Trick?
&lt;/h2&gt;

&lt;p&gt;I'm collecting Claude Code techniques for a follow-up post. If you've found something that changed your workflow, drop it in the comments.&lt;/p&gt;

&lt;p&gt;The gap between "using Claude Code" and "being a Claude Code power user" is wider than most people think. These frameworks close it.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
