<?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: William Leung</title>
    <description>The latest articles on DEV Community by William Leung (@lshw54).</description>
    <link>https://dev.to/lshw54</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%2F717013%2Fe7dbf3eb-a10d-466f-8769-afbae1a83b8b.png</url>
      <title>DEV Community: William Leung</title>
      <link>https://dev.to/lshw54</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lshw54"/>
    <language>en</language>
    <item>
      <title>Building a Cost-Effective Autonomous Threat Containment System on AWS</title>
      <dc:creator>William Leung</dc:creator>
      <pubDate>Sat, 06 Dec 2025 12:10:06 +0000</pubDate>
      <link>https://dev.to/lshw54/building-a-cost-effective-autonomous-threat-containment-system-on-aws-2mkk</link>
      <guid>https://dev.to/lshw54/building-a-cost-effective-autonomous-threat-containment-system-on-aws-2mkk</guid>
      <description>&lt;p&gt;This year at AWS re:Invent 2025, I didn't fly out to Las Vegas. Instead, I followed along remotely—streaming the keynotes live and keeping a close eye on the AWS Blog announcements. Watching Amazon Bedrock AgentCore introduce Policy controls, Episodic Memory, and Gateway integrations, I found myself both excited and curious.&lt;/p&gt;

&lt;p&gt;But after absorbing all these impressive announcements, a practical question kept coming back to me: How do I actually start building autonomous security systems without committing to expensive managed services from day one?&lt;/p&gt;

&lt;p&gt;This post documents my journey building a &lt;strong&gt;proof-of-concept&lt;/strong&gt; Autonomous Threat Containment Agent using native AWS services. I'll share what worked, what broke, and how the new AgentCore capabilities could elevate this architecture to production-grade.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AWS re:Invent 2025 Context
&lt;/h2&gt;

&lt;p&gt;Before diving into implementation, let me summarize the key announcements that inspired this project:&lt;/p&gt;

&lt;h3&gt;
  
  
  Amazon Bedrock AgentCore Updates
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Policy in AgentCore (Preview)&lt;/strong&gt;: Define deterministic, real-time controls over agent actions using Cedar language or natural language. Policies integrate with AgentCore Gateway to intercept tool calls in milliseconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AgentCore Evaluations (Preview)&lt;/strong&gt;: Continuous quality assessment with 13 pre-built evaluators covering correctness, helpfulness, and tool selection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Episodic Memory&lt;/strong&gt;: Agents can learn from experiences over time. For incident response, your agent can remember that last month's GuardDuty finding was a false positive.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cost Reality Check
&lt;/h3&gt;

&lt;p&gt;Here's the thing—AgentCore Gateway, Memory, and Policy are powerful, but they come with costs that might not make sense for initial experimentation. I wanted to validate the &lt;em&gt;patterns&lt;/em&gt; before committing to managed services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The answer: validate patterns using native AWS services.&lt;/strong&gt; My POC cost approximately &lt;strong&gt;$0.15&lt;/strong&gt; to build and test.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;My goal was to create a system that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detects&lt;/strong&gt; security threats from GuardDuty&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enriches&lt;/strong&gt; findings with correlated signals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks historical context&lt;/strong&gt; (simulated episodic memory)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluates policies&lt;/strong&gt; before taking action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executes containment&lt;/strong&gt; (isolation, forensic snapshots)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifies&lt;/strong&gt; the security team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Records episodes&lt;/strong&gt; for future learning
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                  GuardDuty Sample Findings                  │
│               (Free test events, real format)               │
└─────────────────────────────┬───────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│           EventBridge Rule (severity &amp;gt;= 4 filter)           │
└─────────────────────────────┬───────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│              Step Functions State Machine                   │
│                                                             │
│  Enrich → Check Memory → Evaluate Policy → Containment      │
│                                    │                        │
│                                    ▼                        │
│                   Parallel: Snapshot + Isolate              │
│                                    │                        │
│                                    ▼                        │
│                    Notify SOC → Record Episode              │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Design Decisions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step Functions as Orchestrator&lt;/strong&gt;: Visual debugging, built-in error handling, parallel execution—costs pennies for low-volume workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DynamoDB as Episodic Memory&lt;/strong&gt;: Simple GSI query on &lt;code&gt;findingType&lt;/code&gt; for similar past incidents. Not as sophisticated as AgentCore Memory's semantic search, but demonstrates the pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lambda-based Policy Engine&lt;/strong&gt;: Cedar-inspired rules in Python. Changes require redeployment, but validates the concept.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GuardDuty Sample Findings&lt;/strong&gt;: The key insight! &lt;code&gt;CreateSampleFindings&lt;/code&gt; API generates events that flow through EventBridge exactly like real threats—perfect for testing.&lt;/p&gt;


&lt;h2&gt;
  
  
  Lessons Learned the Hard Way
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The EventBridge Severity Filter Gotcha
&lt;/h3&gt;

&lt;p&gt;My initial EventBridge rule:&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;"source"&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="s2"&gt;"aws.guardduty"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detail-type"&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="s2"&gt;"GuardDuty Finding"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detail"&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;"severity"&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="nl"&gt;"numeric"&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="s2"&gt;"&amp;gt;="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&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;I generated sample findings and... nothing happened. Zero Step Functions executions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The debugging process:&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;# Check EventBridge invocations&lt;/span&gt;
aws cloudwatch get-metric-statistics &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; AWS/Events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metric-name&lt;/span&gt; Invocations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dimensions&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;RuleName,Value&lt;span class="o"&gt;=&lt;/span&gt;ThreatContainmentTrigger &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--start-time&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'1 hour ago'&lt;/span&gt; +%Y-%m-%dT%H:%M:%SZ&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--end-time&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; +%Y-%m-%dT%H:%M:%SZ&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--period&lt;/span&gt; 300 &lt;span class="nt"&gt;--statistics&lt;/span&gt; Sum

&lt;span class="c"&gt;# Result: {"Datapoints": []}  -- No invocations!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When I manually tested Step Functions, it worked perfectly. The issue was the EventBridge-to-Step Functions connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two problems discovered:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IAM Role permissions hadn't propagated&lt;/strong&gt;: Always verify with:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam get-role-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-name&lt;/span&gt; ThreatContainmentEventBridgeRole &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-name&lt;/span&gt; InvokeStepFunctions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sample finding severity was too low&lt;/strong&gt;: &lt;code&gt;UnauthorizedAccess:EC2/SSHBruteForce&lt;/code&gt; has severity &lt;code&gt;2.0&lt;/code&gt;, which doesn't match &lt;code&gt;&amp;gt;= 4&lt;/code&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding Type&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Matches &amp;gt;= 4?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UnauthorizedAccess:EC2/SSHBruteForce&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Backdoor:EC2/C&amp;amp;CActivity.B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CryptoCurrency:EC2/BitcoinTool.B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The fix:&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 guardduty create-sample-findings &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--detector-id&lt;/span&gt; &lt;span class="nv"&gt;$DETECTOR_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--finding-types&lt;/span&gt; &lt;span class="s2"&gt;"Backdoor:EC2/C&amp;amp;CActivity.B"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  The Lambda Policy Engine
&lt;/h3&gt;

&lt;p&gt;Here's my Cedar-inspired policy logic:&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;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;enriched&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&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;enriched&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;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&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;memoryContext&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;ctx&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;severity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;enriched&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;severity&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;falsePositiveRate&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&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;falsePositiveRate&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;isSampleFinding&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;enriched&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;isSampleFinding&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;correlationScore&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;enriched&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;correlationScore&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="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Policy 1: Sample findings - forensics only
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;isSampleFinding&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="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;action&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;PERMIT_NON_DESTRUCTIVE&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;policyName&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;sample-finding-safe-mode&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;allowDestructiveActions&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="c1"&gt;# Policy 2: High false positive rate - require review
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;falsePositiveRate&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="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;action&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;REQUIRE_APPROVAL&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;policyName&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;high-false-positive&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;requiresHumanApproval&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="c1"&gt;# Default: permit
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;action&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;PERMIT&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;policyName&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;default-permit&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;allowDestructiveActions&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This works, but it's brittle. Compare to AgentCore Policy:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Allow isolation only when severity &amp;gt;= 7 
 AND correlation score &amp;gt;= 1 
 AND resource is not tagged critical-infrastructure"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Natural language, automatically converted to Cedar, validated against schemas.&lt;/p&gt;


&lt;h2&gt;
  
  
  Successful Execution
&lt;/h2&gt;

&lt;p&gt;After fixing the issues:&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="nv"&gt;$ &lt;/span&gt;aws stepfunctions list-executions &lt;span class="nt"&gt;--state-machine-arn&lt;/span&gt; &lt;span class="nv"&gt;$STATE_MACHINE_ARN&lt;/span&gt;

Name                                    Status     
29412f07-f4f5-..._a25c994c-b3cd-...    SUCCEEDED  
29412f07-f4f5-..._38d9c825-0538-...    SUCCEEDED  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;DynamoDB captured the episodes, SNS delivered alerts with full context. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbimcvppeurbyk0zb4wfk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbimcvppeurbyk0zb4wfk.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Path to Production: AgentCore Upgrades
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Current (POC)&lt;/th&gt;
&lt;th&gt;AgentCore (Production)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lambda policy engine&lt;/td&gt;
&lt;td&gt;Policy (Cedar + NLP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB queries&lt;/td&gt;
&lt;td&gt;Memory (semantic search)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct Lambda invocation&lt;/td&gt;
&lt;td&gt;Gateway (MCP discovery)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No quality monitoring&lt;/td&gt;
&lt;td&gt;Evaluations (continuous)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Cost Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;POC&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;~$0.025/1K&lt;/td&gt;
&lt;td&gt;AgentCore Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;~$1.25/1M writes&lt;/td&gt;
&lt;td&gt;AgentCore Memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;FREE&lt;/strong&gt; (samples)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FREE&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total POC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$0.15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$50+&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Full source code available on GitHub:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lshw54" rel="noopener noreferrer"&gt;
        lshw54
      &lt;/a&gt; / &lt;a href="https://github.com/lshw54/aws-threat-containment-agent-demo" rel="noopener noreferrer"&gt;
        aws-threat-containment-agent-demo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Autonomous threat containment agent built with AWS native services
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;AWS Threat Containment Agent&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cb8fa6b36206f7e89580bf55e91e6ab34352c97b2361b99c0ab4f630d0ad39df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4157532d53656375726974792d6f72616e67653f6c6f676f3d616d617a6f6e2d617773" alt="AWS"&gt;&lt;/a&gt;
&lt;a href="https://github.com/lshw54/aws-threat-containment-agent-demo/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://aws.amazon.com/guardduty/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e10ef87bf8b9189d3f3451774459893aafa25e9c9accdfb56124a3eae9ef404e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4775617264447574792d456e61626c65642d677265656e" alt="GuardDuty"&gt;&lt;/a&gt;
&lt;a href="https://aws.amazon.com/step-functions/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/747c2ce47f905a46561d13406acb79050ca3a58961ff70b08ff70000bf0d44b3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5374657025323046756e6374696f6e732d4f726368657374726174696f6e2d707572706c65" alt="Step Functions"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A cost-effective, serverless autonomous threat containment system built on AWS. This POC demonstrates how to automatically detect, analyze, and respond to security threats using native AWS services—inspired by the agentic AI patterns announced at AWS re:Invent 2025.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/lshw54/aws-threat-containment-agent-demo/docs/stepfunctions-architecture.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flshw54%2Faws-threat-containment-agent-demo%2Fdocs%2Fstepfunctions-architecture.png" alt="Architecture"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This project implements an &lt;strong&gt;autonomous security response pipeline&lt;/strong&gt; that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detects&lt;/strong&gt; threats via Amazon GuardDuty&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enriches&lt;/strong&gt; findings with correlated signals from Security Hub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluates&lt;/strong&gt; containment policies (Cedar-inspired rules)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks&lt;/strong&gt; incident memory for similar past events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executes&lt;/strong&gt; containment actions (isolation, forensic snapshots)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifies&lt;/strong&gt; the security team via SNS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Records&lt;/strong&gt; episodes for future learning&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Why This Project?&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;After attending AWS re:Invent 2025 and seeing the Amazon Bedrock AgentCore announcements, I wanted to validate the &lt;strong&gt;agentic security patterns&lt;/strong&gt; without committing to expensive managed services upfront. This POC cost approximately &lt;strong&gt;$0.15&lt;/strong&gt; to build and test.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏗️ Architecture&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────────┐
│                     GuardDuty (Sample Findings for Testing)             │
└────────────────────────────────┬────────────────────────────────────────┘
                                 │
                                 ▼
┌─────────────────────────────────────────────────────────────────────────┐
│              EventBridge Rule&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lshw54/aws-threat-containment-agent-demo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;Deploy in minutes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/lshw54/aws-threat-containment-agent-demo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;aws-threat-containment-agent-demo
./deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add handlers for S3, IAM, Kubernetes threats&lt;/li&gt;
&lt;li&gt;Implement rollback automation&lt;/li&gt;
&lt;li&gt;Build SOC feedback UI&lt;/li&gt;
&lt;li&gt;Migrate to AgentCore when patterns are battle-tested&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AWS re:Invent 2025 announcements have given us a clear vision. The infrastructure is ready. From here, it's about exploring what works for your specific use case.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>serverless</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
