<?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: Gedion Daniel</title>
    <description>The latest articles on DEV Community by Gedion Daniel (@gediondev).</description>
    <link>https://dev.to/gediondev</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%2F2538857%2F1ed982a2-c1f2-4991-82f2-476cf68d5bc3.jpg</url>
      <title>DEV Community: Gedion Daniel</title>
      <link>https://dev.to/gediondev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gediondev"/>
    <language>en</language>
    <item>
      <title>How to Become an AWS Community Builder: Complete Guide for 2026 Applications</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Sat, 27 Dec 2025 15:13:05 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-to-become-an-aws-community-builder-complete-guide-for-2026-applications-3902</link>
      <guid>https://dev.to/aws-builders/how-to-become-an-aws-community-builder-complete-guide-for-2026-applications-3902</guid>
      <description>&lt;p&gt;The AWS Community Builders program is a transformative opportunity for passionate cloud enthusiasts to elevate their AWS journey, connect with like-minded builders worldwide, and make a meaningful impact on the global AWS community. If you're considering applying for the 2026 cohort, this comprehensive guide will walk you through everything you need to know to stand out in your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the AWS Community Builders Program?
&lt;/h2&gt;

&lt;p&gt;The AWS Community Builders program is a global initiative designed to support and recognize technical enthusiasts and emerging thought leaders who actively share AWS knowledge and engage with the cloud community. It's not a certification program, nor is it a job it's a vibrant community of builders dedicated to learning, sharing, and growing together.&lt;/p&gt;

&lt;p&gt;The program accepts builders from diverse backgrounds and regions, focusing on those who demonstrate consistent community engagement through content creation, knowledge sharing, and helping others learn AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Program Categories for 2026
&lt;/h2&gt;

&lt;p&gt;When applying, you'll select a specialty category that aligns with your expertise and interests. The current categories include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Serverless&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine Learning &amp;amp; AI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security &amp;amp; Identity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data (Databases, Analytics)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Tools&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Front-End Web and Mobile&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud Operations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Networking &amp;amp; Content Delivery&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose the category where you've actively contributed and have genuine interest. Don't try to fit into a category just because it seems popular authenticity matters more than anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Benefits of Joining
&lt;/h2&gt;

&lt;p&gt;The AWS Community Builders program offers incredible benefits that extend far beyond swag:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$500-$1000 in AWS credits for hands-on experimentation&lt;/li&gt;
&lt;li&gt;100% voucher coverage for AWS certification exams (Foundational, Associate, or Professional/Specialty)&lt;/li&gt;
&lt;li&gt;Early access to new AWS services and features&lt;/li&gt;
&lt;li&gt;Direct access to AWS service teams and subject matter experts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Learning &amp;amp; Development:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exclusive technical webinars and workshops&lt;/li&gt;
&lt;li&gt;Mentorship from AWS subject matter experts&lt;/li&gt;
&lt;li&gt;Best practices for content creation and community engagement&lt;/li&gt;
&lt;li&gt;Support for submitting CFPs and securing speaking engagements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Community &amp;amp; Networking:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global network of fellow builders&lt;/li&gt;
&lt;li&gt;Exclusive Slack workspace for collaboration&lt;/li&gt;
&lt;li&gt;Opportunities to volunteer at AWS events&lt;/li&gt;
&lt;li&gt;Discount passes for AWS Summits and re:Invent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recognition:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listing in the official AWS Community Builders Directory&lt;/li&gt;
&lt;li&gt;Exclusive AWS-branded merchandise and swag kits&lt;/li&gt;
&lt;li&gt;Opportunity to influence AWS product development&lt;/li&gt;
&lt;li&gt;Potential pathway to the AWS Heroes program&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Journey: A Personal Experience
&lt;/h2&gt;

&lt;p&gt;Let me share my experience as someone who successfully joined the AWS Community Builders program in the Serverless category.&lt;/p&gt;

&lt;p&gt;When I applied, I had been consistently writing blog posts about AWS services and sharing what I was learning with the community. This wasn't about being an expert it was about documenting my learning journey and making AWS concepts accessible to others. That consistency and commitment to helping others learn became my strongest signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Helped Me Stand Out
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Consistent Content Creation&lt;/strong&gt;&lt;br&gt;
I wrote blog posts regularly about AWS services, serverless architectures, and solutions to common challenges. I didn't wait until I was an "expert" I shared my learning journey authentically, including the mistakes and lessons learned along the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Three Critical Public Links&lt;/strong&gt;&lt;br&gt;
The application requires three public links that showcase your contributions. This is arguably the most important part of your application. I attached:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technical blog posts I had written&lt;/li&gt;
&lt;li&gt;AWS certifications I had earned&lt;/li&gt;
&lt;li&gt;Documentation of community events and workshops&lt;/li&gt;
&lt;li&gt;Any AWS-related course completion certificate links or in-progress course links that show I am learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Apply: Step-by-Step Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Important Dates
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application Window:&lt;/strong&gt; Opens in January 2026&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadline:&lt;/strong&gt; Typically mid-January (approximately January 20, 2026)&lt;/li&gt;
&lt;li&gt;You can join the waitlist at the AWS Community Builders page to be notified when applications open&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Age Requirement:&lt;/strong&gt; Must be 18 years or older&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Contributions:&lt;/strong&gt; You need at least two genuine, recent contributions to the AWS community. These should be from within the last year, demonstrating current momentum rather than past achievements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public Links:&lt;/strong&gt; All evidence must be publicly accessible. AWS can't consider private repositories, internal documents, or content behind paywalls.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Application Process
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create Your AWS Builder ID&lt;/strong&gt;&lt;br&gt;
Before starting your application, create a free Builder ID. Use the name you're known by in your content, not necessarily your legal name. For example, if you publish as "CloudGuru Alex," use that name throughout keep it consistent across your Builder ID, application, and content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Choose Your Category&lt;/strong&gt;&lt;br&gt;
Select the category where you've already made contributions. If you want to apply for AI, for example, you should already have blog posts, videos, talks, or projects related to AWS AI/ML services. Don't choose a category you plan to explore choose one where you've already been active.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Prepare Your Three Public Links&lt;/strong&gt;&lt;br&gt;
This is crucial. Your three links should demonstrate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technical depth and accuracy&lt;/li&gt;
&lt;li&gt;Ability to explain complex concepts clearly&lt;/li&gt;
&lt;li&gt;Genuine value to the community&lt;/li&gt;
&lt;li&gt;Consistency in contribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples of strong links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In-depth technical blog posts or tutorials&lt;/li&gt;
&lt;li&gt;Video content or presentations from meetups/conferences&lt;/li&gt;
&lt;li&gt;Open-source projects or contributions&lt;/li&gt;
&lt;li&gt;AWS certifications (though this alone isn't sufficient)&lt;/li&gt;
&lt;li&gt;Community or event documentation (photos, recordings, testimonials)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For community organizers: Include Zoom meeting screenshots, event photos, video recordings of talks, workshop materials, or testimonials from participants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Write Your Story (1000 characters or less)&lt;/strong&gt;&lt;br&gt;
Share your cloud journey authentically. AWS wants to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why you're passionate about AWS and cloud computing&lt;/li&gt;
&lt;li&gt;How you're already helping others in the community&lt;/li&gt;
&lt;li&gt;Your vision for continued contribution&lt;/li&gt;
&lt;li&gt;What makes your perspective unique&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Highlight Community Impact&lt;/strong&gt;&lt;br&gt;
Emphasize how you're helping others learn AWS. If you're an AWS Captain or community organizer, showcase this prominently. AWS is looking for people who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organize or participate in user group meetings&lt;/li&gt;
&lt;li&gt;Run workshops or training sessions&lt;/li&gt;
&lt;li&gt;Answer questions in forums (re:Post, Stack Overflow, Reddit)&lt;/li&gt;
&lt;li&gt;Create educational content consistently&lt;/li&gt;
&lt;li&gt;Mentor other builders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Complete All Legal Questions&lt;/strong&gt;&lt;br&gt;
Don't skip any questions, especially about communication preferences. If you don't opt in to emails, AWS can't notify you about your application status, even if you're accepted.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes a Successful Application?
&lt;/h2&gt;

&lt;p&gt;Based on program insights and successful applicants' experiences, here's what AWS explicitly looks for:&lt;/p&gt;

&lt;h3&gt;
  
  
  Recent and Consistent Contributions
&lt;/h3&gt;

&lt;p&gt;The AWS team evaluates your current behavior and momentum, not what you did years ago. They want to see contributions from within the last year. Many applications fail because candidates start contributing too late or only after discovering the program.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quality Over Quantity
&lt;/h3&gt;

&lt;p&gt;One well-written, in-depth blog post that helps others solve a real problem is worth more than ten superficial posts. Focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technical accuracy&lt;/li&gt;
&lt;li&gt;Clear explanations&lt;/li&gt;
&lt;li&gt;Practical value&lt;/li&gt;
&lt;li&gt;Unique insights or approaches&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community Engagement
&lt;/h3&gt;

&lt;p&gt;It's not just about creating content it's about engaging with the community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responding to comments on your posts&lt;/li&gt;
&lt;li&gt;Participating in forums and discussions&lt;/li&gt;
&lt;li&gt;Attending or organizing meetups&lt;/li&gt;
&lt;li&gt;Helping others solve problems&lt;/li&gt;
&lt;li&gt;Collaborating on open-source projects&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Authentic Passion
&lt;/h3&gt;

&lt;p&gt;AWS values genuine enthusiasm over polished expertise. Show that you're passionate about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning AWS services&lt;/li&gt;
&lt;li&gt;Sharing knowledge with others&lt;/li&gt;
&lt;li&gt;Growing the AWS community&lt;/li&gt;
&lt;li&gt;Continuous learning and improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Specific Tips for Different Categories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For AI Category Applicants
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Share blog posts about using Amazon Bedrock, SageMaker, or Rekognition&lt;/li&gt;
&lt;li&gt;Create tutorials on building AI applications with AWS services&lt;/li&gt;
&lt;li&gt;Discuss AI/ML best practices and architectural patterns&lt;/li&gt;
&lt;li&gt;Demonstrate practical projects using AWS AI services&lt;/li&gt;
&lt;li&gt;Participate in AI-focused AWS events or hackathons&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Serverless Category Applicants
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Write about Lambda functions, API Gateway, Step Functions&lt;/li&gt;
&lt;li&gt;Share serverless architecture patterns and best practices&lt;/li&gt;
&lt;li&gt;Create tutorials on event-driven architectures&lt;/li&gt;
&lt;li&gt;Discuss cost optimization in serverless applications&lt;/li&gt;
&lt;li&gt;Contribute to serverless frameworks or tools&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Any Category
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pick the category that genuinely reflects your contributions, not what seems easiest or most popular&lt;/li&gt;
&lt;li&gt;Ensure your three public links align with your chosen category&lt;/li&gt;
&lt;li&gt;Demonstrate both breadth and depth in your selected specialty&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Starting Too Late&lt;/strong&gt;&lt;br&gt;
Don't discover the contribution requirement while filling out the application. Start contributing at least 3-6 months before applications open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Focusing Only on Certifications&lt;/strong&gt;&lt;br&gt;
While certifications are valuable, a post saying "I passed my certification exam" doesn't help other builders learn AWS. Focus on teaching concepts, sharing solutions, and creating educational content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Using Company Content&lt;/strong&gt;&lt;br&gt;
Only share content you personally created and own. Company blog posts or internal documentation won't count unless they're under your name and publicly accessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Inconsistent Naming&lt;/strong&gt;&lt;br&gt;
Use the same name across your Builder ID, application, and content. Inconsistency can make it harder for AWS to verify your contributions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Generic or Brief Content&lt;/strong&gt;&lt;br&gt;
Avoid surface-level content. Dive deep, share real-world experiences, include code examples, and provide actionable insights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Ignoring Community Engagement&lt;/strong&gt;&lt;br&gt;
Creating content in isolation isn't enough. Show that you engage with others, respond to questions, and participate in the community ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Your Portfolio Before You Apply
&lt;/h2&gt;

&lt;p&gt;If you're planning to apply in January 2026, start preparing now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3-6 Months Before Application:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start writing blog posts regularly (aim for at least 2-4 quality posts)&lt;/li&gt;
&lt;li&gt;Create video tutorials or presentations&lt;/li&gt;
&lt;li&gt;Participate actively in AWS forums and communities&lt;/li&gt;
&lt;li&gt;Attend local AWS user group meetings&lt;/li&gt;
&lt;li&gt;Consider organizing a workshop or study group&lt;/li&gt;
&lt;li&gt;Earn an AWS certification if you haven't already&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1-2 Months Before Application:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review and polish your best content&lt;/li&gt;
&lt;li&gt;Gather evidence of community impact (screenshots, testimonials, metrics)&lt;/li&gt;
&lt;li&gt;Prepare your three strongest public links&lt;/li&gt;
&lt;li&gt;Draft your cloud story&lt;/li&gt;
&lt;li&gt;Get feedback from other Community Builders if possible&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to Include in Your Three Public Links
&lt;/h2&gt;

&lt;p&gt;For maximum impact, your links should showcase:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link 1: Technical Depth&lt;/strong&gt;&lt;br&gt;
A comprehensive blog post or tutorial that demonstrates your deep understanding of AWS services. Include code examples, architecture diagrams, and practical insights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link 2: Community Impact&lt;/strong&gt;&lt;br&gt;
Evidence of helping others this could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A popular post that solved a common problem&lt;/li&gt;
&lt;li&gt;Video of a presentation or workshop you led&lt;/li&gt;
&lt;li&gt;Documentation of events you organized&lt;/li&gt;
&lt;li&gt;Open-source contribution that benefits the community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Link 3: Consistency or Specialization&lt;/strong&gt;&lt;br&gt;
Show either consistent contributions (multiple blog posts in your category) or specialized expertise (a particularly impressive project or achievement).&lt;/p&gt;

&lt;p&gt;For Community Organizers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event photos with participant counts&lt;/li&gt;
&lt;li&gt;Zoom recordings of virtual meetups&lt;/li&gt;
&lt;li&gt;Testimonials from participants&lt;/li&gt;
&lt;li&gt;Documentation of workshops or training sessions&lt;/li&gt;
&lt;li&gt;Links to user group pages or event announcements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  After Submitting Your Application
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Be Patient&lt;/strong&gt;&lt;br&gt;
AWS receives thousands of applications globally. The review process takes time, often several weeks or months. Applications are typically reviewed once a year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continue Contributing&lt;/strong&gt;&lt;br&gt;
Don't stop creating content while waiting. Continue your normal contribution patterns. Many successful applicants kept building their portfolios throughout the review period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't Get Discouraged by Rejection&lt;/strong&gt;&lt;br&gt;
Many successful Community Builders weren't accepted on their first attempt. If you're not selected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask for feedback if possible&lt;/li&gt;
&lt;li&gt;Continue contributing to the community&lt;/li&gt;
&lt;li&gt;Strengthen your portfolio&lt;/li&gt;
&lt;li&gt;Apply again next year with improved evidence of impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application process is competitive, with acceptance rates around 12-15% growth year over year. Rejection doesn't reflect your technical skills it often means you need more visible community contributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Once You're Accepted
&lt;/h2&gt;

&lt;p&gt;As a Community Builder, you're encouraged to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Participate in virtual calls and community sessions&lt;/li&gt;
&lt;li&gt;Continue creating educational content&lt;/li&gt;
&lt;li&gt;Engage actively in the Slack workspace&lt;/li&gt;
&lt;li&gt;Attend or volunteer at AWS events&lt;/li&gt;
&lt;li&gt;Try new services with your AWS credits&lt;/li&gt;
&lt;li&gt;Use certification vouchers to advance your skills&lt;/li&gt;
&lt;li&gt;Share feedback with AWS service teams&lt;/li&gt;
&lt;li&gt;Mentor other aspiring builders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The program runs in one-year intervals, and you'll need to reapply annually if you want to continue. Reapplication focuses on showing examples of your contributions during your time as a Community Builder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Success Stories and Impact
&lt;/h2&gt;

&lt;p&gt;Being an AWS Community Builder can significantly impact your career and technical growth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many Community Builders have become AWS Heroes&lt;/li&gt;
&lt;li&gt;Builders gain recognition in the global AWS community&lt;/li&gt;
&lt;li&gt;The network opens doors to speaking opportunities at major conferences&lt;/li&gt;
&lt;li&gt;Direct access to AWS teams accelerates learning and innovation&lt;/li&gt;
&lt;li&gt;The community provides mentorship and collaboration opportunities&lt;/li&gt;
&lt;li&gt;Some builders have launched consulting careers or joined AWS itself&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The AWS Community Builders program is more than a title or a collection of benefits it's about becoming part of a global movement of builders who are passionate about AWS and committed to helping others succeed.&lt;/p&gt;

&lt;p&gt;You don't need to be an expert to apply. You need to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passionate about AWS and cloud computing&lt;/li&gt;
&lt;li&gt;Committed to sharing knowledge&lt;/li&gt;
&lt;li&gt;Actively helping others in the community&lt;/li&gt;
&lt;li&gt;Consistent in your contributions&lt;/li&gt;
&lt;li&gt;Authentic in your approach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're organizing events, writing blog posts, creating videos, answering questions in forums, or contributing to open-source projects, you're already on the right path. Document your contributions, gather your evidence, and prepare to share your story.&lt;/p&gt;

&lt;p&gt;The January 2026 application window will open soon. Start preparing now build your portfolio, engage with the community, and get ready to submit a strong application. Even if you're not accepted on your first attempt, the process of preparing and contributing will accelerate your growth and strengthen your position for future applications.&lt;/p&gt;

&lt;p&gt;Remember, the AWS Community Builders program is looking for people who are already builders at heart people who naturally share, teach, collaborate, and contribute. If that describes you, don't hesitate to apply. The community needs your unique perspective and contributions.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Join the Waitlist:&lt;/strong&gt; &lt;a href="https://aws.amazon.com/developer/community/community-builders/" rel="noopener noreferrer"&gt;AWS Community Builders Program&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow Jason Dunn&lt;/strong&gt; (AWS Community Builders Program Manager) on LinkedIn for the latest updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse Current Community Builders:&lt;/strong&gt; Check out the &lt;a href="https://aws.amazon.com/developer/community/community-builders/community-builders-directory/" rel="noopener noreferrer"&gt;Community Builders Directory&lt;/a&gt; for inspiration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join AWS User Groups:&lt;/strong&gt; Find a local or virtual AWS user group in your area&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create Your Builder ID:&lt;/strong&gt; Set up your free AWS Builder ID today&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The journey to becoming an AWS Community Builder starts with a single contribution. Start creating, start sharing, and start building your community is waiting.&lt;/p&gt;

&lt;p&gt;Good luck with your application, and I hope to see you in the AWS Community Builders program soon!&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>community</category>
      <category>cloud</category>
      <category>ai</category>
    </item>
    <item>
      <title>My Journey to AWS Certified AI Practitioner</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Thu, 14 Aug 2025 11:07:27 +0000</pubDate>
      <link>https://dev.to/aws-builders/my-journey-to-aws-certified-ai-practitioner-16hi</link>
      <guid>https://dev.to/aws-builders/my-journey-to-aws-certified-ai-practitioner-16hi</guid>
      <description>&lt;p&gt;🏅 View my badge here: &lt;a href="https://lnkd.in/d-TnX4qd" rel="noopener noreferrer"&gt;https://lnkd.in/d-TnX4qd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This certification is designed for anyone looking to validate their understanding of &lt;strong&gt;AI, Machine Learning (ML), and Generative AI&lt;/strong&gt;, especially in the context of AWS cloud services.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Learning Timeline
&lt;/h2&gt;

&lt;p&gt;My journey took a few months of focused study. Initially, I wasn’t sure which resources to prioritize, and I didn’t start with hands-on exercises right away. Once I structured my learning around practical labs, official AWS content, and practice exams, my progress accelerated significantly.&lt;/p&gt;




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

&lt;p&gt;Here’s what helped me the most:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Stéphane Maarek’s AWS AI Practitioner Course&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://lnkd.in/dQMA6n3t" rel="noopener noreferrer"&gt;Course Link&lt;/a&gt;
Stéphane’s course is thorough and beginner-friendly. His clear explanations and practical examples made AI/ML concepts easy to understand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. AWS Skill Builder – Exam Prep&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://lnkd.in/dDAC4XvJ" rel="noopener noreferrer"&gt;Skill Builder Link&lt;/a&gt;
The official AWS learning platform offered structured modules aligned with exam objectives. Interactive exercises and up-to-date content complemented the course perfectly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Practice Exams by Stéphane Maarek&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://lnkd.in/dGMQRrBZ" rel="noopener noreferrer"&gt;Practice Exams Link&lt;/a&gt;
The practice exams were slightly more challenging than the real test, which built confidence and helped me identify weak areas.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What the Exam Covers
&lt;/h2&gt;

&lt;p&gt;The AI Practitioner exam tests your understanding of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core AI/ML concepts and Generative AI fundamentals&lt;/li&gt;
&lt;li&gt;AWS AI/ML services like &lt;strong&gt;Amazon SageMaker, Bedrock, Rekognition, Comprehend&lt;/strong&gt;, and more&lt;/li&gt;
&lt;li&gt;Responsible AI and ethical considerations&lt;/li&gt;
&lt;li&gt;The ML lifecycle: data preparation, model training, evaluation, deployment&lt;/li&gt;
&lt;li&gt;Types of learning: supervised, unsupervised, reinforcement&lt;/li&gt;
&lt;li&gt;Evaluation metrics: accuracy, precision, recall, F1, etc.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Exam Experience
&lt;/h2&gt;

&lt;p&gt;I opted to take the exam online, but I recommend preparing your environment carefully to avoid distractions or connectivity issues. The exam itself is beginner-friendly with &lt;strong&gt;moderate difficulty&lt;/strong&gt; — a perfect entry point into AI/ML on AWS.&lt;/p&gt;




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

&lt;p&gt;Earning the &lt;strong&gt;AWS Certified AI Practitioner&lt;/strong&gt; certification is a significant milestone in my AI/ML journey. Combining Stéphane Maarek’s course, AWS Skill Builder, and rigorous practice exams made the preparation structured and achievable.&lt;/p&gt;

&lt;p&gt;For anyone preparing, my advice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use both official AWS materials and trusted third-party courses&lt;/li&gt;
&lt;li&gt;Do plenty of hands-on labs&lt;/li&gt;
&lt;li&gt;Practice with mock exams to boost confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This exam is not just about passing — it’s about building a solid foundation for your career in &lt;strong&gt;AI, ML, and cloud computing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s keep learning and growing! 🚀&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🖥️ &lt;a href="https://www.gediondaniel.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>awsaipractitioner</category>
      <category>ai</category>
      <category>certification</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Creating an Amazon Bedrock Nova Canvas MCP Server and Claude Desktop Integration</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Mon, 11 Aug 2025 17:17:40 +0000</pubDate>
      <link>https://dev.to/aws-builders/creating-an-amazon-bedrock-nova-canvas-mcp-server-and-claude-desktop-integration-2ina</link>
      <guid>https://dev.to/aws-builders/creating-an-amazon-bedrock-nova-canvas-mcp-server-and-claude-desktop-integration-2ina</guid>
      <description>&lt;p&gt;let's create an MCP Server using AWS Resources. This example shows how to call the &lt;a href="https://aws.amazon.com/ko/ai/generative-ai/nova/creative/" rel="noopener noreferrer"&gt;Amazon Nova Canvas&lt;/a&gt; model in natural language through Claude Desktop to generate images.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, set up a Python project locally by running the following commands:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv init mcp-nova-canvas
&lt;span class="nb"&gt;cd &lt;/span&gt;mcp-nova-canvas

uv venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate

uv add &lt;span class="s2"&gt;"mcp[cli]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up the necessary dependencies in pyproject.toml:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[project]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mcp-nova-canvas"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Add your description here"&lt;/span&gt;
&lt;span class="py"&gt;readme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"README.md"&lt;/span&gt;
&lt;span class="py"&gt;requires-python&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.11&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="py"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="py"&gt;"boto3&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.37&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="py"&gt;"httpx&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.28&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="py"&gt;"mcp[cli]&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.8&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="py"&gt;"pillow&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;11.1&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="py"&gt;"uuid&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.30&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="s"&gt;"loguru"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paste &lt;a href="https://github.com/Gediontkd/mcp-nova-canvas/blob/main/main.py" rel="noopener noreferrer"&gt;main.py&lt;/a&gt; into the main.py, create and paste &lt;a href="https://github.com/Gediontkd/mcp-nova-canvas/blob/main/utils.py" rel="noopener noreferrer"&gt;utils.py&lt;/a&gt; into the utils.py, &lt;a href="https://github.com/Gediontkd/mcp-nova-canvas/blob/main/constants.py" rel="noopener noreferrer"&gt;constants.py&lt;/a&gt; into the constants.py file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following content to the &lt;code&gt;claude_desktop_config.json&lt;/code&gt; file to check in Claude Desktop:&lt;br&gt;
&lt;/p&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;"canvas"&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;"uv"&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="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"--directory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"/ABSOLUTE/ATH/TO/PARENT/FOLDER/mcp-nova-canvas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"main.py"&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;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip&lt;/strong&gt;: If you have trouble finding the file, run Claude Desktop and look in Settings -&amp;gt; Developer -&amp;gt; Edit Config.&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%2F31sfx406hxuio2g7eea8.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%2F31sfx406hxuio2g7eea8.png" alt="finding claude_desktop_config.json file" width="793" height="834"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click File -&amp;gt; Exit and Restart Claude Desktop and enter "generate_image YOUR PROMPT":&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%2F0vqbn1b3si7n98b2ldav.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%2F0vqbn1b3si7n98b2ldav.png" alt="asking for permission" width="800" height="700"&gt;&lt;/a&gt;&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%2Fm6ubjxwu0k4ty8gjn33n.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%2Fm6ubjxwu0k4ty8gjn33n.png" alt="image successfully generated" width="800" height="673"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the image in the output folder in the main directory.&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%2F2yod2i18dnfqs1la4jgi.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%2F2yod2i18dnfqs1la4jgi.png" alt="classic italian restaurant" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Summary&lt;br&gt;
In this module, you learned how to build an MCP server in a local environment and integrate it with Claude Desktop.&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🖥️ &lt;a href="https://www.gediondaniel.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>amazoncanvas</category>
      <category>mcp</category>
      <category>amazonnovacanvas</category>
      <category>claudeai</category>
    </item>
    <item>
      <title>Sticky Sessions: How One Simple Fix Solved Our User Experience Nightmare</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Mon, 11 Aug 2025 14:55:45 +0000</pubDate>
      <link>https://dev.to/aws-builders/sticky-sessions-how-one-simple-fix-solved-our-user-experience-nightmare-3k8h</link>
      <guid>https://dev.to/aws-builders/sticky-sessions-how-one-simple-fix-solved-our-user-experience-nightmare-3k8h</guid>
      <description>&lt;p&gt;&lt;strong&gt;Have you ever wondered how websites remember your shopping cart even when multiple servers are handling your requests? That's where sticky sessions come in! Let's break down what they are and why they matter, including how they helped solve a real problem at our company.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Are Sticky Sessions?
&lt;/h3&gt;

&lt;p&gt;Imagine you're at a busy restaurant with multiple servers. Sticky sessions are like having the same waiter serve you throughout your entire meal, instead of getting a different waiter each time you need something. In the tech world, this means directing a user to the same server for all their requests during their visit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Are They Important?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Session Data Management:&lt;/strong&gt; When you log into a website, your session information (like your login status or shopping cart) is often stored on the server. If you keep getting sent to different servers, this information might get lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better Performance:&lt;/strong&gt; Your first server already has your information loaded, so staying with it can make things faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency:&lt;/strong&gt; It prevents weird issues that can happen when different servers handle your requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Our Real-World Problem and Solution
&lt;/h3&gt;

&lt;p&gt;We recently faced a challenging situation at our company. Users were experiencing issues because each time they made an API call, they would get connected to a different server. This caused problems because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session information wasn't consistent&lt;/li&gt;
&lt;li&gt;Users had to log in multiple times&lt;/li&gt;
&lt;li&gt;Data sometimes appeared to be missing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The solution? We enabled sticky sessions! This simple change made sure that once a user connected to a server, they stayed with that same server for their entire session. The results were immediate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users stayed logged in&lt;/li&gt;
&lt;li&gt;Data remained consistent&lt;/li&gt;
&lt;li&gt;The overall experience became much smoother&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How Sticky Sessions Work
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;First Visit:&lt;/strong&gt; When you first visit a website, the load balancer assigns you to a server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cookie Creation:&lt;/strong&gt; A special cookie is created that helps remember which server you're using&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Future Requests:&lt;/strong&gt; The load balancer reads this cookie and sends you back to the same server&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  When Should You Use Sticky Sessions?
&lt;/h3&gt;

&lt;p&gt;Sticky sessions are great when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your application stores session data on individual servers&lt;/li&gt;
&lt;li&gt;You need to maintain user state during a session&lt;/li&gt;
&lt;li&gt;You're dealing with stateful applications&lt;/li&gt;
&lt;li&gt;You want to ensure consistent user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Set Appropriate Timeouts:&lt;/strong&gt; Don't make sessions stick forever&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan for Server Failures:&lt;/strong&gt; Have a backup plan in case a server goes down&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor Session Distribution:&lt;/strong&gt; Make sure users are spread evenly across servers&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consider Alternatives:&lt;/strong&gt; For some cases, distributed caching might be better&lt;/p&gt;

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

&lt;p&gt;Sticky sessions might seem like a small detail, but they can make a huge difference in how well your application works. Our company's experience shows how a simple configuration change can solve significant problems. Whether you're running a small website or a large application, understanding and properly implementing sticky sessions can help provide a better, more reliable experience for your users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember: In the world of web applications, sometimes being "sticky" is exactly what you need!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🖥️ &lt;a href="https://www.gediondaniel.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>performance</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Amazon S3 – Pre-Signed URLs: My Experience Making File Sharing Easier</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Sun, 10 Aug 2025 19:30:19 +0000</pubDate>
      <link>https://dev.to/aws-builders/amazon-s3-pre-signed-urls-my-experience-making-file-sharing-easier-3i4p</link>
      <guid>https://dev.to/aws-builders/amazon-s3-pre-signed-urls-my-experience-making-file-sharing-easier-3i4p</guid>
      <description>&lt;p&gt;When I first started working with Amazon S3, I knew it was a great way to store and manage files in the cloud. But I quickly ran into a challenge: how could I share a file with someone securely without opening up my entire bucket? After some searching, I found out about Pre-Signed URLs, and they've made my life so much easier.&lt;/p&gt;

&lt;p&gt;Here's a bit about what they are, how they work, and how I've used them in my projects. Hopefully, this will help you get started with them too!&lt;/p&gt;

&lt;p&gt;What Are Pre-Signed URLs?&lt;br&gt;
A Pre-Signed URL is a unique, temporary link that gives access to a specific file (or "object") in an S3 bucket. When you create a Pre-Signed URL, you're essentially giving permission to access that file, but only for a set time. This has been incredibly useful in my projects, where I often need to share files or let users upload documents without permanently making everything public.&lt;/p&gt;

&lt;p&gt;In simple terms, think of it like a temporary key that opens the door to a specific file, but the key automatically disappears after a set period.&lt;/p&gt;

&lt;p&gt;How I First Used Pre-Signed URLs&lt;br&gt;
My first experience with Pre-Signed URLs was in a project where users needed to download PDFs. I wanted to ensure these files weren't accessible forever or by just anyone. This is where Pre-Signed URLs saved me a lot of hassle.&lt;/p&gt;

&lt;p&gt;Instead of setting up complicated access controls for every user, I could create a link that worked for only a few hours. This was perfect for securely sharing files without over-complicating permissions.&lt;/p&gt;

&lt;p&gt;How Pre-Signed URLs Work in Practice&lt;br&gt;
Setting up a Pre-Signed URL is simple once you get the hang of it. Here's the process I followed:&lt;/p&gt;

&lt;p&gt;Generate the URL: I specified which file in my S3 bucket I wanted to share. For me, it was often reports or images.&lt;/p&gt;

&lt;p&gt;Set the Expiration: I usually set my URLs to expire after 24 hours, but you can choose any time limit.&lt;/p&gt;

&lt;p&gt;Use the URL in My Application: I could pass the link directly to users, who could click it to access the file. After the time was up, the link no longer worked.&lt;/p&gt;

&lt;p&gt;The best part? I could generate these links programmatically with code, which made it easy to integrate them directly into my app. Here's a basic example in Python, using the boto3 library:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;s3_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bucket_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my-bucket&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;object_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my-file.pdf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;expiration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;  &lt;span class="c1"&gt;# 24 hours
&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s3_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_presigned_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;get_object&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                        &lt;span class="n"&gt;Params&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;Bucket&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bucket_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Key&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;object_name&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                                        &lt;span class="n"&gt;ExpiresIn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;expiration&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;Pre-Signed URL:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this code, I could print out a secure link to a file in my S3 bucket that would last only 24 hours. The person receiving the link could download the file within that time, and I didn't have to worry about ongoing access.&lt;/p&gt;

&lt;p&gt;Real-Life Use Cases I've Worked On&lt;br&gt;
Secure Document Sharing: I worked on a project where users needed to download confidential reports. Using Pre-Signed URLs, I could control access so each report was available only for a limited time. This worked perfectly, as it allowed users to download the report when they needed it without risking it being permanently accessible.&lt;/p&gt;

&lt;p&gt;Photo Uploads in an App: In another project, users uploaded photos directly to an S3 bucket. Instead of giving public access, I generated Pre-Signed URLs for each upload. Users could upload files through the URL without needing AWS credentials, keeping things secure.&lt;/p&gt;

&lt;p&gt;Automatic Expiry for Sensitive Files: In a recent project, I had files that were only relevant for a few hours, like temporary contracts. With Pre-Signed URLs, I could automatically expire access, which meant I didn't have to worry about deleting files or updating permissions manually.&lt;/p&gt;

&lt;p&gt;Why I Recommend Pre-Signed URLs&lt;br&gt;
If you're working with files in S3, Pre-Signed URLs are incredibly useful. They offer several benefits:&lt;/p&gt;

&lt;p&gt;Security without Complexity: You don't have to set up complex user permissions; just generate a URL with a time limit, and the file access is controlled.&lt;/p&gt;

&lt;p&gt;Flexibility: You can set different expiration times based on the use case—anything from a few minutes to several days.&lt;/p&gt;

&lt;p&gt;Access Control: Since the URL expires, you don't have to worry about old links sticking around and causing security issues.&lt;/p&gt;

&lt;p&gt;One thing I found helpful is testing the URLs with different expiration times to see what works best for the project. For longer-lasting files, I might set a 24-hour limit, but for others, 1–2 hours might be enough.&lt;/p&gt;

&lt;p&gt;Tips from My Experience&lt;br&gt;
Set Clear Expiry Times: Start with shorter expiration times until you find the best fit for your users. Too long, and you might have lingering links; too short, and users might find the links expire before they even get to use them.&lt;/p&gt;

&lt;p&gt;Automate Link Generation: If your project allows, automate the Pre-Signed URL generation so that links are created and shared instantly without extra effort.&lt;/p&gt;

&lt;p&gt;Experiment with Permissions: You can set URLs to allow upload or download. I found it helpful to test different permissions in my projects to avoid unexpected access issues.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;br&gt;
Working with Pre-Signed URLs in Amazon S3 has been a game-changer for me. They're simple to create, flexible, and secure, and they've solved the challenge of controlled file sharing in my applications. Whether you need to share files temporarily or allow uploads securely, Pre-Signed URLs are a powerful tool to have in your AWS toolkit.&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🖥️ &lt;a href="https://www.gediondaniel.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>s3</category>
      <category>bucket</category>
      <category>cloud</category>
    </item>
    <item>
      <title>AWS SES with a NestJS Backend to Send Email Verifications</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Sat, 09 Aug 2025 05:56:33 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-ses-with-a-nestjs-backend-to-send-email-verifications-2l9h</link>
      <guid>https://dev.to/aws-builders/aws-ses-with-a-nestjs-backend-to-send-email-verifications-2l9h</guid>
      <description>&lt;p&gt;In my latest project, I needed to set up email verification to make sure users are providing valid email addresses when signing up. To do this, I integrated AWS SES (Simple Email Service) with my NestJS backend to send verification emails with a code that users could use to confirm their email addresses.&lt;/p&gt;

&lt;p&gt;If you're working on something similar or just want to know how it works, let me walk you through the process. I'll keep it simple and personal to make it easy to understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AWS SES?
&lt;/h2&gt;

&lt;p&gt;AWS SES (Simple Email Service) is a cloud-based email service by AWS that lets you send emails easily and at scale. You can use it to send transactional emails, marketing emails, or, in my case, verification emails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use AWS SES for Email Verification?
&lt;/h2&gt;

&lt;p&gt;There are a few reasons I chose AWS SES for this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reliable and high deliverability&lt;/strong&gt; - Fewer emails end up in the spam folder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable&lt;/strong&gt; - Works even if your app grows and needs to send more emails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-effective&lt;/strong&gt; - Pay only for what you use&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up AWS SES
&lt;/h2&gt;

&lt;p&gt;The first step is setting up AWS SES in your AWS account. Here's what I did:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create an AWS Account
&lt;/h3&gt;

&lt;p&gt;If you don't have one yet, sign up at &lt;a href="https://aws.amazon.com" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Verify Your Domain or Email
&lt;/h3&gt;

&lt;p&gt;In the SES console, I verified the domain that my app's emails would come from. Alternatively, you can verify a single email address, but verifying a domain is better for production apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Move Out of SES Sandbox
&lt;/h3&gt;

&lt;p&gt;By default, AWS SES puts new accounts in a sandbox, which limits the number of emails you can send. I requested production access to remove these limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Obtain AWS Credentials
&lt;/h3&gt;

&lt;p&gt;To use AWS SES in my NestJS backend, I needed my &lt;strong&gt;Access Key&lt;/strong&gt; and &lt;strong&gt;Secret Key&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing AWS SDK in NestJS
&lt;/h2&gt;

&lt;p&gt;Once AWS SES was ready, the next step was integrating it into my NestJS backend. First, I installed the AWS SDK for JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @aws-sdk/client-ses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This package allows my NestJS application to interact with AWS SES to send emails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing the NestJS Service to Send Emails
&lt;/h2&gt;

&lt;p&gt;Next, I wrote a service in my NestJS app to handle the sending of verification emails. Here's a simple version of the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Injectable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SESClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SendEmailCommand&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@aws-sdk/client-ses&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;sesClient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SESClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sesClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SESClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-region&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;sendVerificationEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-verified-email@yourdomain.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;ToAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Your verification code is: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email Verification&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SendEmailCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sesClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How It Works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I initialized the &lt;code&gt;SESClient&lt;/code&gt; with my AWS region&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;sendVerificationEmail&lt;/code&gt; method takes the recipient's email and a verification code as inputs&lt;/li&gt;
&lt;li&gt;The email contains a subject line ("Email Verification") and a message body with the verification code&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;SendEmailCommand&lt;/code&gt; sends the email via AWS SES&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Calling the Service from the Controller
&lt;/h2&gt;

&lt;p&gt;Next, I created a controller that handles requests from the frontend. When a user registers or requests a verification email, this controller sends the email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Body&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;EmailService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./email.service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EmailService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;send-email-verification&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;sendVerificationEmail&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;verificationCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateVerificationCode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendVerificationEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verificationCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Verification email sent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;generateVerificationCode&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;900000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 6-digit code&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How It Works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;AuthController&lt;/code&gt; listens for a POST request at the &lt;code&gt;/auth/send-email-verification&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;It calls the &lt;code&gt;EmailService&lt;/code&gt; to send the verification email to the user's email address with a 6-digit verification code&lt;/li&gt;
&lt;li&gt;The verification code is randomly generated as a 6-digit number&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing the Integration
&lt;/h2&gt;

&lt;p&gt;After setting everything up, I tested the functionality. I used Postman to make a request to the &lt;code&gt;/auth/send-email-verification&lt;/code&gt; endpoint with a test email. Sure enough, the email showed up in my inbox with the verification code.&lt;/p&gt;

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

&lt;p&gt;Setting up email verification with AWS SES and NestJS is straightforward once you understand the pieces involved. The combination provides a reliable, scalable solution for email verification that can grow with your application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS SES provides reliable email delivery at scale&lt;/li&gt;
&lt;li&gt;The AWS SDK makes integration with NestJS simple&lt;/li&gt;
&lt;li&gt;Always verify your domain for production use&lt;/li&gt;
&lt;li&gt;Remember to request production access to move out of the SES sandbox&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to adapt this setup to your specific needs, such as using HTML templates for prettier emails or storing verification codes in a database for validation.&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
🖥️ &lt;a href="https://www.gediondaniel.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backenddevelopment</category>
      <category>nextjs</category>
      <category>ses</category>
      <category>aws</category>
    </item>
    <item>
      <title>How the Pool Pattern Works in Multi-tenant RAG</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Fri, 08 Aug 2025 07:38:58 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-the-pool-pattern-works-in-multi-tenant-rag-g23</link>
      <guid>https://dev.to/aws-builders/how-the-pool-pattern-works-in-multi-tenant-rag-g23</guid>
      <description>&lt;p&gt;The pool pattern is a shared infrastructure approach where all tenants use the same Amazon Bedrock Knowledge Base, S3 bucket, and vector database. Here's how it works based on the implementation:&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Concept
&lt;/h2&gt;

&lt;p&gt;Instead of creating separate resources for each tenant, everyone shares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One S3 bucket&lt;/strong&gt; for all documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Knowledge Base&lt;/strong&gt; for processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One vector database&lt;/strong&gt; (Pinecone, or AWS OpenSearch as an alternative) for storing embeddings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata filtering&lt;/strong&gt; to keep data separated&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Document Upload with Tenant Metadata
&lt;/h3&gt;

&lt;p&gt;When a user uploads a document, the system creates two files in S3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Original document&lt;/span&gt;
&lt;span class="nx"&gt;s3Key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/agents/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/documents/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;documentId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

&lt;span class="c1"&gt;// Metadata file (CRITICAL for tenant isolation)&lt;/span&gt;
&lt;span class="nx"&gt;metadataKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s3Key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.metadata.json`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The metadata file contains:&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;"metadataAttributes"&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;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"john_doe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"agentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agent456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"report.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"uploadDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-15T10:30:00Z"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This metadata is what enables tenant isolation in the shared system.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Shared Knowledge Base Processing
&lt;/h3&gt;

&lt;p&gt;All documents go through the same Knowledge Base:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Single shared Knowledge Base for all tenants&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bedrockClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StartIngestionJobCommand&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;knowledgeBaseId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configService&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SHARED_KNOWLEDGE_BASE_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;dataSourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configService&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SHARED_DATA_SOURCE_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Knowledge Base:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chunks all documents the same way&lt;/li&gt;
&lt;li&gt;Uses the same embedding model&lt;/li&gt;
&lt;li&gt;Stores vectors with the metadata in Pinecone&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Querying with Tenant Isolation
&lt;/h3&gt;

&lt;p&gt;When a user asks a question, the system filters results by their tenant ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;andAll&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;userId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Only this user's documents&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;agentId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Only this specific agent's documents&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures User A never sees User B's documents, even though they're in the same database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visual Flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User uploads document&lt;/strong&gt; → Creates S3 object + metadata.json&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Base ingests&lt;/strong&gt; → Processes both files together&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vectors stored in Pinecone&lt;/strong&gt; → With userId and agentId metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User queries&lt;/strong&gt; → Filter applied → Only their documents returned&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key Implementation Details
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Agent Creation
&lt;/h3&gt;

&lt;p&gt;Each user can have multiple agents (like different assistants):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agentModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;knowledgeBaseId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configService&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SHARED_KNOWLEDGE_BASE_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;dataSourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configService&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SHARED_DATA_SOURCE_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multi-Model Support
&lt;/h3&gt;

&lt;p&gt;Users can choose different AI models while sharing the same knowledge base:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// User can select Claude, Mistral, Titan, etc.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;selectedModelKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;modelKey&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelKey&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude3Sonnet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  User Registration
&lt;/h3&gt;

&lt;p&gt;New users automatically get access to the shared infrastructure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;cognitoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;UserSub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// Pool pattern benefits - instant access to shared resources&lt;/span&gt;
  &lt;span class="na"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;starter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxAgents&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="na"&gt;maxDocuments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxMessagesPerMonth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cost Efficient&lt;/strong&gt;: One Knowledge Base serves hundreds of tenants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple Onboarding&lt;/strong&gt;: New user? Just start uploading - no setup needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible&lt;/strong&gt;: Each tenant can use different AI models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure&lt;/strong&gt;: Metadata filtering ensures complete data isolation&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Critical Success Factor
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;.metadata.json&lt;/code&gt; file is crucial. Without it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documents won't be filterable by tenant&lt;/li&gt;
&lt;li&gt;Data isolation breaks&lt;/li&gt;
&lt;li&gt;The entire multi-tenant system fails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always ensure every document has its corresponding metadata file with the correct &lt;code&gt;userId&lt;/code&gt; and &lt;code&gt;agentId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
🖥️ &lt;a href="https://www.gediondaniel.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
📝 &lt;a href="https://blog.gediondaniel.dev/" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rag</category>
      <category>aws</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>🔥Invoke Amazon Bedrock Models Using Python: Full Code Walkthrough with Mistral AI</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Sat, 07 Jun 2025 19:14:48 +0000</pubDate>
      <link>https://dev.to/aws-builders/invoke-amazon-bedrock-models-using-python-full-code-walkthrough-with-mistral-ai-5ee5</link>
      <guid>https://dev.to/aws-builders/invoke-amazon-bedrock-models-using-python-full-code-walkthrough-with-mistral-ai-5ee5</guid>
      <description>&lt;p&gt;Amazon Bedrock is a powerful AWS service that lets you build and scale generative AI applications using foundation models from top providers such as Mistral AI, Anthropic, Meta, Cohere, Amazon Titan, and others all without managing infrastructure.&lt;/p&gt;

&lt;p&gt;In this blog, we'll walk through &lt;strong&gt;how to invoke a foundation model on Amazon Bedrock using Python&lt;/strong&gt;, with &lt;strong&gt;Mistral AI&lt;/strong&gt; as our example. You’ll see the full code, key setup steps, and how to avoid common errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚧 Step 1: Enable Model Access in Amazon Bedrock
&lt;/h2&gt;

&lt;p&gt;Before using any models on Bedrock, &lt;strong&gt;you must explicitly request access&lt;/strong&gt; for each one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Here's how:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;Amazon Bedrock Console&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;From the sidebar, click &lt;strong&gt;"Model access"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose the providers you want access to (e.g., Mistral, Anthropic, Meta).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Request model access"&lt;/strong&gt; for each.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;h2&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%2Fkqh5ts2qqigb05p7hxc9.png" alt="Model Access screen showing pending/requested models" width="800" height="398"&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🌍 Step 2: Set Your Region
&lt;/h2&gt;

&lt;p&gt;Amazon Bedrock model availability depends on the AWS region.&lt;br&gt;
To access all models and the latest features, it's recommended to use the us-west-2 region (Oregon), where most models including Mistral, Meta, Claude, and others are available.&lt;/p&gt;

&lt;p&gt;However, for this time, I’m using the eu-north-1 region (Stockholm), which currently supports a limited set of models that suit my needs.&lt;br&gt;
If you're trying to use a specific model and it's not available in your current region, try switching to us-west-2, eu-north-1, or even eu-central-1 depending on availability.&lt;/p&gt;

&lt;p&gt;Update your AWS configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or set environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-access-key-id
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-secret-access-key
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eu-north-1 &lt;span class="c"&gt;# Change this to your desired region&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🐍 Step 3: Install Dependencies
&lt;/h2&gt;

&lt;p&gt;Make sure Python is installed (≥ 3.7), and install &lt;code&gt;boto3&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔑 Step 4: Get the API Request Format for Any Model
&lt;/h2&gt;

&lt;p&gt;To find the exact &lt;code&gt;kwargs&lt;/code&gt; payload structure for invoking a model via API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;Amazon Bedrock Console&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;"providers"&lt;/strong&gt; from the sidebar.&lt;/li&gt;
&lt;li&gt;Select a model (e.g., Mistral, Claude, Titan).&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;"API Requests"&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;You’ll see ready-to-use API request samples.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&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%2Fakzqh858do8rb61sw1e1.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%2Fakzqh858do8rb61sw1e1.png" alt="Showing the API request code sample section." width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can &lt;strong&gt;copy and adapt this request&lt;/strong&gt; for any model.&lt;br&gt;
For example, if you're switching from Mistral to Claude or LLaMA, just update the &lt;code&gt;modelId&lt;/code&gt; and keep the rest of the format similar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In my example, I removed the &lt;code&gt;type=image&lt;/code&gt; content block I’m only using &lt;code&gt;"type": "text"&lt;/code&gt; in my prompt.&lt;br&gt;
If you want to &lt;strong&gt;include images&lt;/strong&gt;, just keep the image type block and provide a valid URL or upload method.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  💻 Step 5: Write Python Code to Invoke a Bedrock Model
&lt;/h2&gt;

&lt;p&gt;We’ll now write a Python script that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connects to Bedrock via &lt;code&gt;boto3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sends a prompt to a model&lt;/li&gt;
&lt;li&gt;Prints the response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create a file called &lt;code&gt;invoke_bedrock.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="c1"&gt;# Initialize the Bedrock runtime client for the correct region
&lt;/span&gt;&lt;span class="n"&gt;bedrock_runtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock-runtime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eu-north-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Your question to the model
&lt;/span&gt;&lt;span class="n"&gt;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;What is the capital city of Italy?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;kwargs&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;modelId&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;eu.mistral.pixtral-large-2502-v1:0&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;contentType&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;application/json&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;accept&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;application/json&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;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Call Bedrock
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bedrock_runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Parse the response
&lt;/span&gt;&lt;span class="n"&gt;response_body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;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;response_body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Print the assistant's reply
&lt;/span&gt;&lt;span class="n"&gt;assistant_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="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;Model response:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assistant_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;h2&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%2F34hcivrhhenue7ficjzw.png" alt="Python code editor with script open." width="800" height="521"&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ▶️ Step 6: Run the Script
&lt;/h2&gt;

&lt;p&gt;In your terminal or command prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python invoke_bedrock.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model response:
The capital city of Italy is Rome (in Italian, "Roma"). Rome is ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;h2&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%2Fcg5brslptrz56vcyqym6.png" alt="Terminal output with model reply." width="800" height="532"&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ⚠️ Common Errors and Fixes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NoCredentialsError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;aws configure&lt;/code&gt; or set environment variables.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ValidationException&lt;/code&gt; or "inference profile required"&lt;/td&gt;
&lt;td&gt;Use the &lt;strong&gt;correct model ID&lt;/strong&gt; for your region. For general use, prefer &lt;code&gt;us-west-2&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;modelId not found&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use a model ID valid for your region (e.g., &lt;code&gt;mistral.mixtral-8x7b-instruct-v0:1&lt;/code&gt; in &lt;code&gt;us-west-2&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ✅ Summary
&lt;/h2&gt;

&lt;p&gt;You’ve now successfully:&lt;/p&gt;

&lt;p&gt;✅ Set up AWS credentials&lt;br&gt;
✅ Requested model access&lt;br&gt;
✅ Written a Python script to invoke Mistral via Bedrock&lt;br&gt;
✅ Printed a model response&lt;/p&gt;

&lt;p&gt;This foundation lets you build anything from chatbots to smart assistants powered by Amazon Bedrock.&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
🖥️ &lt;a href="https://www.gediondaniel.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
📝 &lt;a href="https://blog.gediondaniel.dev/" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 How to Install and Use Amazon Q for Developers in Your IDE</title>
      <dc:creator>Gedion Daniel</dc:creator>
      <pubDate>Sat, 03 May 2025 00:06:29 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-to-install-and-use-amazon-q-for-developers-in-your-ide-4e3h</link>
      <guid>https://dev.to/aws-builders/how-to-install-and-use-amazon-q-for-developers-in-your-ide-4e3h</guid>
      <description>&lt;p&gt;Amazon Q is Amazon Web Services’ AI-powered assistant designed to help developers code smarter and faster—directly inside their favorite IDEs. Whether you're writing Java in Eclipse, crafting Python in PyCharm, or debugging in Visual Studio Code, Amazon Q offers context-aware suggestions, natural language queries, and seamless integration with AWS services.&lt;/p&gt;

&lt;p&gt;If you're ready to give Amazon Q a spin, this guide will walk you through setting it up in your IDE and getting started in just a few minutes.&lt;/p&gt;

&lt;p&gt;💡 What is Amazon Q Developer?&lt;br&gt;
Amazon Q Developer is like having an AI coding buddy built right into your workspace. It can:&lt;/p&gt;

&lt;p&gt;Answer programming questions in natural language.&lt;/p&gt;

&lt;p&gt;Generate code snippets based on your prompts.&lt;/p&gt;

&lt;p&gt;Help you navigate and understand unfamiliar code.&lt;/p&gt;

&lt;p&gt;Integrate with your AWS resources to help manage cloud applications.&lt;/p&gt;

&lt;p&gt;And the best part? You can use Amazon Q for free without an AWS account—just authenticate with a free AWS Builder ID.&lt;/p&gt;

&lt;p&gt;🛠️ Step 1: Check Supported IDEs&lt;br&gt;
Amazon Q currently supports these IDEs:&lt;/p&gt;

&lt;p&gt;IDE&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Eclipse
&lt;/li&gt;
&lt;li&gt; JetBrains (IntelliJ, PyCharm, etc.)
&lt;/li&gt;
&lt;li&gt; Visual Studio Code
&lt;/li&gt;
&lt;li&gt; Visual Studio (Windows only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure your IDE is up to date before proceeding.&lt;/p&gt;

&lt;p&gt;📥 Step 2: Download the Amazon Q Plugin&lt;br&gt;
Choose the version that matches your development environment:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://marketplace.eclipse.org/content/amazon-q" rel="noopener noreferrer"&gt;Amazon Q for Eclipse (Preview)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.amazon-q-vscode" rel="noopener noreferrer"&gt;Amazon Q for Visual Studio Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/24267-amazon-q/" rel="noopener noreferrer"&gt;Amazon Q for JetBrains IDEs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.AWSToolkitforVisualStudio2022" rel="noopener noreferrer"&gt;Amazon Q via AWS Toolkit for Visual Studio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install the plugin just as you would with any other IDE extension.&lt;/p&gt;

&lt;p&gt;🔐 Step 3: Authenticate with AWS Builder ID (or IAM Identity Center)&lt;br&gt;
After installing the plugin, you’ll need to sign in. You have two options:&lt;/p&gt;

&lt;p&gt;Builder ID – Free and easy. No AWS account needed.&lt;/p&gt;

&lt;p&gt;IAM Identity Center – For enterprise users or those with Amazon Q Developer Pro subscriptions.&lt;/p&gt;

&lt;p&gt;🧑‍💻 Using Builder ID (Recommended for Individual Devs)&lt;br&gt;
Launch your IDE and find the Amazon Q icon (usually on the toolbar or sidebar).&lt;/p&gt;

&lt;p&gt;Click the icon and select “Use for free”.&lt;/p&gt;

&lt;p&gt;A browser window will open, guiding you through Builder ID authentication.&lt;/p&gt;

&lt;p&gt;Once authenticated, go back to your IDE—you're all set!&lt;/p&gt;

&lt;p&gt;🧪 IDE-Specific Instructions&lt;br&gt;
✅ Eclipse (Preview)&lt;br&gt;
Click the Amazon Q icon (top right).&lt;/p&gt;

&lt;p&gt;Authenticate using Builder ID via browser.&lt;/p&gt;

&lt;p&gt;Return to Eclipse and start chatting with Amazon Q from the panel at the bottom.&lt;/p&gt;

&lt;p&gt;✅ JetBrains IDEs (IntelliJ, PyCharm, etc.)&lt;br&gt;
Open the side toolbar and click the Amazon Q icon.&lt;/p&gt;

&lt;p&gt;Authenticate in the browser.&lt;/p&gt;

&lt;p&gt;Open the chat panel or navigate via the bottom bar to interact with Q.&lt;/p&gt;

&lt;p&gt;✅ Visual Studio Code&lt;br&gt;
Click the Amazon Q icon in the sidebar.&lt;/p&gt;

&lt;p&gt;Authenticate in your browser.&lt;/p&gt;

&lt;p&gt;Use the side panel to begin chatting with Amazon Q.&lt;/p&gt;

&lt;p&gt;✅ Visual Studio (Windows)&lt;br&gt;
Go to Extensions &amp;gt; AWS Toolkit &amp;gt; Getting Started.&lt;/p&gt;

&lt;p&gt;In the Amazon Q section, choose Enable.&lt;/p&gt;

&lt;p&gt;Sign in using your Builder ID through the browser.&lt;/p&gt;

&lt;p&gt;After successful auth, return to Visual Studio to use Q.&lt;/p&gt;

&lt;p&gt;⚠️ A Note on IAM Roles&lt;br&gt;
If you typically use IAM roles or IAM credentials to access AWS services, note that Amazon Q in IDEs does not support IAM-based sign-in. You'll need to use either IAM Identity Center or Builder ID credentials.&lt;/p&gt;

&lt;p&gt;⏳ Session Duration Info&lt;br&gt;
Sessions authenticated with IAM Identity Center typically last 8 hours. However, Amazon Q extends this duration up to 90 days (for users set up on or after April 18, 2024). That means fewer interruptions for re-authentication while you’re in the zone!&lt;/p&gt;

&lt;p&gt;🚀 Final Thoughts&lt;br&gt;
Amazon Q Developer is a powerful tool for improving productivity and deepening your understanding of your own code. Setup is quick, the free tier is generous, and it integrates smoothly with your workflow.&lt;/p&gt;

&lt;p&gt;👨‍💻 Connect with me:&lt;br&gt;
🖥️ &lt;a href="https://www.gediondaniel.dev/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;br&gt;
📌 &lt;a href="https://www.linkedin.com/in/gedion-daniel-760ba6280/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📂 &lt;a href="https://github.com/Gediontkd" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
📝 &lt;a href="https://blog.gediondaniel.dev/" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>cloud</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
