<?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: Veliswa_Boya 🇿🇦</title>
    <description>The latest articles on DEV Community by Veliswa_Boya 🇿🇦 (@vel12171).</description>
    <link>https://dev.to/vel12171</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%2F173716%2Fd7079eb3-3d89-41ce-b5de-81c4af292e7e.jpg</url>
      <title>DEV Community: Veliswa_Boya 🇿🇦</title>
      <link>https://dev.to/vel12171</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vel12171"/>
    <language>en</language>
    <item>
      <title>A beginner's guide to understanding tools in Strands Agents | Part 1</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Wed, 01 Apr 2026 12:40:53 +0000</pubDate>
      <link>https://dev.to/vel12171/a-beginners-guide-to-understanding-tools-in-strands-agents-part-1-1381</link>
      <guid>https://dev.to/vel12171/a-beginners-guide-to-understanding-tools-in-strands-agents-part-1-1381</guid>
      <description>&lt;p&gt;We're now in the world of agents. Agents do the work for you by acting on an instruction you give them. So if you're building agents, understanding how to add tools to your agents helps you build agents that don't just chat, but can also do stuff for you. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://strandsagents.com/docs/user-guide/concepts/tools/" rel="noopener noreferrer"&gt;Tools are how you extend the capabilities&lt;/a&gt; of an agent. Using tools, agents can access and search external information such as the internet, databases, and APIs. With tools, agents also perform calculations and specialized processing such as mathematical operations, data analysis, and more. They can create, modify, and manage content by generating documents, execute code or system commands, and connect to any external service such as weather APIs, payment systems, and enterprise software.&lt;/p&gt;

&lt;p&gt;Simply put, I like to think of tools as a makeup artist's toolkit; just like a makeup artist chooses specific brushes and products based on the look they're creating, the agent selects the right tools for the job. Ok, maybe a different analogy for you, think of tools as a chef's equipment, the chef doesn't use every pot and pan for every dish, but selects the right tools based on the tasty dish they're preparing. Your agent orchestrates its tools to complete your request and what I find really great here is that you don't tell the agent which tools to use, it figures it out on its own through autonomous reasoning.&lt;/p&gt;

&lt;p&gt;In this post which is Part 1 of a series, I'll introduce you to tools in agentic AI, show you how &lt;a href="https://strandsagents.com/" rel="noopener noreferrer"&gt;Strands Agents SDK&lt;/a&gt; implements them, and walk you through a real example, a Seasonal Wardrobe Curator Agent I built using Strands. By the end, you'll understand what tools are, why you should care about them if you're building agents, and how to use tools with your own agents.&lt;/p&gt;

&lt;p&gt;I want the Seasonal Wardrobe Curator Agent to do the &lt;strong&gt;tasks outlined below&lt;/strong&gt;, so keep all this in mind as we start to look at the code in the subsequent sections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You [agent] help users curate their wardrobe for the current season by:
1. First determining what season it is.
2. You understand their gender and style preferences.
3. You research recent fashion shows and trending styles for the current season.
4. Then, you create a curated wardrobe shopping list with checkboxes.
5. Finally, calculate budget estimates in South African Rand (ZAR) when asked.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools in Strands Agents SDK
&lt;/h2&gt;

&lt;p&gt;Now, looking at how Strands Agents SDK implements tools, there are two types of tools in Strands; built-in tools and custom tools. Let's dive in to each one of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Built-in tools
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://strandsagents.com/docs/user-guide/concepts/tools/community-tools-package/" rel="noopener noreferrer"&gt;Strands Agents Tools is a community-driven project&lt;/a&gt; that provides a powerful, ready-to-use set of (built-in) tools for your agents.  &lt;/p&gt;

&lt;p&gt;Here's the import to load them to our 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;from&lt;/span&gt; &lt;span class="n"&gt;strands_tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;  &lt;span class="c1"&gt;# For point 5 in the task outline above, budget calc.
&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="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# One line—that's it!
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With one import line you've loaded tools (in this case, the &lt;strong&gt;Calculator&lt;/strong&gt; tool, ready to use by your agent. Because this is a built-in tool, there's no decorator required and due to it being from a community-driven project, you're assured that it's being tested and maintained by the community. &lt;a href="https://strandsagents.com/docs/user-guide/concepts/tools/community-tools-package/#available-tools" rel="noopener noreferrer"&gt;Common built-in tools&lt;/a&gt; include the Calculator for mathematical operations, HTTP request for API interactions, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Custom tools
&lt;/h3&gt;

&lt;p&gt;When you need domain-specific functionality that doesn't exist in the community package, you can create custom tools using the &lt;code&gt;@tool&lt;/code&gt; decorator. Here's an implementation for the season detector functionality (&lt;strong&gt;point 1 in the task outline above&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;from&lt;/span&gt; &lt;span class="n"&gt;strands.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;SEASON_MAP&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;southern&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="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&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;Summer&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Autumn&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="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Winter&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="mi"&gt;9&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="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Spring&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;northern&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="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&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;Winter&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Spring&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="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summer&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="mi"&gt;9&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="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Autumn&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;SOUTHERN_LOCATIONS&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;South Africa&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;Southern Hemisphere&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;Australia&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;New Zealand&lt;/span&gt;&lt;span class="sh"&gt;"&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_season&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hemisphere&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;season&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SEASON_MAP&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hemisphere&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;items&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;month&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;months&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;season&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;Unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_current_season&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;location&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="s"&gt;South Africa&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;
    Determines the current season based on the date and location.

    Args:
        location: Geographic location (default: South Africa for Southern Hemisphere)

    Returns:
        The current season name and additional context
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;now&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;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;hemisphere&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;southern&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SOUTHERN_LOCATIONS&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;northern&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;season&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_get_season&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hemisphere&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Southern Hemisphere&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;hemisphere&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;southern&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Northern Hemisphere&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&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;Current season: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;season&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;label&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;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%B %Y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Custom tools give you full control over functionality as they can be tailored to your specific needs and are reusable across multiple agents (for example, I created the custom tool in it's own separate Python file &lt;code&gt;season_detector.py&lt;/code&gt;). In addition to the calculator custom tool, I also created web search (to find current fashion trends) and file operations (to save the wardrobe checklist) custom tools (&lt;strong&gt;points 3 and 4 of the task outline above&lt;/strong&gt;). Here's how I load them to the 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;from&lt;/span&gt; &lt;span class="n"&gt;tools.season_detector&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_current_season&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tools.web_search&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;web_search&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tools.file_ops&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;write_file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent now has access to four tools; three custom (season detection, web search, file operations) and one built-in (calculator).&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="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_current_season&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;web_search&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write_file&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. System prompts
&lt;/h3&gt;

&lt;p&gt;Finally, I want to guide the agent with system prompts. The system prompt should describe the agent's role and capabilities, when to use each tool, and the expected behavior and tone.&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="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are a Seasonal Wardrobe Curator Agent specializing in fashion recommendations for South African users.

YOUR ROLE:
You help users curate their wardrobe for the current season by:
1. First, use the get_current_season tool to determine what season it is
2. Understanding their gender and style preferences
3. Researching recent fashion shows and trending styles for the current season
4. Creating a curated wardrobe shopping list with checkboxes
5. Calculating budget estimates in South African Rand (ZAR) when asked

IMPORTANT:
- All budget calculations must be in South African Rand (ZAR)
- Use realistic South African pricing for clothing items
- Consider local fashion retailers and brands when relevant

Be enthusiastic, knowledgeable, and helpful!&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Bringing it all together
&lt;/h3&gt;

&lt;p&gt;When I run the agentic AI application to ask for wardrobe curation, the agent autonomously orchestrates the tools. Here's the result I get when running it in the terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I've created a comprehensive autumn wardrobe checklist perfectly tailored for you! Here's your budget breakdown for R5,000:

**BUDGET ALLOCATION:**
- **Outerwear &amp;amp; Layers**: R1,750 (35%)
- **Tops &amp;amp; Blouses**: R1,250 (25%)
- **Bottoms**: R1,000 (20%)
- **Footwear**: R750 (15%)
- **Accessories**: R250 (5%)

**KEY HIGHLIGHTS:**

**Perfect for SA Autumn**: Your checklist considers our unique climate - cool mornings that warm up during the day

**Smart Layering**: Focus on versatile pieces that work together for maximum outfit combinations

**Local Shopping Guide**: Included South African retailers across all price points

**Color Palette**: Trending autumn colors including warm earth tones, jewel tones, and classic neutrals       

** Your Shopping Strategy:**
1. Start with outerwear (your biggest investment pieces)
2. Build a foundation with versatile tops
3. Add coordinating bottoms
4. Complete with footwear and accessories

The checklist includes realistic South African pricing and considers local brands like Superbalist and retailers like Woolworths. Each item has a checkbox so you can track your shopping progress!

Would you like me to adjust any budget categories or add specific items you have in mind? I can also help you plan outfits once you start shopping! 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I can mark items I own with [X] and leave [ ] for items to shop for.&lt;/p&gt;

&lt;p&gt;Find full code in my &lt;a href="https://github.com/veliswaan/wardrobe_curator" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;In Part 2 of this series I'll be extending my Wardrobe Curator with Model Context Protocol (MCP) to go from recommendations to real shopping. In the meantime, I can't wait to hear what you build with agents using tools, let me know in the comments below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="//strandsagents.com"&gt;Strands Agents SDK&lt;/a&gt;&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="//github.com/strands-agents/tools"&gt;Community Tools&lt;/a&gt;&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>tooling</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Adding Real-Time Weather Search to my City Explorer with MCP</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Thu, 03 Jul 2025 19:35:13 +0000</pubDate>
      <link>https://dev.to/aws/adding-real-time-weather-search-to-my-city-explorer-with-mcp-15nl</link>
      <guid>https://dev.to/aws/adding-real-time-weather-search-to-my-city-explorer-with-mcp-15nl</guid>
      <description>&lt;p&gt;&lt;em&gt;Building on my previous Strands agent - now with Model Context Protocol integration&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In my &lt;a href="https://dev.to/aws/i-built-a-city-explorer-using-the-strands-agents-sdk-4n9b"&gt;previous post&lt;/a&gt;, I talked about how I built a city explorer app using the Strands Agents SDK. I loved how the agent was great at providing general information about cities, but I wanted to take it further. What if my city explorer could access real-time data such as current weather conditions?&lt;/p&gt;

&lt;p&gt;That's where &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; comes in - an open standard that lets AI agents connect to external tools and data sources. In this post, I'll show you how I enhanced my city explorer with MCP to add live weather search capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/introduction/?trk=7c8639c6-87c6-47d6-9bd0-a5812eecb848&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; is an open protocol that standardizes how applications provide context to &lt;a href="https://aws.amazon.com/what-is/large-language-model/?trk=7c8639c6-87c6-47d6-9bd0-a5812eecb848&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Large Language Models (LLMs)&lt;/a&gt;. Think of it as a universal adapter that lets your AI agent talk to databases, APIs, file systems, and other external services through a common interface.&lt;/p&gt;

&lt;p&gt;Instead of hardcoding API calls into your agent, MCP lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect to multiple data sources through standardized "servers"&lt;/li&gt;
&lt;li&gt;Add new capabilities without changing your core application&lt;/li&gt;
&lt;li&gt;Share tools across different AI applications&lt;/li&gt;
&lt;li&gt;Keep your agent code clean and modular&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Challenge: From Static Facts to Dynamic Data
&lt;/h2&gt;

&lt;p&gt;My original city explorer was limited to the knowledge in the LLM's training data. When someone asked "What's the weather like in Cape Town?", it could only provide general climate information, not current conditions.&lt;/p&gt;

&lt;p&gt;I wanted to bridge this gap by giving my agent access to real-time weather data while maintaining the clean architecture of the Strands framework. To do this, I installed a &lt;a href="https://github.com/modelcontextprotocol/servers-archived/tree/main/src/brave-search/?trk=7c8639c6-87c6-47d6-9bd0-a5812eecb848&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Brave Search MCP Server&lt;/a&gt; to integrate the Brave Search API, for both web and local search capabilities.  &lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/qzQ6kA3LDhs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the MCP Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: MCP Configuration
&lt;/h3&gt;

&lt;p&gt;First, I created an MCP configuration file:&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;"mcpServers"&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;"filesystem"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/project"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"brave-search"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-brave-search"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"BRAVE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${BRAVE_API_KEY}"&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;To avoid hardcoding my secrets, in this case my &lt;code&gt;brave-api-key&lt;/code&gt;, I opted for the configuration that uses &lt;code&gt;${BRAVE_API_KEY}&lt;/code&gt; as a placeholder that gets resolved at runtime from environment variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Environment Variable Management
&lt;/h3&gt;

&lt;p&gt;Here's my setup script to handle environment configuration securely:&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;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# setup_env.sh - Environment setup for MCP integration&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setting up MCP City Explorer Environment"&lt;/span&gt;

&lt;span class="c"&gt;# Create .env template if it doesn't exist&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;".env"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .env &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
# MCP City Explorer Environment Variables
BRAVE_API_KEY=brave-api-key-here
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Created .env file template"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Please edit .env file and add your actual API keys"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Validate environment variables&lt;/span&gt;
check_env_var&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;var_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;var_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;!var_name&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$var_value&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$var_name&lt;/span&gt;&lt;span class="s2"&gt;: Not set"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;1
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$var_name&lt;/span&gt;&lt;span class="s2"&gt;: Set (&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;var_value&lt;/span&gt;:0:10&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;...)"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;0
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;source&lt;/span&gt; .env
check_env_var &lt;span class="s2"&gt;"BRAVE_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Enhanced MCP Integration Class
&lt;/h3&gt;

&lt;p&gt;The core MCP integration class now handles environment variable resolution and validation:&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;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MCPIntegration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;MCP integration with secure environment variable handling&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;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config_path&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="s"&gt;mcp_config.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config_path&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_config&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;load_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Load MCP server configuration and resolve environment variables&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="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;config&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;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="c1"&gt;# Resolve environment variables in the config
&lt;/span&gt;                &lt;span class="n"&gt;resolved_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_resolve_env_variables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolved_config&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;mcpServers&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;# Validate that required environment variables are set
&lt;/span&gt;                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_validate_env_variables&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;FileNotFoundError&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MCP config file &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not found. MCP features disabled.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="o"&gt;=&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;ValueError&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="nf"&gt;print&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;Configuration error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="o"&gt;=&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;_resolve_env_variables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Replace ${VAR_NAME} placeholders with actual environment variables&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;config_str&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="n"&gt;config&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;replace_env_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;var_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;env_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var_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;env_value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&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;Environment variable &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;var_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is not set&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;env_value&lt;/span&gt;

        &lt;span class="c1"&gt;# Replace ${VAR_NAME} with actual environment variable values
&lt;/span&gt;        &lt;span class="n"&gt;resolved_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&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="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;replace_env_var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config_str&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;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resolved_str&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;_validate_env_variables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Validate that required environment variables are set&lt;/span&gt;&lt;span class="sh"&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;brave-search&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;brave_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BRAVE_API_KEY&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;brave_key&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;Warning: BRAVE_API_KEY environment variable not set. Web search will be disabled.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="c1"&gt;# Remove brave-search server if API key is not available
&lt;/span&gt;                &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brave-search&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;brave_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&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="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;brave_key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brave-api-key-here&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;Warning: BRAVE_API_KEY appears to be a placeholder. Insert your actual brave-api-key or web search may not work.&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;h3&gt;
  
  
  Step 4: Secure Strands Agent Integration
&lt;/h3&gt;

&lt;p&gt;I then integrated this with my Strands agent, ensuring secure API key handling:&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;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;from&lt;/span&gt; &lt;span class="n"&gt;strands.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockModel&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize MCP integration with environment variable support
&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;MCPIntegration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Enhanced system prompt that includes MCP capabilities
&lt;/span&gt;&lt;span class="n"&gt;available_tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&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;get_available_tools&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;enhanced_system_prompt&lt;/span&gt; &lt;span class="o"&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 a knowledgeable city facts assistant with access to additional tools through MCP. 

You can:
- Provide concise, interesting facts about cities
- Access local files and directories when needed
- Search the web for up-to-date information (if configured)

Available MCP tools: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;available_tools&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Keep responses brief and engaging. If you need current information, mention that you&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re using external tools.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Create the enhanced agent
&lt;/span&gt;&lt;span class="n"&gt;city_explorer_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="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bedrock_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;enhanced_system_prompt&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Check environment setup on startup
&lt;/span&gt;&lt;span class="n"&gt;brave_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BRAVE_API_KEY&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;brave_key&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="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt; Note: Set BRAVE_API_KEY environment variable to enable web search functionality&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;   Example: export BRAVE_API_KEY=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="n"&gt;brave&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Secure Tool Execution
&lt;/h3&gt;

&lt;p&gt;The tool execution now includes proper API key validation:&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;_handle_search_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool_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;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dict&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;Any&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;Handle web search operations with secure API key handling&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parameters&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;query&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="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;brave_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;BRAVE_API_KEY&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;brave_key&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;brave_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&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="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&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;Web search for &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; requires BRAVE_API_KEY environment variable to be set with a valid API key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# In a production implementation, this would make an actual API call to Brave Search
&lt;/span&gt;    &lt;span class="k"&gt;return&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;Web search for &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; would be performed here using Brave API (API key configured)&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;process_user_input_with_mcp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&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;Process user input and handle any MCP tool requests&lt;/span&gt;&lt;span class="sh"&gt;"""&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;city_explorer_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;additional_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;

    &lt;span class="c1"&gt;# Detect weather queries and trigger search
&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;search for&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;user_input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brave-search&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;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;search_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search for&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="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;search_result&lt;/span&gt; &lt;span class="o"&gt;=&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;execute_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;brave-search___search&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;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;search_query&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;additional_info&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;[MCP Search Result]: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;search_result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&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;additional_info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing the Enhanced City Explorer
&lt;/h2&gt;

&lt;p&gt;With secure MCP integration complete, my city explorer could now handle queries such as the one seen in my test below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup&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;# Set environment variable securely&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;BRAVE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"brave-api-key-here"&lt;/span&gt;

&lt;span class="c"&gt;# Run the application&lt;/span&gt;
python3 testing_for_kbs_mcp_env.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: "search for Cape Town weather"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Response&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;Cape Town is a beautiful coastal city in South Africa, known for Table Mountain, its wine regions, and stunning beaches.

[MCP Search Result]: 
Current weather in Cape Town: 18°C, partly cloudy
Today: High 22°C, Low 15°C
Tomorrow: High 20°C, Low 14°C, chance of rain
Cape Town has a Mediterranean climate with mild, wet winters and warm, dry summers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent seamlessly combined its built-in knowledge with real-time data from the web, all while keeping API keys secure!&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Good
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clean Architecture&lt;/strong&gt;: MCP kept my agent code focused on conversation logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Environment variables eliminated hardcoded secrets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Extension&lt;/strong&gt;: Adding new tools was just a matter of configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging&lt;/strong&gt;: Clear separation made it easy to test components independently&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Tricky Parts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Environment Management&lt;/strong&gt;: Ensuring all environments have the right variables set&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Detection&lt;/strong&gt;: Deciding when to use which MCP tool required careful prompt engineering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Network calls to external services need robust error handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Each MCP call adds latency - batching and caching become important&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;In the future, I could add these possible features using this secure MCP integration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database Integration&lt;/strong&gt;: Connect to city databases for population, economic data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Analysis&lt;/strong&gt;: Add computer vision for landmark recognition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translation Services&lt;/strong&gt;: Multi-language city information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social Media&lt;/strong&gt;: Real-time sentiment about cities from social platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;..and more :)&lt;/p&gt;

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

&lt;p&gt;Adding MCP to my Strands city explorer transformed it from a static knowledge base into a dynamic, real-time information system. By implementing proper security practices with environment variables, the solution is now production-ready and follows AWS best practices.&lt;/p&gt;

&lt;p&gt;The combination of MCP's modular architecture and secure configuration management means I can continue adding new capabilities without compromising security or rebuilding the core agent.&lt;/p&gt;

&lt;p&gt;MCP represents the future of AI agent development - where agents aren't limited to their training data but can reach out to the world for fresh, relevant information. Combined with the power of Strands for agent orchestration and proper security practices, it's a compelling foundation for building truly useful AI applications.&lt;/p&gt;

&lt;p&gt;What external tools would you connect to your AI agent? And how do you handle API key security in your projects? Let me know in the comments!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want to learn more about building secure AI agents? Check out my previous posts on &lt;a href="https://dev.to/aws/i-built-a-city-explorer-using-the-strands-agents-sdk-4n9b"&gt;Strands&lt;/a&gt;. Learn more about the &lt;a href="https://brave.com/search/api/" rel="noopener noreferrer"&gt;Brave Search API&lt;/a&gt;. Follow me for more AI development content.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
      <category>aws</category>
    </item>
    <item>
      <title>I built a city explorer using the Strands Agents SDK</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Tue, 24 Jun 2025 13:07:43 +0000</pubDate>
      <link>https://dev.to/aws/i-built-a-city-explorer-using-the-strands-agents-sdk-4n9b</link>
      <guid>https://dev.to/aws/i-built-a-city-explorer-using-the-strands-agents-sdk-4n9b</guid>
      <description>&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/opensource/introducing-strands-agents-an-open-source-ai-agents-sdk/?trk=7c8639c6-87c6-47d6-9bd0-a5812eecb848&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Recently, AWS announced the release of Strands Agents&lt;/a&gt;, an open source SDK that takes a model-driven approach to building and running AI agents in just a few lines of code.&lt;/p&gt;

&lt;p&gt;A while ago &lt;a href="https://community.aws/content/2e3IcBfX4bmhAHVtd6PyIV5H57F/i-built-an-ai-landmark-recommender-for-visiting-new-cities" rel="noopener noreferrer"&gt;I built a city explorer using Knowledge Bases for Amazon Bedrock&lt;/a&gt; so to experiment with Strands Agents, I built the same application, this time using Strands Agents.&lt;/p&gt;

&lt;p&gt;Here's the process I followed:&lt;/p&gt;

&lt;p&gt;I already have Python 3.13 installed in my local machine, if you don't already have &lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;Python 3.10 or higher installed be sure to download an install it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I have an &lt;a href="https://aws.amazon.com/free/?trk=7c8639c6-87c6-47d6-9bd0-a5812eecb848&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;AWS account&lt;/a&gt; so I &lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-modify.html?trk=7c8639c6-87c6-47d6-9bd0-a5812eecb848&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;enabled model access for Claude 3.7&lt;/a&gt; in Amazon Bedrock in the &lt;strong&gt;same region as the default region&lt;/strong&gt; specified in my code later. Claude 3.7 is the default model used by Strands Agents.&lt;/p&gt;

&lt;p&gt;I then proceeded to set up my environment as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create a virtual environment
python -m venv .venv

# Activate the environment
# On Windows
.venv\Scripts\activate
# On macOS/Linux
source .venv/bin/activate

# Install Strands Agents SDK and tools
pip install strands-agents strands-agents-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;strands-agents&lt;/code&gt; package provides the core SDK functionality, while &lt;code&gt;strands-agents-tools&lt;/code&gt; includes a variety of built-in tools we can use to enhance our agents. For my application, I could have installed only the &lt;code&gt;strands-agents&lt;/code&gt; package if I opted to do so.&lt;/p&gt;

&lt;p&gt;Next, I created my &lt;code&gt;city_explorer_agent&lt;/code&gt; in the &lt;code&gt;city_explorer.py&lt;/code&gt; file with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from strands import Agent
from strands.models import BedrockModel
from botocore.config import Config as BotocoreConfig

# Create a boto client config with custom settings
boto_config = BotocoreConfig(
    retries={"max_attempts": 3, "mode": "standard"},
    connect_timeout=5,
    read_timeout=60
)

# Create a configured Bedrock model
bedrock_model = BedrockModel(
    model_id="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
    region_name="us-east-1",  # Specify a different region than the default
    temperature=0.3,
    top_p=0.8,
    stop_sequences=["###", "END"],
    boto_client_config=boto_config,
)

# Create a city explorer agent with the configured model and system prompt
city_explorer_agent = Agent(
    model=bedrock_model,
    system_prompt="You are a knowledgeable city facts assistant. Provide concise, interesting facts about cities when asked. Keep responses brief and engaging."
)

# Conversational loop
print("City Facts Assistant - Ask me about any city! (type 'quit' to exit)")

while True:
    user_input = input("\nYou: ").strip()

    if user_input.lower() in ['quit', 'exit', 'bye']:
        print("Goodbye!")
        break

    if user_input:
        response = city_explorer_agent(user_input)
        print(f"\nAssistant: {response}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran the code in the terminal:&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%2Fe96fu817gefnuhi7u0hm.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%2Fe96fu817gefnuhi7u0hm.png" alt="My city explorer" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good to know&lt;/strong&gt;&lt;br&gt;
You might be wondering about the benefits of using Strands versus &lt;a href="https://aws.amazon.com/bedrock/agents/?trk=7c8639c6-87c6-47d6-9bd0-a5812eecb848&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Bedrock Agents&lt;/a&gt;; the two technologies are complimentary in that Bedrock Agents offers fully managed hosted agents while Strands is an open source framework that can run &lt;strong&gt;anywhere&lt;/strong&gt;. Today, if you're experimenting, use Strands and if you need to be in production, then use Bedrock Agents.&lt;/p&gt;

&lt;p&gt;Strands Agents is less opinionated than some other frameworks such as &lt;a href="https://www.langchain.com/" rel="noopener noreferrer"&gt;LangChain&lt;/a&gt; in that it lets the model take the strain rather than having libraries of prompt engineering templates, it's a new breed of agentic tooling.&lt;/p&gt;

&lt;p&gt;I was motivated by the promise that Strands Agents takes a model-driven approach to building and running AI agents in just a few lines of code, focusing on the model's ability to reason and plan rather than manually defining complex workflows and as seen in my code above, Strands Agents lived up to that promise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;br&gt;
There's a whole community behind this open source project and contributions such as adding support for additional providers’ models and tools, collaborating on new features, or expanding the documentation, and more, are welcome. If you find a bug, have a suggestion, or have something to contribute, &lt;a href="https://github.com/strands-agents" rel="noopener noreferrer"&gt;join the project on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=Ausm87d5Ry8" rel="noopener noreferrer"&gt;Model Driven Agents - Strands Agents on YouTube&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.aws/content/2xP1AQ52ofPdLawEbDI5EEUhmhH/building-ai-agents-with-strands-part-1-creating-your-first-agent" rel="noopener noreferrer"&gt;Building AI Agents with Strands - A series&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AWS Community events in July: Sub-Saharan Africa</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Sun, 24 Jul 2022 20:31:00 +0000</pubDate>
      <link>https://dev.to/vel12171/aws-community-events-in-july-sub-saharan-africa-en2</link>
      <guid>https://dev.to/vel12171/aws-community-events-in-july-sub-saharan-africa-en2</guid>
      <description>&lt;p&gt;I remain in awe of how active our AWS community in Sub-Saharan Africa has remained through such trying times, and now that life is starting to go back to normal - it's great to see how consistent it's been in terms of hosting AWS related events.&lt;/p&gt;

&lt;p&gt;So what's already taken place in the month of July - and what's still coming up?&lt;/p&gt;

&lt;h2&gt;
  
  
  1/ 23 July - Abuja User Group
&lt;/h2&gt;

&lt;p&gt;It is exciting to see how our Nigeria community continues to grow. Up until recently we had the Lagos User Group which currently stands at 3k+ members.&lt;br&gt;
A new user group has been launched in Abuja and had their first meetup in-person on July 23rd. &lt;br&gt;
Read more about the event here: &lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.linkedin.com/posts/veliswa-boya_aws-awsusergroups-nigeria-activity-6953678993870970880-xPk-?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--rOYp4lJ_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://media-exp1.licdn.com/dms/image/C4D22AQEeH3OYgxKH6w/feedshare-shrink_2048_1536/0/1657886264247%3Fe%3D1661385600%26v%3Dbeta%26t%3DASW6idqsnSsio-GfE79r_y2WOoWRRz72VnIDcgSmmlE" height="536" class="m-0" width="751"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.linkedin.com/posts/veliswa-boya_aws-awsusergroups-nigeria-activity-6953678993870970880-xPk-?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" rel="noopener noreferrer" class="c-link"&gt;
          
              Veliswa Boya on LinkedIn: #aws #awsusergroups #nigeria
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          It’s great to see the AWS Nigeria user group growing like this. Join the launch of a new chapter of the user group, in person, in Abuja to hear from the...
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--CaWew9rq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-exp1.licdn.com/sc/h/al2o9zrvru7aqj8e1x2rzsrca" width="64" height="64"&gt;
        linkedin.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  2/ 23 July - Accra User Group
&lt;/h2&gt;

&lt;p&gt;The Accra, Ghana user group has been hosting weekly bootcamps to prepare members who are preparing to ace :) the AWS associate-level certifications. The bootcamp started on July 16th and the event on the July 23rd was the second one in this series. Read more about the bootcamp here, and follow this group to make sure that you don't miss out on future sessions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.linkedin.com/posts/opanion_aws-associate-certification-bootcamp-week-activity-6956230743945527297-g_UI?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--_E3mhHlq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://media-exp1.licdn.com/dms/image/sync/C4E27AQE_nGVcdpD8FA/articleshare-shrink_800/0/1658494519174%3Fe%3D1659351600%26v%3Dbeta%26t%3D0_HDAtpPPUGvvssfzb77Z5e8L7y7KLOPSqfC8DHDKjY" height="380" class="m-0" width="676"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.linkedin.com/posts/opanion_aws-associate-certification-bootcamp-week-activity-6956230743945527297-g_UI?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" rel="noopener noreferrer" class="c-link"&gt;
          
            Our second session is tomorrow morning, join us.
In this session we'll - Emmanuel Koomson, PMP,TOGAF ☁️ on LinkedIn
          
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Our second session is tomorrow morning, join us.
In this session we'll learn about AWS compute services.
#awscertification #aws 
https://lnkd.in/e-6z65...
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--CaWew9rq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-exp1.licdn.com/sc/h/al2o9zrvru7aqj8e1x2rzsrca" width="64" height="64"&gt;
        linkedin.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
 
&lt;h2&gt;
  
  
  3/ 23 July - Dakar User Group
&lt;/h2&gt;

&lt;p&gt;In case you missed it, Senegal now has a user group - in the city of Dakar. This is our second user group in Sub-Saharan Africa that caters to our French speaking community members. &lt;br&gt;
This group hosted their second meetup in-person on July 23rd, read more here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.linkedin.com/posts/ousintkd_aws-iot-serverless-activity-6956558846307774465-YWGS?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--u1_yBUoO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://media-exp1.licdn.com/dms/image/C4D22AQG4Uxcuw7nVDw/feedshare-shrink_2048_1536/0/1658572874165%3Fe%3D1661385600%26v%3Dbeta%26t%3DnDCG62eKxbEvLkNW5TrB2bzJsWeD2ad3OunCjIwTLw8" height="738" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.linkedin.com/posts/ousintkd_aws-iot-serverless-activity-6956558846307774465-YWGS?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" rel="noopener noreferrer" class="c-link"&gt;
          
              Ousseynou khadim BEYE on LinkedIn: #aws #IoT #Serverless
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          🔴 We are live ! (hybrid)
💻 Meet https://lnkd.in/dNs7CgMu
📍Orange Digital Center Sénégal
#aws #IoT #Serverless #5g  #amazon #dakar #senegal 🇸🇳...
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--CaWew9rq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-exp1.licdn.com/sc/h/al2o9zrvru7aqj8e1x2rzsrca" width="64" height="64"&gt;
        linkedin.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  4/ 27 July - Pretoria User Group
&lt;/h2&gt;

&lt;p&gt;Quoting from this group's "About" page, the Pretoria user group is the group for you if you are either curious about what AWS is, or want to start using it, or are a seasoned veteran. This group hosts a wide range of speakers covering a wide range of topics. &lt;br&gt;
Coming up virtually, on July 27th is this talk on "How not to start a side hustle on AWS". This looks set to be an interesting talk, and judging by the number of signups already - it has sparked a lot of interest already. &lt;br&gt;
Find my comment about this meetup here - and you'll also find a link to sign up and attend:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.linkedin.com/posts/veliswa-boya_how-not-to-start-a-side-hustle-on-aws-wed-activity-6953716606359281664-gCFI?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--e-xEC4S0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://media-exp1.licdn.com/dms/image/sync/C5627AQFPa3oPQWkToA/articleshare-shrink_800/0/1657606428710%3Fe%3D1659351600%26v%3Dbeta%26t%3DcQAWv7OuvDLvMlLTUTj5jhtwSlCaxv10LM-Wq0zYmWA" height="380" class="m-0" width="676"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.linkedin.com/posts/veliswa-boya_how-not-to-start-a-side-hustle-on-aws-wed-activity-6953716606359281664-gCFI?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" rel="noopener noreferrer" class="c-link"&gt;
          
              Veliswa Boya on LinkedIn: How not to start a side hustle on AWS, Wed, Jul 27, 2022, 6:00 PM 
            
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          It was great to watch you learn in public with this project Rehan van der Merwe #warpurl. This certainly is a meetup that's not to be missed. Link below...
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--CaWew9rq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-exp1.licdn.com/sc/h/al2o9zrvru7aqj8e1x2rzsrca" width="64" height="64"&gt;
        linkedin.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  5/ 30 July - Nairobi User Group
&lt;/h2&gt;

&lt;p&gt;Last but certainly not least, the Nairobi user group is hosting their next event, virtually on July 30th. According to their "About" page, this group welcomes members with all AWS skill levels. They host a wide range of topics from a diverse range of speakers.&lt;br&gt;
Details of the event are below, read more and signup here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.linkedin.com/posts/adeline-makokha_kenya-aws-activity-6957236200021602304-0JqO?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--WMYTOV9Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://media-exp1.licdn.com/dms/image/C4D22AQHHOJE1yZnNDw/feedshare-shrink_2048_1536/0/1658734367739%3Fe%3D1661385600%26v%3Dbeta%26t%3DSbwtlLlStF8MfO5QUY_ly9eVtST5Dh-UMIArnlyZD60" height="1246" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.linkedin.com/posts/adeline-makokha_kenya-aws-activity-6957236200021602304-0JqO?utm_source=linkedin_share&amp;amp;amp%3Butm_medium=member_desktop_web" rel="noopener noreferrer" class="c-link"&gt;
          
            You don't want to miss this one!

Join us, AWS User Group Kenya on - Adeline Makokha on LinkedIn
          
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          You don't want to miss this one!

Join us, AWS User Group Kenya on Saturday 30th July to learn more about Automated application log monitoring using Cloudwatch...
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--CaWew9rq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-exp1.licdn.com/sc/h/al2o9zrvru7aqj8e1x2rzsrca" width="64" height="64"&gt;
        linkedin.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Well I hope you still have time to sign up and join the ones that are still coming up where it's possible for you to do so. &lt;br&gt;
Enjoy the meetups! x &lt;/p&gt;

</description>
      <category>aws</category>
      <category>awsusergroups</category>
      <category>awscommunity</category>
      <category>africa</category>
    </item>
    <item>
      <title>Sub-Saharan Africa AWS Community: 2021 Round-up</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Sat, 08 Jan 2022 20:36:39 +0000</pubDate>
      <link>https://dev.to/vel12171/the-aws-community-2021-round-up-3658</link>
      <guid>https://dev.to/vel12171/the-aws-community-2021-round-up-3658</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Time literally flies when you're having fun!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I recently celebrated my first year anniversary at Amazon. My role as a Developer Advocate for Sub-Saharan Africa (SSA) has been all about meeting people - and I have found this to be an unbelievably fulfilling aspect of this role. &lt;/p&gt;

&lt;p&gt;In looking back on this first year, I had been considering writing about my experience as a Developer Advocate so far. &lt;br&gt;
What do you think though about a round-up of what the SSA AWS Community got up to in the past year instead?  &lt;/p&gt;

&lt;h2&gt;
  
  
  Self-organizing AWS user groups
&lt;/h2&gt;

&lt;p&gt;It is nothing short of inspiring how the &lt;a href="https://aws.amazon.com/developer/community/usergroups/" rel="noopener noreferrer"&gt;AWS user groups&lt;/a&gt; from this region continued to meet - virtually - during what continued to be a very challenging year for all of us.&lt;br&gt;
&lt;a href="https://www.meetup.com/AWS-PTA/" rel="noopener noreferrer"&gt;Pretoria&lt;/a&gt; | &lt;a href="https://www.meetup.com/AWS-JOZI/" rel="noopener noreferrer"&gt;Jozi&lt;/a&gt; | &lt;a href="https://www.meetup.com/aws-accra/" rel="noopener noreferrer"&gt;Ghana&lt;/a&gt; | &lt;a href="https://www.meetup.com/AWS-Nigeria-User-Group/" rel="noopener noreferrer"&gt;Nigeria&lt;/a&gt; | &lt;a href="https://www.meetup.com/AWS-User-Group-Nairobi/" rel="noopener noreferrer"&gt;Kenya&lt;/a&gt; were formed before the pandemic; these groups were able to continue to meet virtually. &lt;/p&gt;

&lt;p&gt;How exciting about &lt;a href="https://www.meetup.com/awsugdouala/" rel="noopener noreferrer"&gt;Douala Cameroon&lt;/a&gt; | &lt;a href="https://www.meetup.com/aws-user-group-benin/" rel="noopener noreferrer"&gt;Benin&lt;/a&gt; who were formed in early 2021 and went on to quickly make an impact in their respective communities!&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Heroes from SSA
&lt;/h2&gt;

&lt;p&gt;At the beginning of 2021 SSA had the following &lt;a href="https://aws.amazon.com/developer/community/heroes/" rel="noopener noreferrer"&gt;AWS heroes&lt;/a&gt;: &lt;a href="https://www.linkedin.com/in/rehan-van-der-merwe-600b40172/" rel="noopener noreferrer"&gt;Rehan van der Merwe&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/lukonde-mwila-25103345/" rel="noopener noreferrer"&gt;Luke Mwila&lt;/a&gt;, and &lt;a href="https://www.linkedin.com/in/ewere/" rel="noopener noreferrer"&gt;Ewere Diagboya&lt;/a&gt;.&lt;br&gt;
We were very excited to welcome our newest hero &lt;a href="https://www.linkedin.com/in/rosius/" rel="noopener noreferrer"&gt;Ndimofor Ateh Rosius&lt;/a&gt; who became the first Serverless hero from Africa, and the first hero from Cameroon.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Community Builders from SSA
&lt;/h2&gt;

&lt;p&gt;Of course we look forward to seeing the number of &lt;a href="https://aws.amazon.com/developer/community/community-builders/" rel="noopener noreferrer"&gt;AWS Community Builders&lt;/a&gt; from SSA grow this year but it was very exciting to see many being accepted into the AWS Community Builders Program in the past year. AWS builders from Nigeria, Kenya, South Africa, Cameroon, Ghana, Zimbabwe - to name a few - made it into this amazing program. I am especially proud to see women from this region be accepted into this program; here's a great post from &lt;a href="https://www.linkedin.com/posts/adedeji-mariam_devtools-awscommunity-activity-6850076238187401216-v-ag" rel="noopener noreferrer"&gt;Mariam Adedeji&lt;/a&gt; from Nigeria announcing her acceptance into the program.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Community Voices
&lt;/h2&gt;

&lt;p&gt;AWS launched an AWS Community Voices series focusing specifically on stories from- and technical walkthroughs by members of the AWS Community of Europe, Middle East, and Africa (EMEA). There was plenty of representation here from builders from SSA. The diversity of this representation was noteworthy considering that our region is still looking forward to more women participation within the AWS Community. Interviews of community members like &lt;a href="https://www.linkedin.com/in/esther-a-33690320b/" rel="noopener noreferrer"&gt;Esther Awudu&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/linda-oyapi-asamoah-783147194/" rel="noopener noreferrer"&gt;Linda Oyapi Asamoah&lt;/a&gt;, and &lt;a href="https://www.linkedin.com/in/cess-waithaka-6a9272149/" rel="noopener noreferrer"&gt;Cecilia Waithaka&lt;/a&gt; received great viewership and inspired many other members of the community (&lt;a href="https://www.twitch.tv/aws/video/" rel="noopener noreferrer"&gt;catch up on all past interviews here&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UCT1KQVh_0E8SatSLlNlA1xw" rel="noopener noreferrer"&gt;here&lt;/a&gt;). &lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Certifications
&lt;/h2&gt;

&lt;p&gt;I have enjoyed seeing a constant stream of posts from those who got AWS certified on my social media timelines. SSA AWS Community didn't get left behind with many getting certified and sharing their inspiring stories on social media. AWS made exam vouchers available through various campaigns which included the &lt;a href="https://pages.awscloud.com/EMEA_TC_join-the-ssa-challenge.html" rel="noopener noreferrer"&gt;Certify Africa Challenge&lt;/a&gt; and many took advantage of the opportunities provided by these campaigns. We received many testimonies from those who were able to write and pass - using these exam vouchers to pay for their exam scheduling. I attach below just some of the public stories we received.&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%2F5r5tn1od1z2rq4m9eakw.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%2F5r5tn1od1z2rq4m9eakw.png" alt="AWS Exam Voucher recipients"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS interactions with the user groups
&lt;/h2&gt;

&lt;p&gt;AWS user groups remain independent; we as AWS are always so honored when we receive invites to speak or present in some way at these user groups.&lt;br&gt;
One of the invitations we received was to co-host a workshop with the Nigeria user group. The response to this from the community was overwhelming - completely unexpected considering that this was still being held virtually.&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%2F8kms49rpvt5cl7qxq45m.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%2F8kms49rpvt5cl7qxq45m.png" alt="Nigeria UG workshop response"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next public-facing workshop focused on building an Alexa skill; the feedback from the attendees was really great to hear:&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%2Fsjfqlffgde9xl3n6xgta.jpg" 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%2Fsjfqlffgde9xl3n6xgta.jpg" alt="Alexa workshop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whew! To think that these are just some of the stories and activities - one post will never be enough to cover all that took place within the AWS Community of Sub-Saharan Africa.&lt;/p&gt;

&lt;p&gt;Reading through all this I cannot help but look forward to what the AWS Community will be getting up to in 2022.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you in the Sub-Saharan Africa region and have been doing amazing things within the community? I would love to hear your story.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awscommunity</category>
      <category>africa</category>
      <category>awsusergroups</category>
    </item>
    <item>
      <title>AWS Fault Injection Simulator: Create your first experiment template using the AWS CLI: DRAFT</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Wed, 05 May 2021 08:45:07 +0000</pubDate>
      <link>https://dev.to/vel12171/aws-fault-injection-simulator-create-your-first-experiment-template-using-the-aws-cli-draft-5bfd</link>
      <guid>https://dev.to/vel12171/aws-fault-injection-simulator-create-your-first-experiment-template-using-the-aws-cli-draft-5bfd</guid>
      <description>&lt;p&gt;Are you looking to stress your applications in order to isolate faults - so that you can address these before you experience these faults in production?&lt;/p&gt;

&lt;p&gt;AWS launched the chaos engineering fully managed service &lt;a href="https://aws.amazon.com/fis/" rel="noopener noreferrer"&gt;Fault Injection Simulator (FIS) at re:invent2020&lt;/a&gt;  and it went &lt;a href="https://aws.amazon.com/blogs/aws/aws-fault-injection-simulator-use-controlled-experiments-to-boost-resilience/" rel="noopener noreferrer"&gt;generally available in March 2021&lt;/a&gt;.&lt;br&gt;
I remember upon hearing about this release; how flashbacks of early morning callouts, Friday afterno-- :)...came flooding in.&lt;br&gt;
This was and remains an exciting release in its own right - but for me personally, as someone who spent years doing production support - this is a really exciting release.&lt;/p&gt;

&lt;p&gt;AWS FIS allows customers to run controlled experiments in order to stress test their applications and validate resiliency - and ultimately practice with failure scenarios before they happen in production.&lt;/p&gt;

&lt;p&gt;The process of running experiments on AWS using AWS FIS is a two-phased process; first you create the experiment template and then you start the experiment.&lt;/p&gt;

&lt;p&gt;There are three ways in which you can create the experiment template; you can use the FIS console or the AWS Command Line Interface (CLI). It is also possible to use &lt;a href="https://aws.amazon.com/systems-manager/" rel="noopener noreferrer"&gt;Systems Manager&lt;/a&gt; documents to inject faults into your EC2 instances.&lt;/p&gt;

&lt;p&gt;In this article, we will look at how to create experiment templates using the AWS CLI.&lt;/p&gt;
&lt;h3&gt;
  
  
  What services can you set as targets in an AWS FIS experiment?
&lt;/h3&gt;

&lt;p&gt;Each AWS FIS experiment targets a specific set of AWS resources and performs a set of actions on them. &lt;br&gt;
Currently the following services are supported as targets for AWS FIS experiments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/ec2/" rel="noopener noreferrer"&gt;Amazon Elastic Compute Cloud (EC2)&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/ecs/" rel="noopener noreferrer"&gt;Amazon Elastic Container Service (ECS)&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/eks/" rel="noopener noreferrer"&gt;Amazon Elastic Kubernetes Service (EKS)&lt;/a&gt;, and&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/rds/" rel="noopener noreferrer"&gt;Amazon Relational Database Service (RDS)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Pre-requisites to running an AWS FIS experiment
&lt;/h3&gt;

&lt;p&gt;Basic principles and guidelines that must be followed prior to running your AWS FIS experiment are outlined in the &lt;a href="https://docs.aws.amazon.com/fis/latest/userguide/getting-started-planning.html" rel="noopener noreferrer"&gt;user guide&lt;/a&gt;, I therefore won't detail them here. On a high level - however, the following considerations are necessary as pre-requisites to running an AWS FIS experiment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify the target deployment for the experiment&lt;/li&gt;
&lt;li&gt;Review the application architecture&lt;/li&gt;
&lt;li&gt;Define steady-state behavior&lt;/li&gt;
&lt;li&gt;Form a hypothesis&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  1) IAM permissions for a successful AWS FIS experiment
&lt;/h3&gt;

&lt;p&gt;To use AWS FIS, the following Identity &amp;amp; Access Management (IAM) permissions need to be in place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permissions for the IAM users and roles that will work with AWS 
FIS&lt;/li&gt;
&lt;li&gt;Permissions for AWS FIS that allow it to run experiments on your 
behalf&lt;/li&gt;
&lt;li&gt;Service-linked roles in AWS FIS (taken care of by AWS FIS - 
nothing for you to do here)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you may already be aware, policies in AWS define permissions. When you create a permissions policy to restrict access to a resource, you can choose an &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html" rel="noopener noreferrer"&gt;identity-based policy or a resource-based policy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Following the definition above, in order for a successful AWS FIS experiment - we need to define identity-based policies.&lt;/p&gt;

&lt;p&gt;The identity-based policies will be attached to the IAM user and the role that will work with AWS FIS. &lt;/p&gt;

&lt;p&gt;The policies are detailed in the &lt;a href="https://docs.aws.amazon.com/fis/latest/userguide/getting-started-iam.html" rel="noopener noreferrer"&gt;IAM permissions set up guide&lt;/a&gt; and as seen in the diagrams below depicting how I defined these in my own account:&lt;/p&gt;
&lt;h4&gt;
  
  
  1.1) IAM user that will work with AWS FIS
&lt;/h4&gt;

&lt;p&gt;Let's first take a look at the user that will be creating the template. &lt;br&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%2F9h2sncf3j9npjot28h6l.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%2F9h2sncf3j9npjot28h6l.png" alt="image"&gt;&lt;/a&gt;&lt;br&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%2Fcy0rf5kz9829cnk8g1az.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%2Fcy0rf5kz9829cnk8g1az.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.2) User permissions
&lt;/h4&gt;

&lt;p&gt;The user illustrated in &lt;strong&gt;1.1)&lt;/strong&gt; above will require the following permissions as described in &lt;strong&gt;Step 1&lt;/strong&gt; of the IAM permissions set up guide - also see in the video below these permissions as attached to the user:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/cqXQ0IzpLvI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  1.3) Role permissions
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; of the IAM permissions set up guide details how to set up the IAM role for the AWS FIS service. The role grants the AWS FIS service permission to &lt;strong&gt;perform actions on your behalf&lt;/strong&gt;. The IAM policy for the IAM role must grant permission to modify the resources that you specify as targets in your experiment template. &lt;br&gt;
For my demo, I used the policy as it stands in the set up guide. However it is important to note that as a good practice, it is recommended to follow the standard security advice of granting least privilege. This can be done by specifying specific resource Amazon Resource Names (ARNs) or tags in your policy.&lt;/p&gt;

&lt;h4&gt;
  
  
  1.4) Trust Relationships
&lt;/h4&gt;

&lt;p&gt;Lastly, the IAM role must have a trust relationship that allows the AWS FIS service to assume the role. &lt;br&gt;
Again, I used the trust relationship exactly as illustrated in the set up guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Create the experiment template
&lt;/h3&gt;

&lt;p&gt;You are done - almost! All your permissions are now all set, you are now ready to create your experiment template.&lt;/p&gt;

&lt;p&gt;As previously mentioned, we will be using the AWS CLI to create the experiment template. AWS &lt;a href="https://docs.aws.amazon.com/fis/latest/userguide/experiment-template-example.html" rel="noopener noreferrer"&gt;has provided examples&lt;/a&gt; of how you can construct various templates in JavaScript Object Notation (JSON). You can copy and change these examples accordingly - in order to get started with creating your templates.&lt;br&gt;
In addition to these, you can also &lt;a href="https://github.com/veliswaan/aws-fis-stop-ec2-template" rel="noopener noreferrer"&gt;check my GitHub repository&lt;/a&gt; for the JSON format that I used in the demo illustrated here.&lt;/p&gt;

&lt;p&gt;Create the template by running the following command in the AWS CLI, substituting "input-file" with the actual name of your file: &lt;br&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%2F0sb44bomqixhi9n5hvt4.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%2F0sb44bomqixhi9n5hvt4.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A successfully created experiment template can be viewed - and started - in the AWS FIS console.&lt;/strong&gt;&lt;br&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%2Ft6wsa82fazw6i7eywzrf.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%2Ft6wsa82fazw6i7eywzrf.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I am looking forward to hearing feedback from you - to hear about all the experiments that you create, and how you ultimately stress test your applications for better resiliency.&lt;/p&gt;

&lt;p&gt;Here is a service launch session video - presented by &lt;a href="https://twitter.com/adhorn" rel="noopener noreferrer"&gt;Adrian Hornsby&lt;/a&gt; from re:invent2020 that details AWS FIS.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yoNeMLj3CHc"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS Fault Injection Simulator – Use Controlled Experiments to 
Boost Resilience 
(&lt;a href="https://aws.amazon.com/blogs/aws/aws-fault-injection-simulator-use-controlled-experiments-to-boost-resilience/" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/aws/aws-fault-injection-simulator-use-controlled-experiments-to-boost-resilience/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Photo by &lt;a href="https://unsplash.com/@girlwithredhat?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Girl with red hat&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/experiment-chaos?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Deploy your first app on AWS with AWS CDK - Part 1</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Mon, 08 Mar 2021 11:58:01 +0000</pubDate>
      <link>https://dev.to/aws/deploy-your-first-app-on-aws-with-aws-cdk-part-1-47oc</link>
      <guid>https://dev.to/aws/deploy-your-first-app-on-aws-with-aws-cdk-part-1-47oc</guid>
      <description>&lt;p&gt;AWS Cloud Development Kit (AWS CDK), is an open source software development framework that lets you as a developers define cloud application resources using familiar programming languages, so you do not have to learn a new domain-specific language (e.g. YAML or JSON). The AWS CDK lets developers manage those resources in the same way that they manage their application code, ensuring visibility, reproducibility, and repeatability, and it is part of how modern applications treat their infrastructure as code.&lt;/p&gt;

&lt;p&gt;AWS CDK supports TypeScript, JavaScript, Python, Java and C# as the programming languages that can be used to define reusable cloud application components called &lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/constructs.html" rel="noopener noreferrer"&gt;Constructs&lt;/a&gt;  (building blocks of AWS CDK applications). &lt;br&gt;
Constructs are composed into &lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/stacks.html" rel="noopener noreferrer"&gt;Stacks&lt;/a&gt; (which are ultimately deployed as CloudFormation Stacks) and &lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/apps.html" rel="noopener noreferrer"&gt;Apps&lt;/a&gt; which produce the AWS CloudFormation template that has been defined by the Stack.&lt;/p&gt;

&lt;p&gt;AWS CDK Apps define your infrastructure as code; in order to produce (synthesize) the CloudFormation template for each stack the apps need to be executed via the &lt;strong&gt;cdk synth&lt;/strong&gt; command, and the template deployed into your AWS account via the &lt;strong&gt;cdk deploy&lt;/strong&gt; command.&lt;/p&gt;

&lt;p&gt;Whether you are already familiar with AWS CDK already or &lt;a href="https://aws.amazon.com/cloudformation/" rel="noopener noreferrer"&gt;AWS CloudFormation&lt;/a&gt; (CDK produces a CloudFormation template which then deploys your app into your AWS account) - or not - there are resources that exist to help you deploy your first app using AWS CDK.&lt;/p&gt;

&lt;p&gt;In this post, I used one of those helpful resources - I used the &lt;a href="https://cdkworkshop.com/30-python/20-create-project.html" rel="noopener noreferrer"&gt;CDK Workshop&lt;/a&gt; to demonstrate how to synthesize a CloudFormation Template from a CDK app and deploy that to an AWS account - I chose Python as my programming language of choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The AWS CDK Workshop&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The workshop contains details on all the pre-requisites that you will need in order to successfully deploy this first app so I will not repeat those here; let me however mention that this app deploys the following AWS resources for you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQS Queue (sqs.Queue)&lt;/li&gt;
&lt;li&gt;SNS Topic (sns.Topic)&lt;/li&gt;
&lt;li&gt;Subscribes the queue to receive any messages published to the 
topic (topic.add_subscription)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensure to install the SQS, SNS, SNS_Subscriptions packages from the AWS Construct Library as per example below:&lt;br&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%2Fogm95nlxq7lwarajto39.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%2Fogm95nlxq7lwarajto39.png" alt="image" width="404" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;, else you will encounter errors when attempting to synthesize your CloudFormation template as seen in example below:&lt;br&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%2Fxztfagufljeos1s37twl.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%2Fxztfagufljeos1s37twl.png" alt="image" width="800" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A successful &lt;strong&gt;cdk synth&lt;/strong&gt; command will output the CloudFormation template as seen below:&lt;br&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%2Fmtfsta2vfi90ktvcqirw.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%2Fmtfsta2vfi90ktvcqirw.png" alt="image" width="540" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A successful &lt;strong&gt;cdk deploy&lt;/strong&gt; will deploy your CloudFormation template into your AWS account - below is what you will see in your account:&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%2Fe34fjrksqt0uwxker8t8.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%2Fe34fjrksqt0uwxker8t8.png" alt="image" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expand the stack and view &lt;strong&gt;Resources&lt;/strong&gt; and this is what you will &lt;br&gt;
   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%2Fu325sn9bmd0ruy6ogydu.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%2Fu325sn9bmd0ruy6ogydu.png" alt="image" width="800" height="322"&gt;&lt;/a&gt;&lt;br&gt;
Each of the resources aligns to the constructs defined as part of the stack - inside the app - as detailed at the beginning of this article.&lt;/p&gt;

&lt;p&gt;And that's it - you successfully deployed a CloudFormation template that provisioned your resources as defined in your AWS CDK app.&lt;/p&gt;

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

&lt;p&gt;AWS CDK Documentation talks about "dipping your toe in the water" of CDK and I found this workshop to be a great way of doing exactly this. &lt;br&gt;
Follow along as I did, let me know if you ended up provisioning completely different resources to the ones I provisioned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;References:&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cdkworkshop.com/" rel="noopener noreferrer"&gt;CDK Workshop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_prerequisites" rel="noopener noreferrer"&gt;AWS Cloud Development Kit Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Cover image by &lt;a href="https://unsplash.com/@galen_crout?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Galen Crout&lt;/a&gt; on &lt;a href="https://unsplash.com/collections/1399960/infrastructure?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>awscdk</category>
      <category>iac</category>
      <category>beginners</category>
    </item>
    <item>
      <title>My first 90 days as an Amazonian</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Wed, 03 Mar 2021 12:29:55 +0000</pubDate>
      <link>https://dev.to/vel12171/my-first-90-days-as-an-amazonian-18jl</link>
      <guid>https://dev.to/vel12171/my-first-90-days-as-an-amazonian-18jl</guid>
      <description>&lt;p&gt;And just like that, my first 90 days as an Amazonian have come and gone. &lt;br&gt;
Since starting this role I've been asked a lot about what it's like to work at Amazon and exactly what a Developer Advocate is.&lt;/p&gt;

&lt;p&gt;I will attempt to answer both of these questions in this post. I'll start with a very quick answer before I go into more detail: so far both experiences (working at Amazon and being a Developer Advocate) exceed anything that I could have imagined. &lt;br&gt;
I am not walking into an organization or a role that I absolutely have no idea of (I have been a member of the Amazon Web Services (AWS) community for some time now) - but even my past exposure to AWS couldn't have prepared me for all that I've learned since starting here at the end of last year.&lt;/p&gt;

&lt;p&gt;I &lt;a href="https://www.linkedin.com/posts/veliswa-boya_aws-awscommunity-activity-6740242890020155392-MVqN"&gt;posted&lt;/a&gt; about my excitement at starting as a Developer Advocate Europe, Middle East, and Africa (EMEA) at the start of December 2020 but I know that I couldn't have ever been able to articulate on that post just how happy I was to have landed this role, at this organization. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Working at Amazon&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;"You will feel like you're drinking from a firehose"; every piece of advice I received from fellow Amazonians when I first joined always contained this sentence. I may have laughed it off initially - but as the days progressed I came to realize what this means. The amount of information that literally hits you in the face feels exactly like this - like you're drinking from a firehose.&lt;/p&gt;

&lt;p&gt;Introduction to the &lt;a href="https://aws.amazon.com/careers/culture/"&gt;Leadership Principles&lt;/a&gt; happened very quickly. &lt;br&gt;
Everyone at Amazon lives by these Leadership Principles, they are intertwined into all that we do. They guide every interaction and every decision that we make every time with the customer. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Who have I met since joining?&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;I have met a countless number of colleagues - both my immediate team and all the other colleagues from other teams that I've been able to interact with so far. I have been offered so much support, helpful advice and have been made to feel that I have a place here.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Being a Developer Advocate&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;I am part of the EMEA Developer Advocacy team and I'm tasked with working very closely with AWS builder communities in the Sub-Saharan Africa.&lt;br&gt;
These builders fulfill various personas which range from Founders, to Developers, Architects, SysAdmins, Data Scientists etc.&lt;br&gt;
My role is to help these personas build successfully on AWS. I give mainly technical talks at meetups, conferences, webinars etc., and I blog content and mentor members of the community - all of this (and more) with the goal of building and growing the community.&lt;br&gt;
My role is usually defined as a one-to-many interaction kind of a role, this means that I don't speak to one customer at a time (e.g. an enterprise) - but to many customers at a time (hence the use of meetups etc. and all the other channels I mentioned previously).&lt;/p&gt;

&lt;p&gt;Almost immediately after joining, I walked the Customer Obsession Leadership Principle - starting with my customer and working backwards - as I reached out to various user groups within my region in an attempt to get to know them better, to gain a better understanding of their members and to understand how AWS can continue to partner with them. I would say the Dive Deep and the Learn &amp;amp; Be Curious Leadership Principles also applied here, getting close to all the detail in my attempt to understand the builders in my community definitely aligns to these principles.&lt;/p&gt;

&lt;p&gt;I have also had the opportunity to learn about services that I was not very familiar with before I took on this role; preparing for various technical talks at meetups and webinars has presented me with the opportunity to learn about services and architectures that I may not have spent that much time focusing on in the past.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;The AWS Community and Developer Advocacy&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Those who know me have an idea of how much it means to me that I have landed this role.&lt;br&gt;
I have been passionate about AWS and the AWS community for some time now. &lt;br&gt;
I have &lt;a href="https://dev.to/aws-heroes/3x-aws-certified-my-certification-journey-3bd1"&gt;written in the past&lt;/a&gt; about the importance of finding communities that support one's growth, communities that are spaces for one to learn and share knowledge. The AWS community has always been this for me and AWS Developer Advocates (who I now get to call "my colleagues") have been the teachers and sources of inspiration for me.&lt;/p&gt;

&lt;p&gt;It is surreal that I get to be part of this very same Developer Advocacy team, and now getting to pay-it-forward by getting to help this community that has been so instrumental to my growth,  build successfully on AWS.&lt;/p&gt;

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

&lt;p&gt;I am looking forward to still meet so many members of the community - to get to know you better as a community member and to collaborate with you and this is part of why I created this &lt;a href="https://www.linkedin.com/groups/9025345/"&gt;AWS Builders in the Sub-Saharan Africa LinkedIn Group&lt;/a&gt;. &lt;br&gt;
I am also learning everyday that it is always &lt;strong&gt;Day One&lt;/strong&gt;; and with that I will leave you with this video from Jeff Bezos explaining exactly what this means: &lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fTwXS2H_iJo"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you'd like to join the AWS team, check out the &lt;a href="//aws.amazon.com/careers/"&gt;available roles&lt;/a&gt;. If you have any questions or would like advice about applying or preparing, please contact me to talk more about it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>alwaysday1</category>
      <category>womenofamazon</category>
      <category>career</category>
    </item>
    <item>
      <title>Fun Project for getting started with AI: Rekognition DetectText</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Fri, 06 Nov 2020 13:53:41 +0000</pubDate>
      <link>https://dev.to/aws-heroes/fun-project-for-getting-started-with-ai-rekognition-detecttext-1na2</link>
      <guid>https://dev.to/aws-heroes/fun-project-for-getting-started-with-ai-rekognition-detecttext-1na2</guid>
      <description>&lt;p&gt;AWS offers a comprehensive set of services and APIs for Artificial Intelligence and Machine Learning.&lt;br&gt;
What's awesome about this is that this set of services caters for both customers without ML skills and those looking for advanced functions.&lt;/p&gt;

&lt;p&gt;I recently created an application that uses the &lt;a href="https://aws.amazon.com/rekognition/?blog-cards.sort-by=item.additionalFields.createdDate&amp;amp;blog-cards.sort-order=desc" rel="noopener noreferrer"&gt;Rekognition&lt;/a&gt; &lt;em&gt;DetectText API&lt;/em&gt;.&lt;br&gt;
Rekognition offers Image and Video APIs. &lt;strong&gt;The following Image APIs are available:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Labels
- Custom Labels
- Content Moderation
- Face Detection and Analysis
- Face search and verification
- Celebrity Recognition
- Personal Protective Equipment (PPE) detection
- Text detection 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;I recently created what would be a back-end of an application that receives images which contain text. The back-end (Python) calls the Rekognition DetectText API which extracts the text, receives the extracted text and concatenates this text into a string. The string is then published to an SNS topic as a message where all those subscribed will receive this message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Architecture Design of the solution&lt;/em&gt;&lt;/strong&gt;&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%2Fi%2F9772apuhynvm8ihm8fuf.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%2Fi%2F9772apuhynvm8ihm8fuf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SNS Topic:&lt;/strong&gt; Create a topic accordingly, with the relevant subscriptions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;S3 Bucket:&lt;/strong&gt; Create an S3 bucket and grant the necessary  permission. &lt;br&gt;
&lt;em&gt;If there needs to be public access, allow this through &lt;br&gt;
the access control lists (ACLs), bucket policies, access point  policies, etc.&lt;/em&gt;&lt;br&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%2Fi%2Fbib0mdv9wwde13yl3kbt.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%2Fi%2Fbib0mdv9wwde13yl3kbt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lambda Function:&lt;/strong&gt; modify the Basic Lambda Execution role to  include the following policies &lt;em&gt;(in addition to the default policy assigned at role creation)&lt;/em&gt;:&lt;br&gt;
&lt;strong&gt;&lt;em&gt;AmazonRekognitionReadOnlyAccess&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
  &lt;strong&gt;&lt;em&gt;AmazonS3ReadOnlyAccess&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
  &lt;strong&gt;&lt;em&gt;AmazonSNSFullAccess&lt;/em&gt;&lt;/strong&gt;&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%2Fi%2Feg9maomba2nstl517091.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%2Fi%2Feg9maomba2nstl517091.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lastly, include the following &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html" rel="noopener noreferrer"&gt;resource-based policy&lt;/a&gt;, so that S3 can trigger the Lambda on &lt;em&gt;PutObject&lt;/em&gt; of the image:&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%2Fi%2Fgngyuig5at0ol7ppxvoc.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%2Fi%2Fgngyuig5at0ol7ppxvoc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The complete code&lt;/strong&gt; is available in &lt;a href="https://github.com/veliswaan/rekognition-detect-text/tree/master" rel="noopener noreferrer"&gt;my github repository&lt;/a&gt; and the sample is as below:&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%2Fi%2Fhc2mzfwunlyh1mb7z7mh.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%2Fi%2Fhc2mzfwunlyh1mb7z7mh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I hope this gets you started on AWS AI if you haven't already - and that you find your own use cases that will have you build even more fun (or useful :)) AI applications.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>beginners</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Because....impostor syndrome!</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Mon, 28 Sep 2020 22:32:41 +0000</pubDate>
      <link>https://dev.to/vel12171/because-impostor-syndrome-139e</link>
      <guid>https://dev.to/vel12171/because-impostor-syndrome-139e</guid>
      <description>&lt;p&gt;I suck at this! Not the usual words that you'll ever hear me say - out loud! Definitely the words inside my head, words I say to myself quite a lot.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.merriam-webster.com/words-at-play/what-is-impostor-syndrome#:~:text=Originally%20called%20impostor%20phenomenon%2C%20impostor,or%20fraud%20rather%20than%20skill" rel="noopener noreferrer"&gt;Webster dictionary&lt;/a&gt; describes impostor syndrome as a false and sometimes crippling belief that one's successes are the product of luck or fraud rather than skill.&lt;/p&gt;

&lt;p&gt;Impostor syndrome goes very hand-in-hand with fear of failure, fear of success and self-sabotage.&lt;/p&gt;

&lt;p&gt;Impostor syndrome is real. It affects many of us especially in the tech industry, in deeply crippling ways. It can show up in so many forms which range from anxiety, constant comparison to others, feelings of inadequacy and self doubt. These are only some of the ways in which impostor syndrome shows up - I know I experience all of these, and some.&lt;/p&gt;

&lt;p&gt;Every time I get an opportunity to speak, mostly at meetups, I always proudly introduce myself as a mainframe developer who became a systems analyst, then a business analyst, a solutions architect...and now a cloud engineer.&lt;/p&gt;

&lt;p&gt;I have been wondering if my constantly changing roles and therefore my always finding myself in positions where I am starting from the bottom all over again, has caught up with me over the years. Could I have escaped these entire feelings of inadequacy had I stayed in roles - and technologies - where I made sure to hang around long enough to become the Subject Matter Expert?&lt;/p&gt;

&lt;p&gt;Nope, I don't think this is what would have saved me. No-one ever grows in comfort zones.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Five common types of impostor syndrome&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;There are five common types of impostor syndrome; which one am I? And which one would you say you are?&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%2Fi%2Fls05v9vunbh56t1m93sj.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%2Fi%2Fls05v9vunbh56t1m93sj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A combination of 1, 2 and 5 is definitely where I am.&lt;/p&gt;

&lt;p&gt;So how does one , if not eliminate, at the very least manage these feelings of being an impostor?&lt;/p&gt;

&lt;p&gt;Books I've read, coaches, mentors, friends, have all given very similar advice. I have been trying to walk this advice, but we all know that like with most things - it's a journey which will present one with good and bad moments. &lt;br&gt;
These will be moments where you feel like you're absolutely doing better at managing your impostor syndrome - and sometimes not.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Managing impostor syndrome&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So what are these actions that one can take?:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Data. Facts&lt;/strong&gt;. - this is a list/log of everything that you've succeeded in previously. Whenever you feel like you are out of your depth, consult this list and remind yourself of times when you absolutely pulled off something you thought you wouldn't.&lt;br&gt;
Friends, family, mentors etc. can contribute to this list, because sometimes......blind-spots right?&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Acquire knowledge&lt;/strong&gt; - back up your experience or intuition with knowledge. Invest time reading up on areas you want to improve on. Acquiring knowledge takes care of the "soloist" impostor syndrome, it validates the intuition that you have.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Finish the tasks you start&lt;/strong&gt; - are we techies not most guilty of this? all our side projects? I know I am most guilty here :)&lt;/p&gt;

&lt;p&gt;4) &lt;strong&gt;Ask for help&lt;/strong&gt; - need I say more? find other communities that you feel comfortable speaking up in? I know from personal experience that it's not always easy to open up around people we work with - so finding those communities is really important.&lt;/p&gt;

&lt;p&gt;5) &lt;strong&gt;Record positive feedback&lt;/strong&gt; - I have a folder where I store all positive emails I get from customers etc. It's always awesome to have these to look back on at times.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;My personal practical steps to manage impostor syndrome&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that I have had these reminders of how to counter impostor syndrome, which ones will I be applying?&lt;/p&gt;

&lt;p&gt;I need to be checking my list the most. I have a list, I just haven't checked it in a while :). I will be consulting it, to remind myself of times where I achieved things I didn't think I would. &lt;/p&gt;

&lt;p&gt;I am grateful that I have found supportive communities which provide safe spaces for me to ask for help, I need to remember to ask for help more whenever I feel overwhelmed.&lt;/p&gt;

&lt;p&gt;While at it, it will also be good to remember, as previously mentioned in this article, that this is all a journey. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In conclusion:&lt;/strong&gt; Be kind to yourself as you work through all you need to work through, as you seek to hopefully eliminate impostor syndrome.&lt;/p&gt;

</description>
      <category>career</category>
      <category>mentalhealth</category>
      <category>womenintech</category>
      <category>techcommunity</category>
    </item>
    <item>
      <title>Tutorials for getting started on AWS</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Mon, 14 Sep 2020 12:24:56 +0000</pubDate>
      <link>https://dev.to/aws-heroes/tutorials-for-getting-started-on-aws-11ln</link>
      <guid>https://dev.to/aws-heroes/tutorials-for-getting-started-on-aws-11ln</guid>
      <description>&lt;p&gt;Have you been looking to get started on AWS? Not sure how to start building applications using the services available? &lt;/p&gt;

&lt;p&gt;Getting your hands dirty so to speak - is always the best way to learn anything. Building applications using the services on AWS will go a long way towards helping you get started.&lt;/p&gt;

&lt;p&gt;I have relied on tutorials a lot to help with learning new services and AWS has a tutorial available for probably just about any topic you want :)&lt;/p&gt;

&lt;p&gt;I was looking to learn &lt;a href="https://docs.aws.amazon.com/amplify/index.html" rel="noopener noreferrer"&gt;Amplify&lt;/a&gt;; &lt;a href="https://amplify.aws/community/resources" rel="noopener noreferrer"&gt;tons of resources&lt;/a&gt; are available on Amplify - and I was very happy to come across the tutorial that I used here. It not only helped me get started on Amplify, but also taught me how this service integrates with other services on AWS.&lt;/p&gt;

&lt;p&gt;Now that I've done it, I've been wondering what took me so long??!!:)&lt;/p&gt;

&lt;p&gt;This is the &lt;a href="https://aws.amazon.com/getting-started/hands-on/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt; I used, and the steps are super easy to follow - I will therefore not repeat the steps here.&lt;/p&gt;

&lt;p&gt;Below is the architecture that you will end up with at the end of the process:&lt;br&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%2Fi%2Fdb6bdnw62f3ruoj4w1i6.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%2Fi%2Fdb6bdnw62f3ruoj4w1i6.png" alt="Alt Text"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Now that I have built this web application, I am looking to continue working on it as a way of teaching myself other services.&lt;/p&gt;

&lt;p&gt;I am looking to improve on it as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Secure it on the internet against DDoS attacks, SQL injections etc. with the &lt;a href="https://aws.amazon.com/waf/" rel="noopener noreferrer"&gt;AWS Web Application Firewall&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Include &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html" rel="noopener noreferrer"&gt;SSM Parameter Store&lt;/a&gt; to store all credentials, passwords etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Register a domain on &lt;a href="https://aws.amazon.com/route53/" rel="noopener noreferrer"&gt;Route53&lt;/a&gt; for a more user-friendly web name for my application&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and lastly, include &lt;a href="https://aws.amazon.com/kms/" rel="noopener noreferrer"&gt;AWS KMS&lt;/a&gt; to ensure encryption of data as a way of protecting against data loss.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Check the link &amp;gt;&amp;gt;&amp;gt;&lt;/strong&gt; for all &lt;a href="https://aws.amazon.com/getting-started/hands-on/?awsf.getting-started-content-type=content-type%23hands-on&amp;amp;?e=gs2020&amp;amp;p=gsrc" rel="noopener noreferrer"&gt;hands-on tutorials on AWS for all learning needs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy learning!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>awscertified</category>
    </item>
    <item>
      <title>3x AWS Certified: My certification journey</title>
      <dc:creator>Veliswa_Boya 🇿🇦</dc:creator>
      <pubDate>Tue, 11 Aug 2020 09:33:21 +0000</pubDate>
      <link>https://dev.to/aws-heroes/3x-aws-certified-my-certification-journey-3bd1</link>
      <guid>https://dev.to/aws-heroes/3x-aws-certified-my-certification-journey-3bd1</guid>
      <description>&lt;p&gt;I have now written and passed &lt;strong&gt;all 3 Associate level AWS certification exams&lt;/strong&gt;. It's a journey that's taken me exactly 3 years from the time I wrote my first - the Solutions Architect Associate - to when I wrote the last one; the Sysops Administrator Associate.&lt;/p&gt;

&lt;p&gt;Yep, probably a really long time taken to complete all three, but I hope as you read on you'll see why it took the time it did - and also realize that it's a personal journey so you determine the pace.&lt;br&gt;
Here's my part personal story, and part guide, of my AWS certification journey. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;AWS Certified Solutions Architect Associate (AWS CSAA)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I wrote the Solutions Architect Associate on the 22nd September 2017, my first one and a big deal by all counts. A lot was hanging on this certification - this was (I hoped) what would help open the doors to conversations that would hopefully lead to full-time cloud career opportunities. This certification was also at very early stages of my &lt;a href="https://dev.to/vel12171/my-life-changing-journey-to-being-aws-certified-2njn"&gt;cloud journey&lt;/a&gt;, I was therefore using it as validation of what I've learned so far.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Preparation: AWS CSAA&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This was to be my first certification so arriving at best resources to use for preparation took some research and asking friends for recommendations - A Cloud Guru was at the top of the list of recommendations and what remained was for me to try the videos out and see if they would work for me. Thankfully they did and they then formed a huge part of my preparation process.&lt;/p&gt;

&lt;p&gt;It took me exactly four weeks from the time I started preparations to the time I was able to write the exam. I wrote and passed - really to my surprise :). This feeling of surprise did change into an awesome sense of accomplishment over time, it is not an easy exam by any measure and the fact that I had passed definitely had to mean something.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;AWS Certified Developer Associate (AWS CDA)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I wrote the Developer Associate just over a year after writing the Solutions Architect. The delay was influenced by a number of factors; one of them being the fact that getting that full-time cloud job took longer than hoped. Other work and life commitments also influenced the delay - but I always knew that I'd come back and write at least the entire associate level exams.&lt;/p&gt;

&lt;p&gt;I found this to be the most challenging of all three. I initially thought that this was because I am not a full-time developer but I think beyond that, my personal view, this exam is just hard.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Preparation: AWS CDA&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The preparation process was the same, in that I used the exact same resources as for Solutions Architect (full list to be detailed later). I felt like I was not ready throughout my preparations, I was very anxious about writing this exam that I think I may have over-prepared if such a thing exists.&lt;br&gt;&lt;br&gt;
It was amazing to pass the Developer Associate. I also discovered that my motivation had changed. Unlike the AWS CSAA I was already a Cloud Engineer when I wrote the AWS CDA, so the desperation that went with hoping to get a job was no longer there. The desperation was instead replaced by pure curiosity to learn and be better at my job.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;AWS Certified SysOps Administrator Associate (AWS CSOA)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I recently wrote and passed the SysOps Administrator exam. I am still torn as to whether this is the hardest versus the Developer exam. What I will say is that I enjoyed preparing for this one the most. There is a huge troubleshooting aspect to this exam, and I enjoy solving problems - maybe the +10 years of production support that I did when I worked on mainframes right at the beginning of my career has something to do with it.&lt;br&gt;
It took time between the Developer exam and this, but once I finally made up my mind that I wanted to write - it took me exactly three weeks to prepare and write.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Preparation: AWS CSOA&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The preparation - although there's a lot of material to go through - felt better because a lot of the concepts were no longer new to me.&lt;br&gt;
Also, interesting to note that this was the first exam where I didn't go into absolute surprise at finding out that I've passed. The surprise was this time replaced by a huge realization of how far I've come, I stared at the "PASS" result on the screen for a while, for the first time allowing myself to be proud of my accomplishments. &lt;/p&gt;

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

&lt;p&gt;Associate level done! It feels awesome to say this, to realize it. So what's next? If you remember I wrote CSAA in 2017! Renewal time is fast approaching. I am preparing for this and hoping to write soon. &lt;br&gt;
Once done with this, I will prepare for the Security Specialty - cloud security is an area I'm hugely interested in, and I am looking forward to doing this course.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In closing&lt;/strong&gt;, I would like to highlight the importance of finding communities that will support your learning and growth. I have been fortunate enough to find these throughout my journey - on various platforms. &lt;/p&gt;

&lt;p&gt;While preparing for my CSOA I came across the &lt;strong&gt;#100DaysofCloud&lt;/strong&gt; challenge on LinkedIn/Twitter/Discord and with that I found a group of like-minded and highly supportive people. If you are &lt;em&gt;especially&lt;/em&gt; starting out on your cloud journey, &lt;a href="https://discord.gg/Pj6SUmS" rel="noopener noreferrer"&gt;join them&lt;/a&gt; on Discord - you will find support and be directed to additional/alternative resources that will help you on your journey!&lt;/p&gt;

&lt;p&gt;Attending meetups has always been a key part of my learning. Meetups provide spaces to learn from others, they also provide opportunities for one to share with others what they know. &lt;br&gt;
Now that these are currently held online - one can virtually be anywhere where the learning is. Here are a few that I attend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.meetup.com/AWS-PTA/" rel="noopener noreferrer"&gt;Pretoria AWS Meetup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meetup.com/AWS-South-Wales-User-Group/" rel="noopener noreferrer"&gt;AWS South Wales UserGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meetup.com/Cape-Town-DevOps/" rel="noopener noreferrer"&gt;Cape Town DevOps Meetup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also check out the &lt;a href="https://aws-community.africa" rel="noopener noreferrer"&gt;AWS Community Africa&lt;/a&gt; on &lt;a href="https://www.slack.com" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;, we discuss all things AWS - and you are welcome to join us even if you are outside of Africa! :)&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Resources I used throughout all preparations&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;1) &lt;a href="https://www.acloud.guru" rel="noopener noreferrer"&gt;A Cloud Guru&lt;/a&gt; training videos&lt;/p&gt;

&lt;p&gt;2) Labs that form part of the training videos&lt;/p&gt;

&lt;p&gt;3) &lt;a href="https://aws.amazon.com/whitepapers" rel="noopener noreferrer"&gt;AWS White Papers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4) Relevant videos contained in the Amazon Web Services channel on &lt;br&gt;
   Youtube &lt;/p&gt;

&lt;p&gt;5) Jon Bonso / &lt;a href="https://www.tutorialsdojo.com" rel="noopener noreferrer"&gt;tutorialsdojo&lt;/a&gt; &lt;br&gt;
   Practice Exams&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awscertified</category>
      <category>beginners</category>
      <category>career</category>
    </item>
  </channel>
</rss>
