<?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: Myron Zaiets</title>
    <description>The latest articles on DEV Community by Myron Zaiets (@myrondev).</description>
    <link>https://dev.to/myrondev</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%2F908493%2Ff1a7f705-8856-4842-aa3d-1e24a00e1cf0.png</url>
      <title>DEV Community: Myron Zaiets</title>
      <link>https://dev.to/myrondev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/myrondev"/>
    <language>en</language>
    <item>
      <title>Building AI Agents with Amazon Bedrock AgentCore Runtime: A Complete Setup Guide</title>
      <dc:creator>Myron Zaiets</dc:creator>
      <pubDate>Tue, 16 Sep 2025 12:25:47 +0000</pubDate>
      <link>https://dev.to/aws-builders/building-ai-agents-with-amazon-bedrock-agentcore-runtime-a-complete-setup-guide-50oh</link>
      <guid>https://dev.to/aws-builders/building-ai-agents-with-amazon-bedrock-agentcore-runtime-a-complete-setup-guide-50oh</guid>
      <description>&lt;h1&gt;
  
  
  Building AI Agents with Amazon Bedrock AgentCore Runtime: A Complete Setup Guide
&lt;/h1&gt;

&lt;p&gt;Amazon Bedrock AgentCore Runtime represents a significant leap forward in deploying AI agents at scale. This serverless platform enables developers to run AI agents with extended execution times, session isolation, and built-in observability. In this blog, we'll walk through a complete setup of a Bedrock AgentCore sample application that demonstrates the platform's capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Bedrock AgentCore Runtime?
&lt;/h2&gt;

&lt;p&gt;Bedrock AgentCore Runtime is AWS's serverless container platform specifically designed for AI agents. Unlike traditional serverless functions with strict time limits, AgentCore supports workloads up to 8 hours, making it perfect for complex AI workflows that require extended processing time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extended Execution&lt;/strong&gt;: Up to 8-hour workloads for complex AI tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Isolation&lt;/strong&gt;: Each user session runs in a dedicated microVM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework Agnostic&lt;/strong&gt;: Compatible with LangGraph, Strands, CrewAI, or custom frameworks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Flexibility&lt;/strong&gt;: Works with any LLM (Bedrock, OpenAI, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in Observability&lt;/strong&gt;: Integrated CloudWatch monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The sample application consists of three main components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CDK Infrastructure Stack&lt;/strong&gt;: Creates ECR repository and IAM execution roles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent Runtime&lt;/strong&gt;: Containerized agent using the Strands framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Integration&lt;/strong&gt;: Bedrock Memory for conversation continuity
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   CDK Stack     │    │  AgentCore       │    │  Bedrock        │
│                 │    │  Runtime         │    │  Memory         │
│ • ECR Repo      │───▶│                  │───▶│                 │
│ • IAM Roles     │    │ • Agent Container│    │ • Session Store │
│ • Permissions   │    │ • Strands Agent  │    │ • Context       │
└─────────────────┘    └──────────────────┘    └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS CLI configured with appropriate credentials&lt;/li&gt;
&lt;li&gt;Node.js 18+ and npm&lt;/li&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;AWS CDK v2 installed globally: &lt;code&gt;npm install -g aws-cdk&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Docker (optional, for local testing)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Required AWS Permissions
&lt;/h3&gt;

&lt;p&gt;Your AWS credentials need these permissions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bedrock-agentcore:*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;iam:CreateRole&lt;/code&gt;, &lt;code&gt;iam:AttachRolePolicy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ecr:CreateRepository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloudformation:*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logs:*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, you would have to enable Claude 4 model in your region:&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%2F9gvs18cblecm3n70avse.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%2F9gvs18cblecm3n70avse.png" alt=" " width="800" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure Setup with CDK
&lt;/h2&gt;

&lt;p&gt;The CDK stack creates the necessary AWS resources:&lt;/p&gt;

&lt;h3&gt;
  
  
  ECR Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agentRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ecr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Repository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AgentRepository&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;repositoryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bedrock-agentcore-sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;removalPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RemovalPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DESTROY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  IAM Execution Role
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;executionRole&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Role&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AgentCoreExecutionRole&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;assumedBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ServicePrincipal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bedrock-agentcore.amazonaws.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;inlinePolicies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;AgentCorePolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PolicyDocument&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;statements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PolicyStatement&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bedrock:InvokeModel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bedrock-agent:CreateEvent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bedrock-agent:GetMemory&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;logs:CreateLogGroup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;// ... additional permissions&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Agent Implementation
&lt;/h2&gt;

&lt;p&gt;The core agent uses the Strands framework with Bedrock Memory integration:&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;from&lt;/span&gt; &lt;span class="n"&gt;bedrock_agentcore&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentCoreApp&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BedrockAgentCoreApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.entrypoint&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&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;prompt&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;Hello!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;session_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;custom-session-12345678901234567890123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Memory integration for conversation continuity
&lt;/span&gt;    &lt;span class="n"&gt;memory_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-agent&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;eu-central-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;# Store user message and retrieve context
&lt;/span&gt;    &lt;span class="c1"&gt;# Get agent response with enhanced context
&lt;/span&gt;    &lt;span class="c1"&gt;# Store agent response for future context
&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;result&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="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sessionId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deployment Process
&lt;/h2&gt;

&lt;p&gt;The deployment is automated through a Python script that handles both infrastructure and agent deployment:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Infrastructure Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npx cdk bootstrap &lt;span class="nt"&gt;--region&lt;/span&gt; eu-central-1
npx cdk deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Agent Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;agent
pip &lt;span class="nb"&gt;install &lt;/span&gt;bedrock-agentcore strands-agents bedrock-agentcore-starter-toolkit
agentcore configure &lt;span class="nt"&gt;-e&lt;/span&gt; my_agent.py &lt;span class="nt"&gt;--region&lt;/span&gt; eu-central-1
agentcore launch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Once deployed, you will see the runtime in AgentCore interface:
&lt;/h3&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%2F4tqslp6urr3omepv9pbg.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%2F4tqslp6urr3omepv9pbg.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Details
&lt;/h2&gt;

&lt;p&gt;The agent configuration is managed through &lt;code&gt;.bedrock_agentcore.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;default_agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my_agent&lt;/span&gt;
&lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;my_agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my_agent&lt;/span&gt;
    &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my_agent.py&lt;/span&gt;
    &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;linux/arm64&lt;/span&gt;
    &lt;span class="na"&gt;aws&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eu-central-1&lt;/span&gt;
      &lt;span class="na"&gt;network_configuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;network_mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PUBLIC&lt;/span&gt;
      &lt;span class="na"&gt;observability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Memory Integration
&lt;/h2&gt;

&lt;p&gt;One of the standout features is the integration with Bedrock Memory for conversation continuity:&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;# Store conversation events
&lt;/span&gt;&lt;span class="n"&gt;memory_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;memoryId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MEMORY_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;actorId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ACTOR_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sessionId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;eventTimestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;payload&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;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;user_message&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="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Retrieve conversation context
&lt;/span&gt;&lt;span class="n"&gt;memory_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_memory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;memoryId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MEMORY_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;actorId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ACTOR_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sessionId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Your Agent
&lt;/h2&gt;

&lt;p&gt;Once deployed, test your agent:&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="nb"&gt;cd &lt;/span&gt;agent
agentcore invoke &lt;span class="s1"&gt;'{"prompt": "What can you help me with?"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bonus deployment
&lt;/h2&gt;

&lt;p&gt;Let's quickly add CloudFront and Api Gateway with Lambda that will call this agent:&lt;/p&gt;

&lt;p&gt;Lambda looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
import json
import boto3
import uuid
from datetime import datetime

def handler&lt;span class="o"&gt;(&lt;/span&gt;event, context&lt;span class="o"&gt;)&lt;/span&gt;:
    try:
        &lt;span class="c"&gt;# Parse request&lt;/span&gt;
        body &lt;span class="o"&gt;=&lt;/span&gt; json.loads&lt;span class="o"&gt;(&lt;/span&gt;event[&lt;span class="s1"&gt;'body'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
        prompt &lt;span class="o"&gt;=&lt;/span&gt; body.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'prompt'&lt;/span&gt;, &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;# Create AgentCore client (same region)&lt;/span&gt;
        client &lt;span class="o"&gt;=&lt;/span&gt; boto3.client&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'bedrock-agentcore'&lt;/span&gt;, &lt;span class="nv"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'eu-central-1'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;# Generate consistent session ID (same as agent uses)&lt;/span&gt;
        session_id &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'custom-session-12345678901234567890123'&lt;/span&gt;

        &lt;span class="c"&gt;# Call AgentCore Runtime&lt;/span&gt;
        payload &lt;span class="o"&gt;=&lt;/span&gt; json.dumps&lt;span class="o"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;"prompt"&lt;/span&gt;: prompt&lt;span class="o"&gt;})&lt;/span&gt;

        response &lt;span class="o"&gt;=&lt;/span&gt; client.invoke_agent_runtime&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;agentRuntimeArn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'arn:aws:bedrock-agentcore:eu-central-1:{accountId}:runtime/my_agent-{customString}'&lt;/span&gt;,
            &lt;span class="nv"&gt;runtimeSessionId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;session_id,
            &lt;span class="nv"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;payload,
            &lt;span class="nv"&gt;qualifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DEFAULT"&lt;/span&gt;
        &lt;span class="o"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;# Parse response&lt;/span&gt;
        response_body &lt;span class="o"&gt;=&lt;/span&gt; b&lt;span class="s1"&gt;''&lt;/span&gt;.join&lt;span class="o"&gt;(&lt;/span&gt;response[&lt;span class="s1"&gt;'response'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;.decode&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utf-8'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        response_data &lt;span class="o"&gt;=&lt;/span&gt; json.loads&lt;span class="o"&gt;(&lt;/span&gt;response_body&lt;span class="o"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'statusCode'&lt;/span&gt;: 200,
            &lt;span class="s1"&gt;'headers'&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;: &lt;span class="s1"&gt;'application/json'&lt;/span&gt;,
                &lt;span class="s1"&gt;'Access-Control-Allow-Origin'&lt;/span&gt;: &lt;span class="s1"&gt;'*'&lt;/span&gt;,
                &lt;span class="s1"&gt;'Access-Control-Allow-Methods'&lt;/span&gt;: &lt;span class="s1"&gt;'POST, OPTIONS'&lt;/span&gt;,
                &lt;span class="s1"&gt;'Access-Control-Allow-Headers'&lt;/span&gt;: &lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;,
            &lt;span class="s1"&gt;'body'&lt;/span&gt;: json.dumps&lt;span class="o"&gt;({&lt;/span&gt;
                &lt;span class="s1"&gt;'response'&lt;/span&gt;: response_data[&lt;span class="s1"&gt;'result'&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'content'&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;0][&lt;span class="s1"&gt;'text'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
                &lt;span class="s1"&gt;'sessionId'&lt;/span&gt;: session_id
            &lt;span class="o"&gt;})&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

    except Exception as e:
        print&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;"Error: {str(e)}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'statusCode'&lt;/span&gt;: 500,
            &lt;span class="s1"&gt;'headers'&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;: &lt;span class="s1"&gt;'application/json'&lt;/span&gt;,
                &lt;span class="s1"&gt;'Access-Control-Allow-Origin'&lt;/span&gt;: &lt;span class="s1"&gt;'*'&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;,
            &lt;span class="s1"&gt;'body'&lt;/span&gt;: json.dumps&lt;span class="o"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;'error'&lt;/span&gt;: str&lt;span class="o"&gt;(&lt;/span&gt;e&lt;span class="o"&gt;)})&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Api Gateway definition:&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%2F6tgtatkxeezps5lmoesf.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%2F6tgtatkxeezps5lmoesf.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also added CloudFront with S3 as OAC origin. So once visiting our CloudFront url we can see:&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%2Ftw309qn7tnglu14wvcrc.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%2Ftw309qn7tnglu14wvcrc.png" alt=" " width="797" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's test the memory:&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%2Ffs1g46m7jogfnhyv52lz.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%2Ffs1g46m7jogfnhyv52lz.png" alt=" " width="771" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I open another tab and ask about my name:&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%2F50dkzpbg5x4gt8tozzkl.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%2F50dkzpbg5x4gt8tozzkl.png" alt=" " width="765" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Production
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use least privilege IAM policies&lt;/li&gt;
&lt;li&gt;Implement proper session management&lt;/li&gt;
&lt;li&gt;Enable CloudWatch logging for monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Configure appropriate memory and CPU limits&lt;/li&gt;
&lt;li&gt;Use ARM64 platform for cost optimization&lt;/li&gt;
&lt;li&gt;Implement proper error handling and retries&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monitoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enable observability in agent configuration&lt;/li&gt;
&lt;li&gt;Set up CloudWatch alarms for error rates&lt;/li&gt;
&lt;li&gt;Monitor execution duration and costs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cleanup
&lt;/h2&gt;

&lt;p&gt;To remove all resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cdk destroy
&lt;span class="c"&gt;# Delete the AgentCore Runtime from console or CLI&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Bedrock AgentCore Runtime provides a powerful platform for deploying AI agents with enterprise-grade features. The combination of extended execution times, session isolation, and built-in observability makes it ideal for complex AI workflows.&lt;/p&gt;

&lt;p&gt;The sample application demonstrates how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up infrastructure with CDK&lt;/li&gt;
&lt;li&gt;Deploy agents with memory integration&lt;/li&gt;
&lt;li&gt;Implement conversation continuity&lt;/li&gt;
&lt;li&gt;Monitor and observe agent performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup provides a solid foundation for building production-ready AI agents that can handle complex, long-running tasks while maintaining conversation context across sessions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;For more details, refer to the &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/" rel="noopener noreferrer"&gt;AWS Bedrock AgentCore Documentation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>tutorial</category>
      <category>bedrock</category>
      <category>programming</category>
    </item>
    <item>
      <title>AWS CloudFormation Git Sync</title>
      <dc:creator>Myron Zaiets</dc:creator>
      <pubDate>Thu, 18 Jan 2024 18:01:25 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-cloudformation-git-sync-1bkc</link>
      <guid>https://dev.to/aws-builders/aws-cloudformation-git-sync-1bkc</guid>
      <description>&lt;p&gt;&lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt; has become the cornerstone of modern cloud management, empowering developers and DevOps teams to declaratively define and provision their cloud resources. CloudFormation is a leading IaC tool from Amazon Web Services (AWS), enabling you to define your infrastructure in templates and then automate its deployment and management. However, maintaining and updating these templates can be a time-consuming and error-prone task.&lt;/p&gt;

&lt;p&gt;CloudFormation allows you to sync with your Git repo now, so there is no need for manual deployments, your infrastructure always reflects the latest version of your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s speak about the benefits of Git Sync:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Continuous Deployment for Infrastructure: Automate the deployment of your infrastructure changes with every commit or pull request to your Git repository.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Improved Collaboration and Version Control: Leverage the power of Git for collaboration and version control.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Simplified Infrastructure Management: Automate infrastructure updates and reduce the burden of manual deployments. You don’t need GitHub Action to deploy to AWS.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s start with Git Sync:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Create a Git Repository: Initialize a new Git repository to store your CloudFormation templates.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Configure CloudFormation Git Sync.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Create a CloudFormation Stack.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Deploy Infrastructure Changes: Commit your changes to your Git repository, and CloudFormation Git Sync will automatically deploy the updated infrastructure.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s discuss the points 2 and 3.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuring Git SYNC in CloudFormation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firstly, you need to create a connection. As you can see, there are several repository providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fm6suca342d0fhzh1wygb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fm6suca342d0fhzh1wygb.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Once the connection is ready, you need 2 roles:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The role is to update the stack from Git. Use this link to create a role: &lt;a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/git-sync-prereq.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/git-sync-prereq.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fm1g2xqi28irz6t8tmuha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fm1g2xqi28irz6t8tmuha.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CF role to interact with AWS resources. You can add an admin policy just for testing purposes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2F5hemyw7m5gfun08q2mj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F5hemyw7m5gfun08q2mj7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once roles are ready, let’s create a stack:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fvbf01c9m6sjw83ehfqza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fvbf01c9m6sjw83ehfqza.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the Git sync status is enabled. My deployment-file.yaml looks this way:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F5b6104nrnz4v26wnnn0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F5b6104nrnz4v26wnnn0d.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So Git will constantly monitor changes in vpc.yaml file. Let’s add some SG to our template:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fr6ifikugtxy7oixhp87p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fr6ifikugtxy7oixhp87p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, CF after a few seconds after commit will create a changeset:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fixznvkpve9n9k3zpu04n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fixznvkpve9n9k3zpu04n.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, we will check a template in CF console, our template is updated and SG was successfully created:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fimuid7dx9nvp0n6bqcvy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fimuid7dx9nvp0n6bqcvy.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudFormation Git Sync&lt;/strong&gt; is a valuable tool for streamlining your infrastructure automation and deployment processes. By integrating your CloudFormation templates with your Git repository, you can automate infrastructure updates, improve collaboration, and simplify infrastructure management. Embrace the power of continuous deployment for your infrastructure and experience the benefits of enhanced agility and reduced risk.&lt;/p&gt;

&lt;p&gt;Thank you for your time.&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudformation</category>
      <category>git</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ECS Exec (AWS Fargate)</title>
      <dc:creator>Myron Zaiets</dc:creator>
      <pubDate>Fri, 05 Jan 2024 16:21:30 +0000</pubDate>
      <link>https://dev.to/aws-builders/ecs-exec-aws-fargate-86j</link>
      <guid>https://dev.to/aws-builders/ecs-exec-aws-fargate-86j</guid>
      <description>&lt;p&gt;Use of ECS Exec feature&lt;/p&gt;

&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;When using ECS, sometimes you will want to debug your app by trying to connect to it.&lt;/p&gt;

&lt;p&gt;ECS Exec is an Amazon Elastic Container Service (ECS) feature that allows you to execute commands in or get a shell to a container running on an Amazon EC2 instance or AWS Fargate. This makes it easier to collect diagnostic information and quickly troubleshoot errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An ECS cluster&lt;/li&gt;
&lt;li&gt;A task running in the cluster&lt;/li&gt;
&lt;li&gt;An IAM role with permissions to execute commands in containers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ECS Exec can be used for a variety of purposes, including:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debugging container applications&lt;/li&gt;
&lt;li&gt;Collecting diagnostic information&lt;/li&gt;
&lt;li&gt;Installing packages&lt;/li&gt;
&lt;li&gt;Running scripts&lt;/li&gt;
&lt;li&gt;Additional Considerations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;When using ECS Exec, it is important to be aware of the following:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The IAM role used to execute the command must have the necessary permissions to execute commands in the container.&lt;/p&gt;

&lt;p&gt;The container must be running in a state that allows execution. For example, the container must not be stopped or terminated.&lt;/p&gt;

&lt;p&gt;The container must be running on a compatible infrastructure. For example, the container must run on an Amazon EC2 instance or AWS Fargate.&lt;/p&gt;

&lt;p&gt;ECS Exec is not currently supported using the AWS Management Console.&lt;/p&gt;

&lt;p&gt;There is a beneficial tool where you can check prerequisites — &lt;a href="https://github.com/aws-containers/amazon-ecs-exec-checker" rel="noopener noreferrer"&gt;https://github.com/aws-containers/amazon-ecs-exec-checker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additional info you can find here: &lt;a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Once you have all IAM permissions, and you install the session manager plugin, we can try to connect to the ECS task.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Use AWS CLI and try this command:&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

aws ecs create-service \
    --cluster YOUR_CLUSTER_NAME \
    --task-definition TASK_DEFINITION_NAME \
    --enable-execute-command \
    --launch-type FARGATE \
    --service-name SERVICE_NAME\
    --desired-count 1 \
    --region eu-west-1 \
    --network-configuration "awsvpcConfiguration={subnets=[SUBNET_NAME],securityGroups=[SG_NAME],assignPublicIp=ENABLED}"


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Let’s check the ECS console now:&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fxz7pzbih4gsxxfzuq7m6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fxz7pzbih4gsxxfzuq7m6.png" alt="ecs console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, our task is running, so now we can connect to a container.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Now we run the execute statement:&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

aws ecs execute-command --cluster YOUR_CLUSTER_NAME \
    --task 69e2ecb626944671b9ad9c5199d911ef \
    --container CONTAINER_NAME \
    --interactive \
    --command "/bin/sh"


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;You will see this output, so now you can communicate with a container:&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2F2drmx4s4erhk7yggicqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2drmx4s4erhk7yggicqr.png" alt="cli output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- If you’ve already created an ECS Service, but want to enable the ECS exec command you can do this also, using this command:&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

aws ecs update-service SERVICE_NAME --cluster YOUR_CLUSTER_NAME \
  --enable-execute-command \
  --force-new-deployment


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That’s all.&lt;/p&gt;

&lt;p&gt;Now you can debug your apps by using the ECS exec feature.&lt;/p&gt;

&lt;p&gt;Thank you for your time.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ecs</category>
      <category>containers</category>
      <category>microservices</category>
    </item>
  </channel>
</rss>
