<?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: Amr Abed</title>
    <description>The latest articles on DEV Community by Amr Abed (@amrabed).</description>
    <link>https://dev.to/amrabed</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F255832%2F370c895e-a2ce-4332-891b-502808af64e4.png</url>
      <title>DEV Community: Amr Abed</title>
      <link>https://dev.to/amrabed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amrabed"/>
    <language>en</language>
    <item>
      <title>Stop Writing Lambda Boilerplate</title>
      <dc:creator>Amr Abed</dc:creator>
      <pubDate>Thu, 01 Oct 2026 02:30:28 +0000</pubDate>
      <link>https://dev.to/amrabed/stop-writing-lambda-boilerplate-42b0</link>
      <guid>https://dev.to/amrabed/stop-writing-lambda-boilerplate-42b0</guid>
      <description>&lt;p&gt;Introducing the &lt;a href="https://github.com/cur8d/lambda" rel="noopener noreferrer"&gt;&lt;strong&gt;cur8d/lambda&lt;/strong&gt;&lt;/a&gt; open-source repository — a collection of production-ready Python Lambda templates for Bedrock Agent, REST API, GraphQL, DynamoDB Stream, EventBridge, S3, and SQS scenarios. These templates come pre-integrated with &lt;strong&gt;AWS Lambda Powertools&lt;/strong&gt;, &lt;strong&gt;AWS CDK&lt;/strong&gt;, &lt;strong&gt;Pydantic&lt;/strong&gt;, and a robust testing infrastructure.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk37l33r673fu02kgtbsz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk37l33r673fu02kgtbsz.png" alt="cover.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every serverless developer knows the feeling. You spin up a new Lambda project, and before writing a single line of business logic, you're already copying boilerplate from a previous project: setting up AWS Lambda Powertools, wiring up structured logging, configuring X-Ray tracing, and building yet another Repository class for DynamoDB access.&lt;/p&gt;

&lt;p&gt;This repetitive setup isn't just tedious — it's a source of inconsistency across projects and a hidden risk. Teams often skip best practices under time pressure, and the "quick Lambda" becomes the undocumented, untested function that nobody dares touch six months later.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;a href="https://github.com/cur8d/lambda" rel="noopener noreferrer"&gt;&lt;strong&gt;cur8d/lambda&lt;/strong&gt;&lt;/a&gt; — a collection of production-ready, plug-and-play Python Lambda templates for some of the common real-world scenarios on AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Lambda Bootstrapping
&lt;/h2&gt;

&lt;p&gt;AWS Lambda's promise is simplicity: deploy a function, it scales. But production Lambda functions require significantly more than a handler file. You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured logging&lt;/strong&gt; that integrates with CloudWatch Insights&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed tracing&lt;/strong&gt; with AWS X-Ray&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metrics&lt;/strong&gt; for operational visibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch processing&lt;/strong&gt; for event sources like SQS and DynamoDB Streams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong typing&lt;/strong&gt; to catch bugs at development time, not runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code,&lt;/strong&gt; so your function is reproducible and auditable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive tests&lt;/strong&gt; with AWS service mocking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most developers piece this together manually each time — or worse, they copy a "good enough" version from a previous project and gradually accumulate inconsistencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing cur8d/lambda
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/cur8d/lambda" rel="noopener noreferrer"&gt;cur8d/lambda&lt;/a&gt; is a GitHub template repository that gives you a complete, opinionated, production-grade starting point for Python Lambda development. It currently covers seven real-world scenarios out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bedrock Agent&lt;/strong&gt; — Handle function-based actions from Amazon Bedrock Agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GraphQL API&lt;/strong&gt; — Resolve AppSync GraphQL requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REST API&lt;/strong&gt; — Handle API Gateway REST requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DynamoDB Stream&lt;/strong&gt; — Batch-process stream events with failure handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EventBridge&lt;/strong&gt; — React to events and call external APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S3 to SQS&lt;/strong&gt; — Queue messages on S3 object changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQS to DynamoDB&lt;/strong&gt; — Batch-process SQS messages into DynamoDB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each template is a fully self-contained starting point. Pick your scenario, rename the project, and start writing business logic immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Pre-Wired for You
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS Lambda Powertools
&lt;/h3&gt;

&lt;p&gt;Every template integrates &lt;a href="https://docs.aws.amazon.com/powertools/python" rel="noopener noreferrer"&gt;AWS Lambda Powertools for Python&lt;/a&gt; — AWS's first-party library for Lambda best practices. This gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured JSON logging&lt;/strong&gt; with correlation IDs automatically injected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CloudWatch EMF Metrics&lt;/strong&gt; for operational dashboards without custom code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS X-Ray Tracing&lt;/strong&gt; with automatic subsegment creation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch processing&lt;/strong&gt; utilities for SQS and DynamoDB Streams, including partial failure handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameter and Secrets loading&lt;/strong&gt; with caching built in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event source data classes&lt;/strong&gt; for type-safe event parsing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't configure any of this — it's already there. More on that later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pydantic Data Modeling
&lt;/h3&gt;

&lt;p&gt;All input/output models are defined using &lt;a href="https://docs.pydantic.dev/" rel="noopener noreferrer"&gt;Pydantic&lt;/a&gt;, giving you automatic validation, serialization, and type safety.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic.alias_generators&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;to_camel&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alias_generator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;to_camel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;populate_by_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unique item identifier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Human-readable item name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;alias_generator=to_camel&lt;/code&gt; configuration means the JSON payload from API Gateway uses &lt;code&gt;camelCase&lt;/code&gt; while the Python code uses &lt;code&gt;snake_case&lt;/code&gt; — matching JSON conventions on the wire and Python conventions in code, with zero manual mapping.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure as Code with AWS CDK
&lt;/h3&gt;

&lt;p&gt;Every template ships with a matching &lt;a href="https://aws.amazon.com/cdk" rel="noopener noreferrer"&gt;AWS CDK&lt;/a&gt; stack under &lt;code&gt;infra/stacks/&lt;/code&gt;. Deploy any stack with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make deploy &lt;span class="nv"&gt;STACK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No manual console clicks. No documentation to update. The infrastructure is the code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clean Architecture with the Repository Pattern
&lt;/h3&gt;

&lt;p&gt;All database access is encapsulated in a &lt;code&gt;Repository&lt;/code&gt; class, separating your business logic from AWS service calls. This makes testing trivial and keeps your handler functions focused on what matters: the business logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing That Actually Tests Things
&lt;/h3&gt;

&lt;p&gt;The test suite uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pytest.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;pytest&lt;/strong&gt;&lt;/a&gt; for test orchestration&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://docs.getmoto.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;moto&lt;/strong&gt;&lt;/a&gt; for AWS service mocking (DynamoDB, SQS, S3 — all mocked locally)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hypothesis.readthedocs.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;&lt;/a&gt; for property-based testing, automatically generating edge-case inputs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://coverage.readthedocs.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;coverage&lt;/strong&gt;&lt;/a&gt; for coverage reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run the entire suite with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Code Quality, Automated
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.astral.sh/ruff" rel="noopener noreferrer"&gt;&lt;strong&gt;ruff&lt;/strong&gt;&lt;/a&gt; for linting and formatting (replacing Flake8, isort, Black)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://microsoft.github.io/pyright" rel="noopener noreferrer"&gt;&lt;strong&gt;pyright&lt;/strong&gt;&lt;/a&gt; for static type checking&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pre-commit.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;pre-commit&lt;/strong&gt;&lt;/a&gt; hooks to enforce quality before every commit&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.github.com/en/code-security/dependabot" rel="noopener noreferrer"&gt;&lt;strong&gt;Dependabot&lt;/strong&gt;&lt;/a&gt; for automated dependency updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Developer Experience
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/devcontainers/containers" rel="noopener noreferrer"&gt;&lt;strong&gt;Dev Containers&lt;/strong&gt;&lt;/a&gt; support means you can open the repo in VS Code and have the entire development environment running in Docker — Python, Poetry, CDK, and all tools pre-installed—no setup required.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mkdocs.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;MkDocs&lt;/strong&gt;&lt;/a&gt; for auto-generated API documentation published to GitHub Pages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;&lt;/a&gt; workflows for CI/CD and documentation deployment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI Agent guidelines&lt;/strong&gt; (&lt;code&gt;AGENTS.md&lt;/code&gt;) providing context for AI coding assistants working in the repo&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AWS Lambda Powertools — In Practice
&lt;/h2&gt;

&lt;p&gt;Every template integrates&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/powertools/python" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS Lambda Powertools for Python&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;as a first-class citizen — not as an afterthought bolted on after the fact. Here's how it actually shapes each template.&lt;/p&gt;

&lt;h3&gt;
  
  
  Batch Processing with Partial Failure Handling
&lt;/h3&gt;

&lt;p&gt;This is where Powertools saves the most code — and prevents the most production incidents.&lt;/p&gt;

&lt;p&gt;Without Powertools, batch processing from SQS or streams requires you to manually track which records succeeded and which failed, then construct a &lt;code&gt;batchItemFailures&lt;/code&gt; response telling Lambda which messages to retry. Get it wrong and you either re-process successfully handled messages (causing duplicates) or silently drop failed ones.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;SQS&lt;/strong&gt; template uses &lt;code&gt;BatchProcessor&lt;/code&gt; to handle this automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.batch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;BatchProcessor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;EventType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;process_partial_response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.batch.types&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PartialItemFailureResponse&lt;/span&gt;

&lt;span class="n"&gt;processor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BatchProcessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;EventType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SQS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to process record&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt;  &lt;span class="c1"&gt;# Re-raise so BatchProcessor marks it as a failed item
&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PartialItemFailureResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;process_partial_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;record_handler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;handle_record&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;context&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;If &lt;code&gt;handle_record&lt;/code&gt; raises for one message, &lt;code&gt;BatchProcessor&lt;/code&gt; catches it, logs the failure, continues processing the rest of the batch, and returns the correct &lt;code&gt;batchItemFailures&lt;/code&gt; response. Your DLQ only receives the genuinely failed messages — not the whole batch.&lt;/p&gt;

&lt;p&gt;The same pattern applies to &lt;strong&gt;DynamoDB Streams&lt;/strong&gt;, where handling partial failures is equally critical to prevent stream stalls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.batch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;BatchProcessor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;EventType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;process_partial_response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;processor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BatchProcessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;EventType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DynamoDBStreams&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to process record&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt;  &lt;span class="c1"&gt;# Re-raise so BatchProcessor marks it as a failed item
&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;process_partial_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;record_handler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;handle_record&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;context&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;
  
  
  Event Parsing and Handling
&lt;/h3&gt;

&lt;p&gt;Lambda Powertools really shines here. Whether it’s handling a Bedrock Agent tool use, REST API request, or a GraphQL query, Powertools provides resolvers that eliminate custom event parsing.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Bedrock Agent&lt;/strong&gt; template uses the &lt;code&gt;BedrockAgentFunctionResolver&lt;/code&gt; and the &lt;code&gt;@app.tool&lt;/code&gt; decorator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.event_handler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentFunctionResolver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.data_classes&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentEvent&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BedrockAgentFunctionResolver&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="nd"&gt;@app.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;getItem&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gets item details by ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;


&lt;span class="nd"&gt;@app.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;createItem&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Creates a new item with name and optional description&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;str | None = None) -&amp;gt; dict: ...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LambdaContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Lambda entry point for the Bedrock Agent handler&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;REST API&lt;/strong&gt; template uses the &lt;code&gt;APIGatewayRestResolver&lt;/code&gt; and Flask-like decorators — meaning if you've used Flask or FastAPI, you'll feel right at home:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.event_handler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIGatewayRestResolver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.event_handler.api_gateway&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIGatewayRestResolver&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/&amp;lt;id&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="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;Retrieve an item by ID&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content_type&lt;/span&gt;&lt;span class="o"&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="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;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;Create a new item from the request body&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json_body&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content_type&lt;/span&gt;&lt;span class="o"&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="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LambdaContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Lambda entry point for the API Gateway handler&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;EventBridge&lt;/strong&gt; template uses the &lt;code&gt;event_parser&lt;/code&gt; to ensure your events match your Pydantic models before your logic even runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.parser&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;event_parser&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.parser.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;EventBridgeModel&lt;/span&gt;


&lt;span class="nd"&gt;@event_parser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;EventBridgeModel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EventBridgeModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Combining Powertools with Pydantic
&lt;/h3&gt;

&lt;p&gt;One of the most useful patterns across the templates is combining Powertools event data classes with Pydantic models for end-to-end type safety.&lt;/p&gt;

&lt;p&gt;Powertools parses the raw Lambda event into a typed object (so you're not indexing into raw dicts). Pydantic then validates and deserializes the&amp;nbsp;&lt;em&gt;business payload&lt;/em&gt;&amp;nbsp;within that event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.event_handler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIGatewayRestResolver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIGatewayRestResolver&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Powertools resolves the typed API Gateway envelope
&lt;/span&gt;    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json_body&lt;/span&gt;
    &lt;span class="c1"&gt;# Pydantic validates the business payload
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;content_type&lt;/span&gt;&lt;span class="o"&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="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content_type&lt;/span&gt;&lt;span class="o"&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="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&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;In the &lt;strong&gt;Bedrock Agent&lt;/strong&gt; template, the same pattern applies via &lt;code&gt;BedrockAgentFunctionResolver&lt;/code&gt; — Powertools resolves the agent event, and typed function signatures replace manual parameter extraction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# templates/agent/handler.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.event_handler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentFunctionResolver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.data_classes&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentEvent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LambdaContext&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;templates.agent.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;

&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Repository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BedrockAgentFunctionResolver&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="nd"&gt;@app.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;getItem&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gets item details by ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Item &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;


&lt;span class="nd"&gt;@app.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;createItem&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Creates a new item with name and optional description&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;str | None = None) -&amp;gt; dict:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_dump&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;by_alias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exclude_none&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BedrockAgentEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LambdaContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Lambda entry point for the Bedrock Agent handler&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fetching Parameters and Secrets
&lt;/h3&gt;

&lt;p&gt;In the &lt;strong&gt;EventBridge&lt;/strong&gt; template, the handler calls an external API using an API token stored in the &lt;strong&gt;Secrets Manager&lt;/strong&gt;. With Lambda Powertools, that adds exactly three lines of code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.parameters&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SecretsProvider&lt;/span&gt;

&lt;span class="n"&gt;secret_provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SecretsProvider&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secret_provider&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="n"&gt;secret_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same goes for loading configuration from the &lt;strong&gt;Parameter Store&lt;/strong&gt; (&lt;code&gt;SSMProvider&lt;/code&gt;), &lt;strong&gt;AppConfig&lt;/strong&gt; (&lt;code&gt;AppConfigProvider&lt;/code&gt;), or a &lt;strong&gt;DynamoDB&lt;/strong&gt; table (&lt;code&gt;DynamoDBProvider&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;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.utilities.parameters&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SSMProvider&lt;/span&gt;

&lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SSMProvider&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;provider&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="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Structured Logging That Travels With Your Request
&lt;/h3&gt;

&lt;p&gt;The logger is initialized once at module level and injected into every handler via the&amp;nbsp;&lt;code&gt;@logger.inject_lambda_context&lt;/code&gt;&amp;nbsp;decorator. This automatically appends the Lambda context (function name, version, cold start flag, and AWS request ID) to every log line — without you writing a single line of configuration code.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@logger.inject_lambda_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;APIGatewayProxyEventV2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LambdaContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http_method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output in CloudWatch is structured JSON from the first line:&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;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INFO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Processing request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"function_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-api-handler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cold_start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aws_request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc-123"&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;&lt;strong&gt;This matters at scale&lt;/strong&gt;: CloudWatch Logs Insights can now query your logs by any of these fields. Finding all cold starts, or all errors on a specific path, becomes a one-line query instead of a regex hunt through raw strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tracing Without Instrumentation Noise
&lt;/h3&gt;

&lt;p&gt;X-Ray tracing is applied via two decorators that require no additional configuration:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;tracer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Tracer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;# On methods — creates child subsegments in X-Ray
&lt;/span&gt;&lt;span class="nd"&gt;@tracer.capture_method&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SQSRecord&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="c1"&gt;# On the Lambda handler — creates the root X-Ray segment
&lt;/span&gt;&lt;span class="nd"&gt;@tracer.capture_lambda_handler&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LambdaContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The&amp;nbsp;&lt;code&gt;@tracer.capture_lambda_handler&lt;/code&gt;&amp;nbsp;decorator creates the root X-Ray segment, and&amp;nbsp;&lt;code&gt;@tracer.capture_method&lt;/code&gt;&amp;nbsp;on Repository methods creates child subsegments — so your X-Ray service map shows handler → repository → DynamoDB as distinct, timed segments. You can see exactly where latency lives without writing a single&amp;nbsp;&lt;code&gt;xray_recorder.begin_subsegment()&lt;/code&gt;&amp;nbsp;call.&lt;/p&gt;

&lt;h3&gt;
  
  
  CloudWatch Metrics Without Custom Namespaces
&lt;/h3&gt;

&lt;p&gt;Most Lambda functions either skip custom metrics entirely — relying on the default Lambda service metrics — or end up with a tangled mix of&amp;nbsp;&lt;code&gt;boto3&lt;/code&gt;&amp;nbsp;CloudWatch&amp;nbsp;&lt;code&gt;put_metric_data&lt;/code&gt;&amp;nbsp;calls scattered across the codebase. Neither approach is great in production.Powertools solves this with the&amp;nbsp;&lt;code&gt;Metrics&lt;/code&gt;&amp;nbsp;utility, which uses&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html" rel="noopener noreferrer"&gt;&lt;strong&gt;CloudWatch Embedded Metric Format (EMF)&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;to emit custom metrics as structured log lines. No&amp;nbsp;&lt;code&gt;boto3&lt;/code&gt;&amp;nbsp;calls, no extra latency, no IAM permissions beyond what CloudWatch Logs already has.&lt;/p&gt;

&lt;p&gt;Each template initializes a&amp;nbsp;&lt;code&gt;Metrics&lt;/code&gt;&amp;nbsp;instance at module level with a shared namespace and service name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Metrics&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_lambda_powertools.metrics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MetricUnit&lt;/span&gt;

&lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Metrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metrics_namespace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MetricUnit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@metrics.log_metrics&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LambdaContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The&amp;nbsp;&lt;code&gt;@metrics.log_metrics&lt;/code&gt;&amp;nbsp;decorator flushes all buffered metrics at the end of each invocation as a single EMF-formatted log line — CloudWatch automatically parses it and makes those metrics available in dashboards and alarms without any additional infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;capture_cold_start_metric=True&lt;/code&gt;&lt;/strong&gt;&amp;nbsp;is a one-liner that adds a&amp;nbsp;&lt;code&gt;ColdStart&lt;/code&gt;&amp;nbsp;metric to every function automatically. In production, tracking cold starts per function gives you a clear signal for when to invest in provisioned concurrency — no custom instrumentation needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started in Under 5 Minutes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Create your repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;a href="https://github.com/amrabed/aws-lambda-templates/generate" rel="noopener noreferrer"&gt;Use this template&lt;/a&gt; on GitHub to create a new repository from the template.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Rename the project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After cloning, run the setup command once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make project &lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"new-name"&lt;/span&gt; &lt;span class="nv"&gt;DESCRIPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"New description"&lt;/span&gt; &lt;span class="nv"&gt;AUTHOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Your Name"&lt;/span&gt; &lt;span class="nv"&gt;EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"you@example.com"&lt;/span&gt; &lt;span class="nv"&gt;GITHUB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"yourusername"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This renames all references throughout the codebase in a single step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Install and run&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;      &lt;span class="c"&gt;# Install dependencies via Poetry&lt;/span&gt;
make precommit    &lt;span class="c"&gt;# Install pre-commit hooks&lt;/span&gt;
make &lt;span class="nb"&gt;test&lt;/span&gt;         &lt;span class="c"&gt;# Run tests with coverage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Deploy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's it. You're shipping production-grade Lambda code, not maintaining boilerplate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make deploy &lt;span class="nv"&gt;STACK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api    &lt;span class="c"&gt;# Deploy the REST API scenario&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Design Decisions Worth Noting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.14+&lt;/strong&gt;: The templates target the latest Python runtime. Lambda supports Python 3.14, and you should be using it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poetry over pip/requirements.txt&lt;/strong&gt;: Deterministic dependency resolution and lock files eliminate the "works on my machine" problem. &lt;code&gt;pyproject.toml&lt;/code&gt; is the single source of truth for the entire project configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Makefile as the interface&lt;/strong&gt;: All common operations — install, test, lint, deploy, docs — are exposed through &lt;code&gt;make&lt;/code&gt; commands. This creates a consistent interface regardless of the underlying tools, making CI/CD pipeline configuration trivial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;camelCase for JSON, snake_case for Python&lt;/strong&gt;: AWS services speak camelCase; Python speaks snake_case. Pydantic's &lt;code&gt;alias_generator=to_camel&lt;/code&gt; bridges the gap automatically, keeping both sides idiomatic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bedrock Agent Template
&lt;/h2&gt;

&lt;p&gt;One template deserves special mention: the &lt;strong&gt;Bedrock Agent&lt;/strong&gt; template. As generative AI workloads move to production on AWS, Lambda functions increasingly serve as the action executors behind Amazon Bedrock Agents. This template gives you a proper starting point for building agent action groups — with typed request/response models, error handling, and the exact response schema Bedrock expects.&lt;/p&gt;

&lt;p&gt;It's production-ready for the AI-native workloads being built today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;The repository is open source under the MIT license. Contributions are welcome — whether that's a new template scenario, improved infrastructure code, additional test coverage, or documentation improvements. Check out the &lt;a href="https://github.com/amrabed/aws-lambda-templates/blob/main/docs/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contributing guidelines&lt;/a&gt; to get started.&lt;/p&gt;




&lt;p&gt;If you're building on AWS Lambda and you find yourself writing the same setup for the third time, I hope &lt;code&gt;cur8d/lambda&lt;/code&gt; saves you that time and helps you ship better, more consistent serverless code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to start?&lt;/strong&gt; Head over to the repository and click &lt;strong&gt;"Use this template"&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/cur8d/lambda" rel="noopener noreferrer"&gt;&lt;strong&gt;github.com/cur8d/lambda&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>aws</category>
      <category>serverless</category>
      <category>lambda</category>
    </item>
    <item>
      <title>The Only AIP-C01 Study Plan You Need</title>
      <dc:creator>Amr Abed</dc:creator>
      <pubDate>Thu, 01 Oct 2026 02:30:26 +0000</pubDate>
      <link>https://dev.to/amrabed/the-only-aip-c01-study-plan-you-need-h9m</link>
      <guid>https://dev.to/amrabed/the-only-aip-c01-study-plan-you-need-h9m</guid>
      <description>&lt;h4&gt;
  
  
  &lt;em&gt;How I Passed as One of the First 5,000 — And the Exact Plan I&amp;nbsp;Used&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;I recently passed the new AWS Certified Generative AI Developer Professional (AIP-C01) exam as an early adopter (one of the first 5,000 worldwide). Here’s the exact 6-week plan I used, so you don’t have to figure it out from&amp;nbsp;scratch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjug2tkuwicggk9nzx318.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjug2tkuwicggk9nzx318.png" width="340" height="340"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;AWS Certified AWS Generative AI Developer Professional Badge&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What you’ll find here is a complete, curated, sequenced study plan — the one I wish someone had handed me before I started. No fluff, just the resources that matter, in the order they&amp;nbsp;matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this guide, you’ll&amp;nbsp;find:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Fast Track (if you’re short on&amp;nbsp;time)&lt;/li&gt;
&lt;li&gt;Detailed Study&amp;nbsp;Plan&lt;/li&gt;
&lt;li&gt;Notion Tracking&amp;nbsp;Template&lt;/li&gt;
&lt;li&gt;Time-Saving Lab Strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do I really need to&amp;nbsp;prepare?
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;“I have been using AWS Generative AI for the last year or so. Do I really need to prepare?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Short answer:&amp;nbsp;Yes!&lt;/p&gt;

&lt;p&gt;No matter how long you have been working with AWS Generative AI tools, you may not be using all the tools covered by the exam in your day-to-day experience, or you may not have encountered all the scenarios seen on the exam. That’s proven true for any AWS certification exam, not only this one. If you have taken any AWS certification exam before, you already know that. In short, being *AWS-*ome at what you do daily and passing an AWS certification exam are two different skills, though highly interconnected.&lt;/p&gt;

&lt;p&gt;That said, a minimum level of familiarity with the exam topic and at least some of the tools covered is required to pass. No amount of preparation can make up for that. Always make sure you are prepared before scheduling and taking the&amp;nbsp;exam.&lt;/p&gt;

&lt;h4&gt;
  
  
  How long does it&amp;nbsp;take?
&lt;/h4&gt;

&lt;p&gt;Plan for 6–8 weeks at roughly 2–3 hours per day, depending on your existing Bedrock experience.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to&amp;nbsp;expect?
&lt;/h4&gt;

&lt;p&gt;If you’re wondering how hard the AIP-C01 is, it felt harder than the AWS Machine Learning Specialty exam but more focused than the Solutions Architect exam. Expect Bedrock depth and several multi-service scenario questions. My practice scores plateaued at around 75% for the first couple of weeks, then eventually rose to around 95%. Don’t panic if progress feels slow mid-way. The domains click together in the final&amp;nbsp;stretch.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fast&amp;nbsp;Track
&lt;/h3&gt;

&lt;p&gt;If you are pressed for&amp;nbsp;time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focus on the &lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide" rel="noopener noreferrer"&gt;Bedrock User Guide&lt;/a&gt; and the &lt;a href="https://skillbuilder.aws/learning-plan/9VXVGYT38G/exam-prep-plan-aws-certified-generative-ai-developer--professional-aipc01--english/4SCMN2659K" rel="noopener noreferrer"&gt;Exam Prep&amp;nbsp;Plan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://www.linkedin.com/events/generativeaifordevelopers-s1e1-7424609466043600896" rel="noopener noreferrer"&gt;Generative AI for Developers&lt;/a&gt; videos are highly recommended for some exam tips and&amp;nbsp;tricks&lt;/li&gt;
&lt;li&gt;You can just read only the topics that address any knowledge gaps you find in the &lt;a href="https://skillbuilder.aws/learning-plan/BGTH16YCTU/aws-generative-ai-developer-advanced-learning-plan-includes-labs/ZDN46CX881" rel="noopener noreferrer"&gt;Advanced Learning&amp;nbsp;Plan&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Notion Tracking&amp;nbsp;Template
&lt;/h3&gt;

&lt;p&gt;I have created a Notion database of study-plan items to track my preparation progress and group, sort, or filter by certification, plan, format, and domain. I am sharing it here so others can benefit as well. The database is available as a template at &lt;a href="http://amrabed.notion.site/aws-exam-prep" rel="noopener noreferrer"&gt;amrabed.notion.site/aws-exam-prep&lt;/a&gt;. Feel free to duplicate and use right&amp;nbsp;away.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The database has content for other exams as well. Remember to filter by certification for AWS Certified Generative AI Developer — Professional&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff68zewbn02o0i8wk5bzi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff68zewbn02o0i8wk5bzi.png" width="800" height="449"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Notion database for AWS Exam Preparation&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparation Material
&lt;/h3&gt;

&lt;p&gt;The AWS Training &amp;amp; Certification team recommends these two learning plans for preparation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learning-plan/9VXVGYT38G/exam-prep-plan-aws-certified-generative-ai-developer--professional-aipc01--english/4SCMN2659K" rel="noopener noreferrer"&gt;Exam Prep Plan: AWS Certified Generative AI Developer — Professional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learning-plan/BGTH16YCTU/aws-generative-ai-developer-advanced-learning-plan-includes-labs/ZDN46CX881" rel="noopener noreferrer"&gt;AWS Generative AI Developer Advanced Learning Plan&lt;/a&gt; &lt;em&gt;(as&amp;nbsp;needed)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I added a couple more learning plans for more hands-on practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learning-plan/66NZQBVQD7/builder-labs-implement-generative-ai-and-agentic-applications/UYVE81N2Y7" rel="noopener noreferrer"&gt;Builder Labs: Implement Generative AI Applications on&amp;nbsp;AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learning-plan/CVTBV11V1K/aws-simulearn-generative-ai-architect/U39NTGR28K" rel="noopener noreferrer"&gt;AWS SimuLearn: Generative AI Architect&lt;/a&gt; or &lt;a href="https://skillbuilder.aws/learn/PFYH348EK2/aws-cloud-quest-generative-ai-architect/B3Q26P97G8" rel="noopener noreferrer"&gt;AWS Cloud Quest: Generative AI Architect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learning-plan/3HCD821CNZ/aws-simulearn-generative-ai-practitioner/BFKGA5VM8H" rel="noopener noreferrer"&gt;AWS SimuLearn: Generative AI Practitioner&lt;/a&gt; or &lt;a href="https://skillbuilder.aws/learn/5YB3FCEE1H/aws-cloud-quest-generative-ai-practitioner/26A81MG83V" rel="noopener noreferrer"&gt;AWS Cloud Quest: Generative AI Practitioner&lt;/a&gt; (&lt;em&gt;Free&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both the AWS SimuLearn and the AWS Cloud Quest plans share the same labs. The list below points to the AWS SimuLearn labs, but you may want to do the Cloud Quest plan instead to earn a training&amp;nbsp;badge.&lt;/p&gt;

&lt;p&gt;Amazon Web Services (AWS) also produced a dedicated LinkedIn Live 4-episode series for the exam, &lt;a href="https://www.linkedin.com/events/generativeaifordevelopers-s1e1-7424609466043600896" rel="noopener noreferrer"&gt;Generative AI for Developers&lt;/a&gt;. I highly recommend watching them for some exam tips and&amp;nbsp;tricks.&lt;/p&gt;

&lt;p&gt;Last but definitely not least, the &lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide" rel="noopener noreferrer"&gt;Bedrock User Guide&lt;/a&gt; is a must-read for this exam. I have highlighted the most relevant parts for each domain&amp;nbsp;below.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Create an&lt;/em&gt; &lt;a href="https://skillsprofile.skillbuilder.aws/" rel="noopener noreferrer"&gt;&lt;em&gt;AWS skills profile&lt;/em&gt;&lt;/a&gt; &lt;em&gt;if you don’t already have one. You will earn points and training badges during your preparation, and you want to showcase&amp;nbsp;them.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wclf09d576efzgmr1r4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wclf09d576efzgmr1r4.png" width="800" height="560"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;AWS Skills&amp;nbsp;Profile&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Before you&amp;nbsp;start
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go over the &lt;a href="https://docs.aws.amazon.com/aws-certification/latest/ai-professional-01/ai-professional-01.html" rel="noopener noreferrer"&gt;Exam Guide&lt;/a&gt; 🆓 to understand the exam structure&lt;/li&gt;
&lt;li&gt;Take the &lt;a href="https://skillbuilder.aws/learn/HSEKTD11NX/official-practice-question-set-aws-certified--generative-ai-developer--professional-aipc01--english/ZDANP82P4V" rel="noopener noreferrer"&gt;Official Practice Question Set&lt;/a&gt; 🆓 to identify your knowledge gaps&lt;/li&gt;
&lt;li&gt;Go over the &lt;a href="https://skillbuilder.aws/learn/U91QQB8S2Q/exam-prep-overview-aws-certified-generative-ai-developer--professional-aipc01--english" rel="noopener noreferrer"&gt;Exam Prep Overview&lt;/a&gt;&amp;nbsp;🆓&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The 6-Week&amp;nbsp;Plan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 0&lt;/strong&gt;: Exam guide + Practice Questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 1–13&lt;/strong&gt;: Domain 1&amp;nbsp;(31%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 14–24&lt;/strong&gt;: Domain 2&amp;nbsp;(26%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 25–31&lt;/strong&gt;: Domain 3&amp;nbsp;(20%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 32–40&lt;/strong&gt;: Domains 4 &amp;amp; 5&amp;nbsp;(23%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 41–42&lt;/strong&gt;: Final Review &amp;amp;&amp;nbsp;Pretest&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  My Comprehensive Study&amp;nbsp;Plan
&lt;/h3&gt;

&lt;p&gt;I have curated the list below covering the readings, labs, videos, and practice questions from the material above in a recommended &lt;em&gt;best-effort&lt;/em&gt; sequence that aligns with the exam guide and provides the most comprehensive preparation.&lt;/p&gt;

&lt;p&gt;Most of the items on the list require a subscription. The free items are marked 🆓. The subscription is currently $29 per month — totally worth it! And, you can always try to complete all the paid items on the list within one month&amp;nbsp;😉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Please feel free to copy the list and use it as a preparation checklist.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Domain 1: FM Integration, Data Management, and Compliance
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html" rel="noopener noreferrer"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/models.html" rel="noopener noreferrer"&gt;Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/bda.html" rel="noopener noreferrer"&gt;Data Automation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html" rel="noopener noreferrer"&gt;Knowledge Bases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-engineering-guidelines.html" rel="noopener noreferrer"&gt;Prompt engineering concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management.html" rel="noopener noreferrer"&gt;Prompt management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/custom-models.html" rel="noopener noreferrer"&gt;Model customization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hands-on Labs&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Explore the Amazon Bedrock Playgrounds 🆓&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/ZCZVUZGPSS/aws-simulearn-get-started-with-generative-ai/T7TJ3K6WVZ" rel="noopener noreferrer"&gt;Get Started with Generative AI&lt;/a&gt;&amp;nbsp;🆓&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/2BDPR3RDK2/aws-simulearn-use-ai-services-with-amazon-sagemaker/FQCRQT43XZ" rel="noopener noreferrer"&gt;Use AI Services with Amazon SageMaker&lt;/a&gt; 🆓&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/UB55676Q4S/aws-simulearn-introduction-to-generative-ai/QS1YCMKAFR" rel="noopener noreferrer"&gt;Introduction to Generative AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/VENBUUH881/aws-simulearn-generative-ai-for-personalized-marketing/3NHRSJWH5S?parentId=U39NTGR28K" rel="noopener noreferrer"&gt;Generative AI for Personalized Marketing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Foundation Models&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/9DKZV5768F/lab--exploring-the-amazon-nova-micro-model-for-text-generation/2WPQYJMYH3" rel="noopener noreferrer"&gt;Exploring the Amazon Nova Micro Model for Text Generation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/E6PY767C2N/lab--exploring-amazon-nova-canvas-model-and-amazon-nova-reel-model-for-image-and-video-generation-and-editing/9YNXNBH3YE" rel="noopener noreferrer"&gt;Exploring Amazon Nova Canvas Model and Amazon Nova Reel Model for Image and Video Generation and&amp;nbsp;Editing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/YHFYBR9YTB/lab--exploring-amazon-nova-lite-model-for-multimodal-understanding/8G34Y3R1TR" rel="noopener noreferrer"&gt;Exploring Amazon Nova Lite Model for Multimodal Understanding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/NC3GDYFK1H/domain-1-practice-aws-simulearn--aws-certified-generative-ai-developer--professional-aipc01--english/261CTRTY13" rel="noopener noreferrer"&gt;Domain 1 Practice — Exploring Amazon Nova Models Using Amazon Bedrock Playgrounds&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Prompt Engineering&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/FC13FQVQYG/aws-simulearn-prompt-engineering-with-amazon-bedrock/QDGW58VYHP" rel="noopener noreferrer"&gt;Prompt Engineering with Amazon&amp;nbsp;Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/Q86946Z2N6/aws-simulearn-code-generation-with-prompt-engineering/E9X7TRY1QP" rel="noopener noreferrer"&gt;Code Generation with Prompt Engineering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Knowledge Bases&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/7E4FETUE2Y/aws-simulearn-create-an-enterprise-knowledge-assistant/2F4Q5XU8WB" rel="noopener noreferrer"&gt;Create an Enterprise Knowledge Assistant&lt;/a&gt; 🆓&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/82XQH1A396/aws-simulearn-enhance-llm-capabilities-with-a-vector-database/7354CYJWJR" rel="noopener noreferrer"&gt;Enhance LLM Capabilities with a Vector&amp;nbsp;Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/49C422WMXP/aws-simulearn-modern-data-architectures-with-llms/BXJVWVR5ZX" rel="noopener noreferrer"&gt;Modern Data Architectures with&amp;nbsp;LLMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/8EJFZ7R45W/lab--develop-retrieval-augmented-generation-rag-applications-with-amazon-bedrock-knowledge-bases/7B21X9MR8W" rel="noopener noreferrer"&gt;Develop RAG Applications with Amazon Bedrock Knowledge Bases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/JRGWCFYT67/lab--build-and-evaluate-retrieval-augmented-generation-rag-applications-using-knowledge-bases-for-amazon-bedrock/A4MN58JB7A" rel="noopener noreferrer"&gt;Build and Evaluate RAG Applications using Knowledge Bases for Amazon&amp;nbsp;Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/FWEY6R46Q3/lab--intelligent-document-processing-for-financial-services-industry/7USBXQZE5Q" rel="noopener noreferrer"&gt;Intelligent Document Processing for the Financial Services&amp;nbsp;Industry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/UHZTEZPYG6/aws-simulearn-nocode-insights-extraction-using-generative-ai/TTMWH3EU1C" rel="noopener noreferrer"&gt;No-Code Insights Extraction Using Generative AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Fine Tuning&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/9V57WCXR4B/aws-simulearn-finetuning-an-llm-on-amazon-sagemaker/W3HW8X5NDX" rel="noopener noreferrer"&gt;Fine-Tuning an LLM on Amazon SageMaker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/AJY3PDJ476/aws-simulearn-automate-finetuning-of-an-llm/EEZRBZXXW9" rel="noopener noreferrer"&gt;Automate Fine-Tuning of an&amp;nbsp;LLM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/AT1JAP9Y95/aws-simulearn-finetune-a-base-model-with-rlhf/SZD4BQF742" rel="noopener noreferrer"&gt;Fine-Tune a Base Model with&amp;nbsp;RLHF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Review and Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/GT2P1KK636/domain-1-review-aws-certified-generative-ai-developer--professional-aipc01-english/4GWFTZBZ74" rel="noopener noreferrer"&gt;Domain 1 Review&lt;/a&gt;&amp;nbsp;🆓&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/V5N6SFRR6S/domain-1-practice-aws-certified-generative-ai-developer--professional-aipc01-english/NRSMYNRGY3" rel="noopener noreferrer"&gt;Domain 1 Questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Video&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/events/generativeaifordevelopers-s1e1-7424609466043600896/theater" rel="noopener noreferrer"&gt;Generative AI For Developers | S1 E1 | Exam Overview and FM Integrations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Optional Reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/9J5FH9NB4R/aws-generative-ai-developer--analyze-requirements-and-design-generative-ai-solutions/MWP57JVX51" rel="noopener noreferrer"&gt;Analyze Requirements and Design Generative AI Solutions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/4X8CFYAMFR/aws-generative-ai-developer--select-and-configure-foundation-models/7FXZYRFQA6" rel="noopener noreferrer"&gt;Select and Configure Foundation Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/697EZTMUJU/aws-generative-ai-developer--implement-data-validation-and-processing-pipelines/T58PCURDU8" rel="noopener noreferrer"&gt;Implement data validation and processing pipelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/XU57YH2BKJ/aws-generative-ai-developer--design-and-implement-vector-store-solutions/QHZVNUHSP4" rel="noopener noreferrer"&gt;Design and Implement Vector Store Solutions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/BFXZR1G81B/aws-generative-ai-developer--design-retrieval-mechanisms-for-fm-augmentation/R64WEX5EJQ" rel="noopener noreferrer"&gt;Design Retrieval Mechanisms for FM Augmentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/AZ7ZCM788F/aws-generative-ai-developer--implement-prompt-engineering-strategies-and-governance/G4NTVS56ZT" rel="noopener noreferrer"&gt;Implement Prompt Engineering Strategies and Governance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Domain 2: Implementation and Integration
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html" rel="noopener noreferrer"&gt;Agents: Automate&amp;nbsp;tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html" rel="noopener noreferrer"&gt;Tool use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/inference.html" rel="noopener noreferrer"&gt;Inference: Generate responses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/amazon-bedrock-marketplace.html" rel="noopener noreferrer"&gt;Amazon Bedrock Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/flows.html" rel="noopener noreferrer"&gt;Flows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/sessions.html" rel="noopener noreferrer"&gt;Session management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hands-on Labs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Agentic AI&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/PT6HBMUFM8/aws-simulearn-create-an-ai-smart-assistant/9VN4PQCUR8" rel="noopener noreferrer"&gt;Create an AI Smart Assistant&lt;/a&gt; &lt;a href="https://skillbuilder.aws/learn/YZDUMAQABG/aws-simulearn-explore-the-amazon-bedrock-playgrounds/88NAE39D3Z" rel="noopener noreferrer"&gt;🆓&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/4ETUEUZRB1/aws-simulearn-build-and-deploy-tools-using-llm-agents/M7VV5H3EQC" rel="noopener noreferrer"&gt;Build and Deploy Tools Using LLM&amp;nbsp;Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/EYJP8ZK9VK/lab--explore-amazon-bedrock-agents-integrated-with-amazon-bedrock-knowledge-bases-and-amazon-bedrock-guardrails/R3GGAEJHGG" rel="noopener noreferrer"&gt;Explore Amazon Bedrock Agents integrated with Amazon Bedrock Knowledge Bases and Amazon Bedrock Guardrails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/BGXTVZ2DPE/aws-simulearn-financial-insights-with-multimodal-agents/PJJUWE8UXB" rel="noopener noreferrer"&gt;Financial Insights with Multimodal Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/ZUWYHSY7FZ/lab--explore-generative-ai-use-cases-with-langchain-and-amazon-bedrock/HADKRVY9AU" rel="noopener noreferrer"&gt;Explore Generative AI Use Cases with LangChain and Amazon&amp;nbsp;Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Model Deployment &amp;amp; Integration&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/67YQK61VA2/aws-simulearn-harness-the-power-of-langchain/7FRRY3YXUZ" rel="noopener noreferrer"&gt;Harness the Power of LangChain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/DABTKGUWNU/aws-simulearn-intelligent-video-and-audio-qa-with-llms/WJ5DNJUJPB" rel="noopener noreferrer"&gt;Intelligent Video and Audio Q&amp;amp;A with&amp;nbsp;LLMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/JVCXW4FCXN/aws-simulearn-generate-an-aws-qa-application/115N1G8V1C" rel="noopener noreferrer"&gt;Generate an AWS Q&amp;amp;A Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/X68QZAMTTR/aws-simulearn-serverless-chatbot-using-private-data/NVMAXPWEDA" rel="noopener noreferrer"&gt;Serverless Chatbot Using Private&amp;nbsp;Data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/BS5JKBDZJU/aws-simulearn-generative-ai-app-for-teaching-and-learning/QVX1D419KT" rel="noopener noreferrer"&gt;Generative AI App for Teaching and&amp;nbsp;Learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/HEUG44UCYW/aws-simulearn-build-generative-ai-apps-with-foundation-models/J7X4P4FKME" rel="noopener noreferrer"&gt;Build Generative AI Apps with Foundation Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/46TU77TNJG/lab--develop-conversation-pattern-with-amazon-bedrock-apis/6319ZBY9Z4" rel="noopener noreferrer"&gt;Develop Conversation Pattern with Amazon Bedrock&amp;nbsp;APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/QD6GGAVZXS/lab--integrate-amazon-bedrock-foundation-models-into-a-serverless-app/5XTGQEF5TV" rel="noopener noreferrer"&gt;Integrate Amazon Bedrock Foundation Models into a Serverless App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/EZYZ4XS4CS/lab--create-functions-using-aws-sdk-for-python-with-amazon-bedrock-api/AKJ7YYSGJN" rel="noopener noreferrer"&gt;Create functions using AWS SDK for Python with Amazon Bedrock&amp;nbsp;API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/VECTFQJ18G/lab--build-productionready-generative-ai-applications-on-aws/B1B29VA81R?parentId=UYVE81N2Y7" rel="noopener noreferrer"&gt;Build Production-Ready Generative AI Applications on&amp;nbsp;AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/G9DCFD6UCB/domain-2-practice-aws-simulearn--aws-certified-generative-ai-developer--professional-aipc01--english/9FJJU2CTMS" rel="noopener noreferrer"&gt;Domain 2 Practice — Document Processing with Amazon&amp;nbsp;Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Development Tools&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/XR5XSR3BHZ/aws-simulearn-generate-code-for-a-webpage/SFXMVX8EFH" rel="noopener noreferrer"&gt;Generate Code for a Webpage&lt;/a&gt;&amp;nbsp;&lt;a href="https://skillbuilder.aws/learn/YZDUMAQABG/aws-simulearn-explore-the-amazon-bedrock-playgrounds/88NAE39D3Z" rel="noopener noreferrer"&gt;🆓&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/Y2FQ5WF2R2/aws-simulearn-build-and-understand-code-with-amazon-q/1C5TAE62YQ" rel="noopener noreferrer"&gt;Build and Understand Code with Amazon Q&lt;/a&gt;&amp;nbsp;&lt;a href="https://skillbuilder.aws/learn/YZDUMAQABG/aws-simulearn-explore-the-amazon-bedrock-playgrounds/88NAE39D3Z" rel="noopener noreferrer"&gt;🆓&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/W77W8SC1U6/aws-simulearn-improve-code-quality-using-generative-ai/71DWERDPX2" rel="noopener noreferrer"&gt;Improve Code Quality Using Generative AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/CFU2FUX3C6/lab--implement-security-fixes-to-codebase-using-amazon-q-developer/B7RAF1BU6N" rel="noopener noreferrer"&gt;Implement Security Fixes to Codebase using Amazon Q Developer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Review and Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/AK4C3YGY67/domain-2-review-aws-certified-generative-ai-developer--professional-aipc01--english/NJ1JV3UWM9" rel="noopener noreferrer"&gt;Domain 2 Review&lt;/a&gt;&amp;nbsp;&lt;a href="https://skillbuilder.aws/learn/YZDUMAQABG/aws-simulearn-explore-the-amazon-bedrock-playgrounds/88NAE39D3Z" rel="noopener noreferrer"&gt;🆓&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/RVEJWM1KBZ/domain-2-practice-aws-certified-generative-ai-developer--professional-aipc01--english/SVE4Q3JSN3" rel="noopener noreferrer"&gt;Domain 2 Questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Video&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/events/generativeaifordevelopers-s1e2-7427431654769594369/theater" rel="noopener noreferrer"&gt;Generative AI For Developers | S1 E2 | Implementation and Integration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Optional Reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/EFHFQHUM7R/aws-generative-ai-developer--agentic-ai-solutions-and-tool-integrations/P7JC8RMXSU" rel="noopener noreferrer"&gt;Agentic AI Solutions and Tool Integrations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/QE4JV2ZM2J/aws-generative-ai-developer--model-deployment-strategies/CEVRFXYVGN" rel="noopener noreferrer"&gt;Model Deployment Strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/WJW5Y7GEGJ/aws-generative-ai-developer--enterprise-integration-architectures/GFT1NS9GE6" rel="noopener noreferrer"&gt;Enterprise Integration Architectures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/SWBETBZRSG/aws-generative-ai-developer--foundation-model-api-integrations/UCQPEKXKSS" rel="noopener noreferrer"&gt;Foundation Model API Integrations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/B1XJFH5DYA/aws-generative-ai-developer--implement-application-integration-patterns-and-development-tools/PDGRMSKNVD" rel="noopener noreferrer"&gt;Implement Application Integration Patterns and Development Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Domain 3: AI Safety, Security, and Governance
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/security-overview.html" rel="noopener noreferrer"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html" rel="noopener noreferrer"&gt;Bedrock Guardrails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hands-on Labs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/6XKW5KV9FS/aws-simulearn-secure-conversational-ai-with-guardrails/R6NFKDHSND" rel="noopener noreferrer"&gt;Secure Conversational AI with Guardrails&lt;/a&gt; 🆓&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/MFJEGXVW7B/aws-simulearn-set-up-private-access-to-amazon-bedrock/D3KX66AZKB" rel="noopener noreferrer"&gt;Set Up Private Access to Amazon&amp;nbsp;Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/D4UVDVA8GE/aws-simulearn-provision-sagemaker-in-a-secure-environment/M8XRRN2TPR?parentId=U39NTGR28K" rel="noopener noreferrer"&gt;Provision SageMaker in a Secure Environment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/DEFW74BV18/lab--building-secure-and-responsible-gen-ai-with-guardrails-for-amazon-bedrock/EWW6F5XMSH" rel="noopener noreferrer"&gt;Building Secure and Responsible Generative AI with GuardRails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/V3VK57AYEK/aws-simulearn-moderate-generative-ai-chat-app-conversations/ECJXM14K7Z" rel="noopener noreferrer"&gt;Moderate Generative AI Chat App Conversations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/ZDUNTYGAC8/aws-simulearn-moderator-for-generative-ai-content/QYHZDNUZHK" rel="noopener noreferrer"&gt;Moderator for Generative AI&amp;nbsp;Content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/7ZWAKHCJ39/aws-simulearn-bias-mitigation-for-a-translation-service/HGKPZPAY13" rel="noopener noreferrer"&gt;Bias Mitigation for a Translation Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/EB4JJXDGKZ/lab--monitor-a-model-for-data-drift/F8YT3RH3ZA" rel="noopener noreferrer"&gt;Monitor a Model for Data&amp;nbsp;Drift&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Review and Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/9UFTNQDJ8U/domain-3-review-aws-certified-generative-ai-developer--professional-aipc01--english/J43656ADK3" rel="noopener noreferrer"&gt;Domain 3 Review&lt;/a&gt;&amp;nbsp;🆓&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/ASBN3JAAUG/domain-3-practice-aws-certified-generative-ai-developer--professional-aipc01--english/SUU236RXNR" rel="noopener noreferrer"&gt;Domain 3 Questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Video&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/events/generativeaifordevelopers-s1e3-7429961169710297088/theater" rel="noopener noreferrer"&gt;Generative AI For Developers | S1 E3 | AI Safety, Security, and Governance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Optional Reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/9U6AYCC64R/aws-generative-ai-developer--safe-user-interactions-with-generative-ai-applications/RRCESSXBYG" rel="noopener noreferrer"&gt;Safe User Interactions with Generative AI Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/SD43YU6AYA/aws-generative-ai-developer--implement-data-security-and-privacy-controls/EY9XC5AXFR" rel="noopener noreferrer"&gt;Implement Data Security and Privacy&amp;nbsp;Controls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/ESR9ZRK27V/aws-generative-ai-developer--implement-ai-governance-compliance-and-transparency/P93ZF42V9J" rel="noopener noreferrer"&gt;Implement AI Governance, Compliance, and Transparency&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Domain 4: Operational Efficiency and Optimization for AI Applications
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/capacity-limits-cost-optimization.html" rel="noopener noreferrer"&gt;Capacity, Limits, and Cost Optimization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/monitoring.html" rel="noopener noreferrer"&gt;Monitoring&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Review and Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/PEYR7XMDFQ/domain-4-review-aws-certified-generative-ai-developer--professional-aipc01--english/RKHB3VMJ23" rel="noopener noreferrer"&gt;Domain 4 Review&lt;/a&gt;&amp;nbsp;&lt;a href="https://skillbuilder.aws/learn/YZDUMAQABG/aws-simulearn-explore-the-amazon-bedrock-playgrounds/88NAE39D3Z" rel="noopener noreferrer"&gt;🆓&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/E78PRJA6T4/domain-4-practice-aws-certified-generative-ai-developer--professional-aipc01--english/NSE8TTQEZ8" rel="noopener noreferrer"&gt;Domain 4 Questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Video&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/events/generativeaifordevelopers-s1e4-7432203857402916864/theater" rel="noopener noreferrer"&gt;Generative AI For Developers | S1 E4 | Operations and Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Optional Reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/C7DDZ8ETP4/aws-generative-ai-developer--implementing-cost-optimization-and-resource-efficiency-strategies/VD6YGCBDPG" rel="noopener noreferrer"&gt;Implementing Cost Optimization and Resource Efficiency Strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/C3CQ1ZJ212/aws-generative-ai-developer--optimize-application-performance/9KT2NT8H8U" rel="noopener noreferrer"&gt;Optimize Application Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/YJZUP11TPR/aws-generative-ai-developer--implement-monitoring-systems/QHPEZJM69R" rel="noopener noreferrer"&gt;Implement Monitoring Systems&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Domain 5: Testing, Validation, and Troubleshooting
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/evaluation.html" rel="noopener noreferrer"&gt;Evaluate models&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Review and Questions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://skillbuilder.aws/learn/UHY3CG2Q5T/domain-5-review-aws-certified-generative-ai-developer--professional-aipc01--english/Q6K7K67UEW" rel="noopener noreferrer"&gt;Domain 5 Review&lt;/a&gt;&amp;nbsp;&lt;a href="https://skillbuilder.aws/learn/YZDUMAQABG/aws-simulearn-explore-the-amazon-bedrock-playgrounds/88NAE39D3Z" rel="noopener noreferrer"&gt;🆓&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/P3ENCEB2E7/domain-5-practice-aws-certified-generative-ai-developer--professional-aipc01--english/HNDP65ZV2F" rel="noopener noreferrer"&gt;Domain 5 Bonus Questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Video&lt;/strong&gt; 🆓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/events/generativeaifordevelopers-s1e4-7432203857402916864/theater" rel="noopener noreferrer"&gt;&lt;em&gt;Episode 4&lt;/em&gt;&lt;/a&gt; &lt;em&gt;also covers domain 5 in the last 10&amp;nbsp;minutes&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Optional Reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/AM9M42X85W/aws-generative-ai-developer--implement-evaluation-systems-for-generative-ai/YFBR1Z47E3" rel="noopener noreferrer"&gt;Implement Evaluation Systems for Generative AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillbuilder.aws/learn/WB1ECBCME1/aws-generative-ai-developer--troubleshoot-generative-ai-applications/8CPC5ZV39G" rel="noopener noreferrer"&gt;Troubleshoot Generative AI Applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Final Review and&amp;nbsp;Pretest
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Go over the &lt;a href="https://skillbuilder.aws/learn/F67DBSMZ9V/exam-prep-summary-aws-certified-generative-ai-developer--professional-aipc01--english/RFJWMN3DXQ" rel="noopener noreferrer"&gt;Exam Prep Summary&lt;/a&gt;&amp;nbsp;&lt;a href="https://skillbuilder.aws/learn/YZDUMAQABG/aws-simulearn-explore-the-amazon-bedrock-playgrounds/88NAE39D3Z" rel="noopener noreferrer"&gt;🆓&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Retake: &lt;a href="https://skillbuilder.aws/learn/U91QQB8S2Q/exam-prep-overview-aws-certified-generative-ai-developer--professional-aipc01--english/SZ29259FX6" rel="noopener noreferrer"&gt;Official Practice Question Set&lt;/a&gt; &lt;a href="https://skillbuilder.aws/learn/YZDUMAQABG/aws-simulearn-explore-the-amazon-bedrock-playgrounds/88NAE39D3Z" rel="noopener noreferrer"&gt;🆓,&lt;/a&gt; &lt;a href="https://skillbuilder.aws/learn/V5N6SFRR6S/domain-1-practice-aws-certified-generative-ai-developer--professional-aipc01-english/NRSMYNRGY3" rel="noopener noreferrer"&gt;Domain 1 Questions,&lt;/a&gt; &lt;a href="https://skillbuilder.aws/learn/RVEJWM1KBZ/domain-2-practice-aws-certified-generative-ai-developer--professional-aipc01--english/SVE4Q3JSN3" rel="noopener noreferrer"&gt;Domain 2 Questions,&lt;/a&gt; &lt;a href="https://skillbuilder.aws/learn/ASBN3JAAUG/domain-3-practice-aws-certified-generative-ai-developer--professional-aipc01--english/SUU236RXNR" rel="noopener noreferrer"&gt;Domain 3 Questions,&lt;/a&gt; &lt;a href="https://skillbuilder.aws/learn/E78PRJA6T4/domain-4-practice-aws-certified-generative-ai-developer--professional-aipc01--english/NSE8TTQEZ8" rel="noopener noreferrer"&gt;Domain 4 Questions,&lt;/a&gt; &lt;a href="https://skillbuilder.aws/learn/P3ENCEB2E7/domain-5-practice-aws-certified-generative-ai-developer--professional-aipc01--english/HNDP65ZV2F" rel="noopener noreferrer"&gt;Domain 5 Questions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Take the &lt;a href="https://skillbuilder.aws/learn/24FDAZ9UKG/official-pretest-aws-certified--generative-ai-developer--professional-aipc01--english/VFBSB1C83U" rel="noopener noreferrer"&gt;Official&amp;nbsp;Pretest&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Bonus
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Take the &lt;a href="https://skillbuilder.aws/learn/32Y249P272/aws-agentic-ai-demonstrated/TTAJ5WKYTS" rel="noopener noreferrer"&gt;AWS Agentic AI Demonstrated&lt;/a&gt; microcredential&lt;/li&gt;
&lt;li&gt;Play the Generative AI track on &lt;a href="https://cardclash.skillbuilder.aws/" rel="noopener noreferrer"&gt;AWS Card Clash&lt;/a&gt; just for&amp;nbsp;fun!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Would you still like&amp;nbsp;more?
&lt;/h4&gt;

&lt;p&gt;If you need even more training, you can always search the AWS Skill Builder content with filters&amp;nbsp;like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Roles&lt;/em&gt;: Generative AI Development Engineer&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Format&lt;/em&gt;: Learning&amp;nbsp;plan&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvao1agu51c4l36szuapt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvao1agu51c4l36szuapt.png" width="800" height="693"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;AWS Skill Builder Gen AI Learning&amp;nbsp;Plans&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Time-Saving Tips
&lt;/h3&gt;

&lt;p&gt;As you see in the study plan above, there is a lot to cover, ideally in no more than a month or two. So, you’ll need to save as much time as you can during your preparation. Here are a few tips and tricks based on my experience, especially if you decide to take the hands-on labs. You will notice that most of the lab time is consumed by provisioning the environment, deploying model endpoints, and running Jupyter notebooks. Here is how you can finish the labs&amp;nbsp;faster.&lt;/p&gt;

&lt;h4&gt;
  
  
  No idle&amp;nbsp;time
&lt;/h4&gt;

&lt;p&gt;While the lab environment is being provisioned, don’t wait for provisioning to complete before starting. Go through the instructions for all three stages (Learn, Practice, and DIY) to hit the ground running once the environment is&amp;nbsp;ready.&lt;/p&gt;

&lt;h4&gt;
  
  
  Parallelize tasks
&lt;/h4&gt;

&lt;p&gt;Many DIY sections do not depend on the practice sections, which means you can complete both practice and DIY together. For instance, the practice section may ask you to start a 2-instance cluster, which the DIY asks to scale up to 3 instances. You can just go ahead and start a 3-instance cluster right away. Moreover, some steps are independent of one another, so open multiple tabs and continue to the next step while the current one completes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Run all&amp;nbsp;cells
&lt;/h4&gt;

&lt;p&gt;For the Jupyter notebooks, skim through the notebook to understand the concepts, add any missing configuration or code, then run all cells rather than cell by&amp;nbsp;cell.&lt;/p&gt;

&lt;h4&gt;
  
  
  Split screen
&lt;/h4&gt;

&lt;p&gt;This is not technically a preparation tip, but it helps. Once the AWS sandbox environment is loaded, split the screen between the lab window with instructions and the AWS environment window to follow along more&amp;nbsp;quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to schedule the&amp;nbsp;exam
&lt;/h3&gt;

&lt;p&gt;I prefer to schedule the exam only when I can answer at least 90% of the questions correctly, with each question taking no more than 90 seconds on average. That gives me confidence that I can pass the exam smoothly, even under the added&amp;nbsp;stress.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I only schedule the exam when I can hit 90%+ accuracy, spending no more than 90 seconds per question. That’s my personal go/no-go&amp;nbsp;signal.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;p&gt;If you want to dig deeper into some of the topics covered in the exam, here are a few AWS resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/index.html" rel="noopener noreferrer"&gt;Amazon Bedrock User Guide&lt;/a&gt; (&lt;em&gt;A must-read for this&amp;nbsp;exam&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/index.html" rel="noopener noreferrer"&gt;AgentCore Developer Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/wellarchitected/latest/framework/welcome.html" rel="noopener noreferrer"&gt;AWS Well-Architected Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html" rel="noopener noreferrer"&gt;AWS Step Functions Developer Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/sagemaker/latest/dg" rel="noopener noreferrer"&gt;Amazon SageMaker AI Developer Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/index.html" rel="noopener noreferrer"&gt;Amazon OpenSearch Developer Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A big thank-you to the AWS Training &amp;amp; Certification team for the incredibly well-structured content on AWS Skill Builder. The domain-by-domain video series, the hands-on labs, and the Official Practice Questions were the backbone of my preparation. This article is essentially a curated map of their&amp;nbsp;work.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;I passed this exam before most study guides existed. If this plan helped you pass or saved you time, let me know in a comment. I’d love to hear what worked best for you, and what you’d add. If you find it useful, share it with the next engineer searching for where to start and give it a clap 👏 (or 50 😉) — it helps other engineers find&amp;nbsp;it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>generativeai</category>
      <category>awscertification</category>
    </item>
  </channel>
</rss>
