<?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: Anwaar Hussain</title>
    <description>The latest articles on DEV Community by Anwaar Hussain (@awshuss).</description>
    <link>https://dev.to/awshuss</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%2F3880022%2F8054ef29-0afb-47df-adbf-7d5c3bf227cc.jpeg</url>
      <title>DEV Community: Anwaar Hussain</title>
      <link>https://dev.to/awshuss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/awshuss"/>
    <language>en</language>
    <item>
      <title>Resolving Control Tower StackSet Drift from Orphaned Accounts</title>
      <dc:creator>Anwaar Hussain</dc:creator>
      <pubDate>Sat, 11 Jul 2026 09:38:29 +0000</pubDate>
      <link>https://dev.to/awshuss/resolving-control-tower-stackset-drift-from-orphaned-accounts-561</link>
      <guid>https://dev.to/awshuss/resolving-control-tower-stackset-drift-from-orphaned-accounts-561</guid>
      <description>&lt;p&gt;I upgraded AWS Control Tower landing zone from version 3.3 to 4.0. The update failed the first time. StackSet instances showed &lt;code&gt;INOPERABLE&lt;/code&gt; status with a Service-Linked Role conflict pointing to accounts that no longer existed in the organisation.&lt;/p&gt;

&lt;p&gt;Turns out, accounts had been removed from AWS Organizations without first being un-enrolled from Control Tower. Their StackSet instances remained as orphans. Control Tower couldn't assume the execution role in deleted accounts. Every landing zone operation hit this wall.&lt;/p&gt;

&lt;p&gt;Here's how I fixed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Service-Linked Role conflict occurs
&lt;/h2&gt;

&lt;p&gt;When Control Tower enrols an account, it creates a Service-Linked Role (&lt;code&gt;AWSServiceRoleForAWSControlTower&lt;/code&gt;) and registers that account as a resource consumer of the role. If you close or remove the account from the organisation without un-enrolling it first, the role's resource reference still points to the deleted account. During a landing zone update, Control Tower tries to reconcile the StackSet across all registered accounts. It finds the orphaned reference, cannot reach the account, and fails with the &lt;code&gt;INOPERABLE&lt;/code&gt; conflict.&lt;/p&gt;

&lt;h2&gt;
  
  
  The error
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;StackSet Id: AWSControlTowerBP-BASELINE-SERVICE-LINKED-ROLE Status: INOPERABLE ResourceLogicalId: ControlTowerServiceRole ResourceType: AWS::IAM::ServiceLinkedRole Reason: Resource of type 'AWS::IAM::ServiceLinkedRole' with identifier 'AWSServiceRoleForAWSControlTower' has a conflict. SLR [AWSServiceRoleForAWSControlTower] is in use by other resources referencing an orphaned account no longer in the organisation.&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Remove orphaned stack instances from the affected StackSet. Select "Retain Stacks" because the deleted account is unreachable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws cloudformation delete-stack-instances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--stack-set-name&lt;/span&gt; AWSControlTowerBP-BASELINE-SERVICE-LINKED-ROLE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--accounts&lt;/span&gt; &amp;lt;ORPHANED_ACCOUNT_ID&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--regions&lt;/span&gt; &amp;lt;GOVERNED_REGIONS&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--retain-stacks&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--no-cli-pager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Check your other Control Tower baseline StackSets for the same orphaned accounts and repeat. Common ones include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AWSControlTowerBP-BASELINE-CONFIG&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWSControlTowerBP-BASELINE-CLOUDWATCH&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWSControlTowerBP-BASELINE-ROLES&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWSControlTowerBP-BASELINE-SERVICE-ROLES&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWSControlTowerBP-VPC-ACCOUNT-FACTORY-V1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The exact StackSets in your environment may vary depending on your Control Tower version and configuration. Check all StackSets prefixed with &lt;code&gt;AWSControlTowerBP-&lt;/code&gt; for orphaned instances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Navigate to Service Catalog &amp;gt; Provisioned products. If any orphaned accounts have a provisioned product in &lt;code&gt;TAINTED&lt;/code&gt; or &lt;code&gt;ERROR&lt;/code&gt; state, terminate it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Re-run the Control Tower landing zone update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Re-register your Organisational Units. This propagates updated guardrails and baselines to enrolled accounts under the new landing zone version.&lt;/p&gt;

&lt;p&gt;Console path: AWS Control Tower &amp;gt; Organization &amp;gt; select the OU &amp;gt; Re-register OU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things to note
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Only remove instances for orphaned accounts. Do not touch active, enrolled accounts.&lt;/li&gt;
&lt;li&gt;"Retain Stacks" is critical. Without it, the delete operation fails because the StackSet cannot assume a role in deleted accounts.&lt;/li&gt;
&lt;li&gt;This issue can occur during any Control Tower landing zone upgrade, not just 3.3 to 4.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prevention
&lt;/h2&gt;

&lt;p&gt;Always un-enrol accounts from Control Tower before closing them in AWS Organizations. &lt;a href="https://docs.aws.amazon.com/controltower/latest/userguide/delete-account.html" rel="noopener noreferrer"&gt;AWS documentation&lt;/a&gt; states this explicitly: "You must unenroll the account before you close it."&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/controltower/latest/userguide/update-controltower.html" rel="noopener noreferrer"&gt;Update Control Tower landing zone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stackinstances-delete.html" rel="noopener noreferrer"&gt;Delete stacks from CloudFormation StackSets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>controltower</category>
      <category>devops</category>
      <category>cloudformation</category>
    </item>
    <item>
      <title>Durable Workflows on AWS: Lambda Durable Functions, Step Functions, and MWAA</title>
      <dc:creator>Anwaar Hussain</dc:creator>
      <pubDate>Tue, 07 Jul 2026 12:05:30 +0000</pubDate>
      <link>https://dev.to/awshuss/durable-workflows-on-aws-lambda-durable-functions-step-functions-and-mwaa-3b81</link>
      <guid>https://dev.to/awshuss/durable-workflows-on-aws-lambda-durable-functions-step-functions-and-mwaa-3b81</guid>
      <description>&lt;p&gt;&lt;em&gt;Level: 300–400 | Reading time: ~10 minutes&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Recently, a customer asked me when they should choose &lt;a href="https://aws.amazon.com/managed-workflows-for-apache-airflow/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon Managed Workflows for Apache Airflow (Amazon MWAA)&lt;/a&gt; versus &lt;a href="https://aws.amazon.com/step-functions/" rel="noopener noreferrer"&gt;AWS Step Functions&lt;/a&gt;. I walked them through their use cases, pointed them to the recently published &lt;a href="https://aws.amazon.com/blogs/big-data/choosing-the-right-workflow-orchestration-service-for-your-use-case-amazon-mwaa-and-aws-step-functions/" rel="noopener noreferrer"&gt;AWS comparison blog&lt;/a&gt;, and mentioned &lt;a href="https://aws.amazon.com/lambda/?nc2=type_a" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt; durable functions as something worth considering for their new data platform.&lt;/p&gt;

&lt;p&gt;That made me realise how many teams are asking the same question. The AWS blog covers MWAA and Step Functions well. It references Lambda durable functions at the end, pointing readers to the documentation for more detail. This post expands that comparison by bringing Lambda durable functions into the picture.&lt;/p&gt;

&lt;p&gt;In this post, you will learn how Lambda durable functions, Step Functions, and MWAA differ in developer experience and architectural fit. You get five real scenarios, the same workflow implemented three ways, and a decision framework you can apply to your own workloads.&lt;/p&gt;

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

&lt;p&gt;Familiarity with at least one AWS compute service (Lambda, &lt;a href="https://aws.amazon.com/ecs/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon ECS&lt;/a&gt;, or &lt;a href="https://aws.amazon.com/ec2/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon EC2&lt;/a&gt;). A basic understanding of workflow orchestration concepts such as DAGs, state machines, and checkpoints. The &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-execution-sdk.html?nc2=type_a_top_search" rel="noopener noreferrer"&gt;AWS Durable Execution SDK&lt;/a&gt; installed for Python, TypeScript, or Java.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lambda durable functions in 30 seconds
&lt;/h2&gt;

&lt;p&gt;Lambda durable functions use a checkpoint and replay mechanism. Your function runs for up to one year, recovering from interruptions by replaying from the last saved checkpoint. You write orchestration in application code, not in Amazon States Language (ASL) and not in Airflow DAGs.&lt;/p&gt;

&lt;p&gt;The mental model is simple. Step Functions lives outside your code. Durable functions live inside it.&lt;/p&gt;

&lt;p&gt;AWS positions these three services for different orchestration patterns. Durable functions handle application-level orchestration. Step Functions handles cross-service orchestration. MWAA handles data pipeline orchestration. They complement each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer experience compared
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lambda durable functions&lt;/strong&gt; give you code-first orchestration. You write workflow logic in Python, TypeScript, or Java using the Durable Execution SDK. You test locally without cloud dependencies. You debug with familiar stack traces. There is no visual designer. You read code, not diagrams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Step Functions&lt;/strong&gt; gives you DSL-driven orchestration. You define workflows in ASL or use Workflow Studio's visual canvas. You get 200+ native service integrations without writing Lambda glue code. Non-technical stakeholders can follow execution visually. The trade-off is that complex ASL gets verbose and Workflow Studio has limits on larger state machines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon MWAA&lt;/strong&gt; gives you scheduler-driven orchestration. You write Python DAGs using the Apache Airflow ecosystem. You get scheduling, backfills, and SLA monitoring as first-class features. The operator ecosystem covers AWS and non-AWS systems. The trade-off is environment provisioning time and a baseline cost that only makes sense when you run multiple pipelines.&lt;/p&gt;

&lt;p&gt;None of these services is universally better. Each fits a different architectural pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios: where each service wins
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario 1: Multi-step AI agent workflow
&lt;/h3&gt;

&lt;p&gt;A customer submits a support ticket. You classify intent via &lt;a href="https://aws.amazon.com/bedrock/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt;, extract entities, route to the right team, generate a draft response, wait for human review, then send the reply.&lt;/p&gt;

&lt;p&gt;Durable functions fit naturally here. The logic is sequential, the human-in-the-loop wait costs nothing (no compute during the pause), and the entire workflow reads like a script. Step Functions also works well because of native Bedrock integration and visual tracing. MWAA is awkward for this pattern. There is no scheduling need, no backfill requirement, and you would force Airflow into a request/response pattern for which it was not designed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Durable functions win on developer experience and testability. Step Functions wins on native integrations and visual tracing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 2: Nightly data pipeline with conditional branching
&lt;/h3&gt;

&lt;p&gt;Every night at 02:00, you pull data from three APIs, validate the schema, branch conditionally (trigger an &lt;a href="https://aws.amazon.com/glue/?nc2=type_a" rel="noopener noreferrer"&gt;AWS Glue&lt;/a&gt; crawler if the schema changed, skip if not), transform, load to &lt;a href="https://aws.amazon.com/redshift/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon Redshift&lt;/a&gt;, notify Slack, and support backfills for missed days.&lt;/p&gt;

&lt;p&gt;MWAA wins clearly. Scheduling, backfill, SLA monitoring, Glue operators, and Redshift operators are all first-class. Step Functions works but you bolt on &lt;a href="https://aws.amazon.com/eventbridge/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon EventBridge&lt;/a&gt; for scheduling and build custom backfill logic. Durable functions are a poor fit here. No native scheduling, no backfill capability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Winner:&lt;/strong&gt; MWAA.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 3: E-commerce order fulfilment with parallel fan-out
&lt;/h3&gt;

&lt;p&gt;An order arrives. You validate payment, reserve inventory, then fan out in parallel: generate an invoice to &lt;a href="https://aws.amazon.com/s3/?did=ap_card&amp;amp;trk=ap_card" rel="noopener noreferrer"&gt;Amazon S3&lt;/a&gt;, notify the warehouse via &lt;a href="https://aws.amazon.com/sqs/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon SQS&lt;/a&gt;, send confirmation via &lt;a href="https://aws.amazon.com/ses/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon SES&lt;/a&gt;, and update the CRM in &lt;a href="https://aws.amazon.com/dynamodb/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon DynamoDB&lt;/a&gt;. You wait for all branches to complete, then mark the order confirmed.&lt;/p&gt;

&lt;p&gt;Step Functions wins clearly. The Parallel state handles fan-out natively. Each branch uses a different service integration directly without Lambda in between. Durable functions work for the sequential parts but parallel fan-out across multiple services requires additional orchestration. MWAA is overkill for this pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Winner:&lt;/strong&gt; Step Functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 4: Long-running document processing with human approval
&lt;/h3&gt;

&lt;p&gt;A user uploads a contract PDF. You extract text with &lt;a href="https://aws.amazon.com/textract/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon Textract&lt;/a&gt;, summarise clauses via Bedrock, flag risky clauses, then wait for legal team approval (which could take days). If approved, store and index. If rejected, notify the uploader with reasons.&lt;/p&gt;

&lt;p&gt;Durable functions are strong here. The wait costs nothing. The logic reads top-to-bottom. Testing the approval branch is a unit test. Step Functions is also strong. The &lt;code&gt;.waitForTaskToken&lt;/code&gt; pattern handles the human gate, and native Textract and Bedrock integrations avoid Lambda glue. MWAA is a poor fit because sensors polling for approval waste worker resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Durable functions win on developer experience. Step Functions wins on native integrations and visual audit trail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 5: Multi-account infrastructure provisioning
&lt;/h3&gt;

&lt;p&gt;A new team onboards. You create an AWS account via &lt;a href="https://aws.amazon.com/organizations/?nc2=type_a" rel="noopener noreferrer"&gt;AWS Organizations&lt;/a&gt;, deploy baseline &lt;a href="https://aws.amazon.com/cloudformation/?refid=ap_card" rel="noopener noreferrer"&gt;AWS CloudFormation&lt;/a&gt; stacks, configure networking, set up &lt;a href="https://aws.amazon.com/iam/?nc2=type_a" rel="noopener noreferrer"&gt;AWS Identity and Access Management (IAM)&lt;/a&gt; roles, wait for security team approval, enable &lt;a href="https://aws.amazon.com/guardduty/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon GuardDuty&lt;/a&gt; and &lt;a href="https://aws.amazon.com/config/?nc2=type_a" rel="noopener noreferrer"&gt;AWS Config&lt;/a&gt;, then notify via &lt;a href="https://aws.amazon.com/sns/?nc2=type_a" rel="noopener noreferrer"&gt;Amazon SNS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Step Functions wins clearly. Every step is an AWS service call. Native integrations for Organizations, CloudFormation, and IAM mean zero custom code. The visual audit trail supports compliance requirements. Durable functions add no value here because you would write SDK calls for everything that Step Functions already integrates natively. MWAA is the wrong tool entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Winner:&lt;/strong&gt; Step Functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  The scorecard
&lt;/h3&gt;

&lt;p&gt;No single service dominates. That is the point.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scenario 1: Durable functions ≈ Step Functions (trade-off)&lt;/li&gt;
&lt;li&gt;Scenario 2: MWAA&lt;/li&gt;
&lt;li&gt;Scenario 3: Step Functions&lt;/li&gt;
&lt;li&gt;Scenario 4: Durable functions ≈ Step Functions (trade-off)&lt;/li&gt;
&lt;li&gt;Scenario 5: Step Functions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Same workflow, three implementations
&lt;/h2&gt;

&lt;p&gt;Taking Scenario 1 (AI agent workflow), here is the same logic implemented three ways.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code samples in this post are illustrative. Refer to the &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-execution-sdk.html" rel="noopener noreferrer"&gt;AWS Durable Execution SDK documentation&lt;/a&gt; for the latest API syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lambda durable functions (Python)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_durable_execution_sdk_python.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_durable_execution_sdk_python.context&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DurableContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StepContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;durable_step&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aws_durable_execution_sdk_python.execution&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;durable_execution&lt;/span&gt;


&lt;span class="nd"&gt;@durable_step&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;classify_intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StepContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ticket&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;call_bedrock_classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@durable_step&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_entities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StepContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ticket&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="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;call_bedrock_extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@durable_step&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;route_to_team&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StepContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intent&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;entities&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;determine_team&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@durable_step&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_draft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StepContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ticket&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;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;call_bedrock_draft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@durable_step&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StepContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ticket&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;draft&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="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch_reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@durable_execution&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DurableContext&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;ticket&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ticket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;intent&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="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;classify_intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;entities&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="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;extract_entities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;team&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="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;route_to_team&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;draft&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="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;generate_draft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# Wait for human review window (24 hours max)
&lt;/span&gt;    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_hours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;24&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="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;send_reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;draft&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;statusCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ticket routed to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;team&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, reply sent&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;&lt;strong&gt;Step Functions (ASL excerpt)&lt;/strong&gt;&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;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ClassifyIntent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ClassifyIntent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:states:::bedrock:invokeModel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ExtractEntities"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ExtractEntities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:states:::bedrock:invokeModel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RouteToTeam"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"RouteToTeam"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:lambda:...:route-to-team"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GenerateDraft"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"GenerateDraft"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:states:::bedrock:invokeModel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WaitForReview"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"WaitForReview"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:states:::lambda:invoke.waitForTaskToken"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SendReply"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SendReply"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:states:::ses:sendEmail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"End"&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="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Amazon MWAA (Airflow DAG excerpt)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;airflow&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DAG&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;airflow.operators.python&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PythonOperator&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;airflow.sensors.external_task&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ExternalTaskSensor&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;DAG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ticket_workflow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="o"&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;as&lt;/span&gt; &lt;span class="n"&gt;dag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;classify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PythonOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;classify&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;python_callable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;call_bedrock_classify&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;extract&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PythonOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;extract&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;python_callable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;call_bedrock_extract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PythonOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;python_callable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;route_to_team&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PythonOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;python_callable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;call_bedrock_draft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;review&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ExternalTaskSensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wait_review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;send&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PythonOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;python_callable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;send_reply&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;classify&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;extract&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;review&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;send&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The durable functions version is more verbose than a pseudocode sketch, but each step is explicit, testable, and replay-safe. The ASL version is 35 lines. The Airflow DAG is 12 lines. But line count is not the full picture. Step Functions gives you a visual execution trace without writing a single log statement. MWAA gives you scheduling and backfill without writing a single cron job. Each trade-off is real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas I learned the hard way
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Replay non-determinism catches you off guard.&lt;/strong&gt; Durable functions replay from the last checkpoint on recovery. Any non-deterministic call inside the orchestration logic produces a different result on replay. This includes datetime.now(), random(), and HTTP calls. Perform non-deterministic operations inside durable steps and keep your orchestration logic deterministic.&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;# This breaks on replay — called inside orchestration logic, not a step
&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# This works — wrapped in a durable step
&lt;/span&gt;&lt;span class="nd"&gt;@durable_step&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StepContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Checkpoint frequency involves trade-offs.&lt;/strong&gt; Recovery speed, replay overhead, and persistence cost all pull in different directions. The right balance depends on your workload. Test it rather than assuming a universal rule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MWAA environment provisioning takes time.&lt;/strong&gt; Spinning up a new environment typically takes 20 to 30 minutes. Iteration speed is slower compared to durable functions or Step Functions where you deploy in seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large Step Functions workflows become difficult to manage visually.&lt;/strong&gt; Workflow Studio works well for smaller state machines. As complexity grows, many teams eventually edit ASL directly. Plan for this from the start if your workflow is complex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portability varies.&lt;/strong&gt; MWAA runs on open-source Apache Airflow. Your DAGs work on any compatible Apache Airflow deployment, though provider-specific operators may still need changes. Durable functions use the AWS Durable Execution SDK, which is AWS-specific, though the checkpoint/replay pattern itself is transferable. Step Functions uses ASL, which has no equivalent outside AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision framework
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose durable functions&lt;/strong&gt; when your team owns the code and wants orchestration embedded in application logic. When you value local testability and fast iteration. When the workflow is application-centric rather than cross-service infrastructure glue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Step Functions&lt;/strong&gt; when you orchestrate multiple AWS services without custom code. When non-technical stakeholders need visual workflow visibility. When you want native integrations (DynamoDB, SQS, Bedrock) without Lambda in between. When you need declarative error handling with retry, catch, and fallback patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose MWAA&lt;/strong&gt; when you run complex data pipelines with scheduling, backfills, and SLA monitoring. When your team already knows Airflow and its operator ecosystem. When you need dependency-aware DAGs across dozens of tasks. When you coordinate across AWS and non-AWS systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose a combination&lt;/strong&gt; when the real world demands it. Step Functions for cross-service orchestration with a durable function handling complex logic within a single task. MWAA for scheduling with Step Functions handling individual pipeline steps. Durable functions for core business logic with Step Functions for parallel fan-out.&lt;/p&gt;

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

&lt;p&gt;Lambda durable functions, Step Functions, and MWAA serve different developer preferences and architectural patterns. Durable functions bring orchestration into your application code. Step Functions orchestrates across AWS services visually. MWAA handles complex scheduled data pipelines. They complement each other rather than compete.&lt;/p&gt;

&lt;p&gt;Start by identifying your orchestration pattern. Match it to the service that fits. Combine them when a single service does not cover the full workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Further reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html" rel="noopener noreferrer"&gt;AWS Durable Execution SDK Developer Guide&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/mwaa/latest/userguide/what-is-mwaa.html" rel="noopener noreferrer"&gt;Amazon MWAA User Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/big-data/choosing-the-right-workflow-orchestration-service-for-your-use-case-amazon-mwaa-and-aws-step-functions/" rel="noopener noreferrer"&gt;Choosing the right workflow orchestration service (AWS Big Data Blog)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Questions or a scenario you want me to map? Drop them in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>stepfunctions</category>
      <category>airflow</category>
    </item>
    <item>
      <title>DadOps v1.0: 7 DevOps principles I applied to fatherhood</title>
      <dc:creator>Anwaar Hussain</dc:creator>
      <pubDate>Thu, 18 Jun 2026 16:44:04 +0000</pubDate>
      <link>https://dev.to/awshuss/dadops-v10-7-devops-principles-i-applied-to-fatherhood-da</link>
      <guid>https://dev.to/awshuss/dadops-v10-7-devops-principles-i-applied-to-fatherhood-da</guid>
      <description>&lt;p&gt;Nature has always inspired technology. Birds inspired flight. Ant colonies inspired distributed systems. Neural networks borrowed from the human brain.&lt;/p&gt;

&lt;p&gt;In my case? DevOps principles from 10 years of cloud infrastructure work across multiple organisations in 4 countries inspired me to be a better father.&lt;/p&gt;

&lt;p&gt;7 weeks ago, I supported the most high-risk deployment of my life: Baby v1.0. Mum led the delivery. Instant promotion to DadOps Engineer.&lt;/p&gt;

&lt;p&gt;Week 1 confirmed what I already knew: I am not the lead architect. Mum is. She is the Principal Engineer, Product Owner, and Key Stakeholder. Baby v1.0 has a hard dependency on her. I am the DevOps Engineer making sure the primary region stays healthy.&lt;/p&gt;

&lt;p&gt;One thing they do not tell you: baby has one mode of communication in the initial weeks. Crying. It could mean hunger, wind, nappy, overstimulation, or just "I exist and I am angry about it." The system will not stop alerting until you fix the root cause.&lt;/p&gt;

&lt;p&gt;In this post, I share 7 DadOps principles that a decade of designing resilient cloud systems rewired in my brain. They made me a more intentional, present father.&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%2Fehgy1vs5pifnggm7dvqo.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%2Fehgy1vs5pifnggm7dvqo.png" alt=" " width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  DadOps Principle #1: Culture of collaboration — align with your stakeholder
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps says:&lt;/strong&gt; Map stakeholders before you design. Build without the product owner and you build the wrong thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DadOps says:&lt;/strong&gt; Week 1 mistake. I thought my job was to "support." Wrong framing.&lt;/p&gt;

&lt;p&gt;Mum carried Baby v1.0 for 9 months, delivered her, and runs the primary region: feeding, recovery, bonding. Baby has a physical dependency on Mum that I cannot replicate. She is the database. I am cache.&lt;/p&gt;

&lt;p&gt;The shift: replace "How can I support?" with "What does the stakeholder need to succeed?" That single question changed every decision I made.&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Takeaway:&lt;/strong&gt; Collaboration starts with understanding who owns what. Align with the stakeholder. Execute their vision, not yours.&lt;/p&gt;




&lt;h2&gt;
  
  
  DadOps Principle #2: Continuous monitoring — observe the system AND the operator
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps says:&lt;/strong&gt; Monitor CPU, memory, error rates. But also monitor the engineers running the system. Burned-out on-call engineers cause system failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DadOps says:&lt;/strong&gt; Week 2, I tracked Baby metrics religiously: feeds, nappies, sleep. All green. But Mum metrics were red: sleep debt, recovery time, mental load. I was monitoring the service but ignoring the operator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DadOps fix, added "Mum observability":&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Sleep metric:&lt;/em&gt; Last 3+ hour uninterrupted stretch?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Capacity metric:&lt;/em&gt; How many requests has she handled today?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Recovery metric:&lt;/em&gt; Post-birth healing is a long-running job, not a sprint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a husband, this matters as much as being a good dad. If the operator fails, the service fails.&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Takeaway:&lt;/strong&gt; Monitor the people running the system, not just the system itself. Stakeholder health is your most critical metric.&lt;/p&gt;




&lt;h2&gt;
  
  
  DadOps Principle #3: Automate everything — remove toil so the stakeholder can focus
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps says:&lt;/strong&gt; Remove undifferentiated heavy lifting. Use managed services so engineers focus on what matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DadOps says:&lt;/strong&gt; Mum's "what matters" = feeding, recovery, bonding. My job = remove everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My toil-reduction backlog:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cooking:&lt;/strong&gt; She should not spend compute cycles on meals. I own meal prep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaning:&lt;/strong&gt; Dishes, laundry, floors = cognitive load. I own them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Night shifts:&lt;/strong&gt; I agreed with Mum that I need my sleep between 10pm and 2am as I am a heavy sleeper during those hours. Besides that, I support her in everything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pram and car seat:&lt;/strong&gt; Assembled, tested, and loaded in the car. Ready to deploy at a moment's notice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But toil removal is not just chores. It is also offloading Mum physically and mentally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contact naps from Day 1:&lt;/strong&gt; Baby sleeping on Dad's chest builds bond and gives Mum a break. Non-negotiable from the start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Singing and humming:&lt;/strong&gt; Learn a few tunes. When Mum needs a break, a calm hum from Dad can settle baby just as well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Park walks from Day 2:&lt;/strong&gt; Against popular opinion, my wife encouraged me to get out early. Slinging baby to my chest for a walk or a quick grocery run gave Mum uninterrupted recovery time. Between weeks 6 to 8, those walks became the fastest way to soothe hysterical crying. Fresh air helps Mum recover too. Sometimes the best automation is just stepping outside.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎯 &lt;strong&gt;Takeaway:&lt;/strong&gt; Good DevOps engineers remove toil. Good dads remove toil from Mum. If she is washing bottles at 2am, I failed my SLA.&lt;/p&gt;




&lt;h2&gt;
  
  
  DadOps Principle #4: Shift-left — prepare before production
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps says:&lt;/strong&gt; Test early. Catch issues before they reach production. Security, quality, and validation shift left into the earliest stages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DadOps says:&lt;/strong&gt; We assembled the cot, tested the car seat, packed the hospital bag, and set up the bottle station. All before the deployment date.&lt;/p&gt;

&lt;p&gt;One thing I did not practice: nappy changes. Learned that live in production. Tip I picked up fast: keep the wipes warm. A cold wipe on a sleeping baby is like a failed deployment that wakes up the entire system.&lt;/p&gt;

&lt;p&gt;Teams that scramble after go-live skipped shift-left. Same applies here. If you are assembling the cot while your wife is in labour, you skipped testing.&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Takeaway:&lt;/strong&gt; Preparation is not optional. Shift-left means fewer incidents in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  DadOps Principle #5: CI/CD — small, frequent iterations beat big-bang deployments
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps says:&lt;/strong&gt; Deploy small changes frequently. Each one is low-risk. Batch everything into one massive release and you invite failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DadOps says:&lt;/strong&gt; The newborn cycle is a continuous loop: feed, burp, nappy change, sleep, repeat. Every 2-3 hours. No sprint planning. No backlog grooming. Just continuous delivery on a fixed cadence.&lt;/p&gt;

&lt;p&gt;Skip three feeds and batch them? That is a big-bang deployment. It will fail. Loudly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 6 growth spurt = unexpected traffic spike.&lt;/strong&gt; Feeding frequency doubled overnight. No warning. No change request. The fix: stop fighting it. Scale with demand. This is expected behaviour, per the documentation I did not read.&lt;/p&gt;

&lt;p&gt;One more thing: keep cool when baby is crying. Panic is contagious. If you stay calm, baby reads that signal. Treat it like a production alert. Acknowledge, assess, act. Do not escalate your own stress into the system.&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Takeaway:&lt;/strong&gt; Continuous delivery of care. Small, frequent, low-risk. Big-bang parenting causes outages (screaming).&lt;/p&gt;




&lt;h2&gt;
  
  
  DadOps Principle #6: Version control and IaC — document everything, make it reproducible
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps says:&lt;/strong&gt; Infrastructure as Code means anyone can deploy the system. No tribal knowledge. No "only Dave knows how to do this."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DadOps says:&lt;/strong&gt; I documented everything so my wife, grandparent, or visitor can operate independently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feeding instructions and schedule&lt;/li&gt;
&lt;li&gt;Nap routine and white noise settings&lt;/li&gt;
&lt;li&gt;Burping positions that work (4 tested, 2 reliable)&lt;/li&gt;
&lt;li&gt;The tummy-on-arm hold that calms her in seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the routine lives only in your head, you are a single point of failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I earned trust:&lt;/strong&gt; Shared a "DadOps Runbook" with positions that work, cry patterns, and escalation paths. Execute Mum's decisions exactly. No "but I saw on TikTok…" Handle cooking and cleaning without raising tickets. Status updates: "Incident resolved. Stakeholder can sleep 2 more hours."&lt;/p&gt;

&lt;p&gt;Week 3: Mum was in every incident. Week 7: Mum sleeps while I handle wake-ups. She trusts the runbook.&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Takeaway:&lt;/strong&gt; Document your routines. Version them. Boring ops = trusted DevOps engineer. Trust = stakeholder does not have to think about you.&lt;/p&gt;




&lt;h2&gt;
  
  
  DadOps Principle #7: Feedback loops and continuous improvement — iterate, do not stagnate
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps says:&lt;/strong&gt; Use operational data, incident reviews, and user feedback to drive the next iteration. Blameless post-mortems focus on systemic fixes, not blame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DadOps says:&lt;/strong&gt; Bad night? Do not blame each other. Run a blameless retro.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"What happened?"&lt;/em&gt; She woke every 45 minutes.&lt;br&gt;
&lt;em&gt;"Why?"&lt;/em&gt; Likely a growth spurt. Possibly overtired from a short nap day.&lt;br&gt;
&lt;em&gt;"What do we change?"&lt;/em&gt; Earlier bedtime tomorrow. Extra feed before the long stretch.&lt;/p&gt;

&lt;p&gt;No blame. No "you should have done X." Data, root cause, action items.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cornwall road trip, a real-world deployment test.&lt;/strong&gt; Last-minute decision to freshen up the family with a 2-day trip to Cornwall. Day 1: Baby screamed in the car seat. Like a failed data transfer. Day 2: She settled. By the end of the trip, she was comfortable. The feedback loop worked. We iterated on positioning, timing stops around feeds, and white noise in the car. Each journey got smoother.&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Takeaway:&lt;/strong&gt; Iterate based on data, not emotion. Blameless retros strengthen the team. Every failed deployment teaches you something for the next one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is next: DadOps Roadmap v1.1
&lt;/h2&gt;

&lt;p&gt;Vaccinations start week 8. Side effects are documented. I am prepping the runbook: pain relief dosage, temperature monitoring, comfort positions. Shift-left applies here too. Prepare before the incident, not during it.&lt;/p&gt;

&lt;p&gt;Growth spurts will keep coming, faster and less predictable. The system scales whether you are ready or not.&lt;/p&gt;

&lt;p&gt;The biggest shift ahead: Baby's dependency on Mum will reduce over the coming months. Weaning, solids, mobility. New services to deploy. Dad moves from DevOps Engineer to Co-Architect. Shared ownership increases. Responsibility scales with the system.&lt;/p&gt;

&lt;p&gt;I am ready. DevOps taught me how.&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%2F1wpapgp8izh6dyh2um0z.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%2F1wpapgp8izh6dyh2um0z.png" alt=" " width="800" height="802"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;In this post, I showed how 7 DevOps principles (collaboration, monitoring, automation, shift-left, CI/CD, version control, and feedback loops) apply directly to fatherhood.&lt;/p&gt;

&lt;p&gt;Nature inspires science. DevOps inspired me to be a better dad.&lt;/p&gt;

&lt;p&gt;The most important lesson: do not try to be the primary region. Be the DevOps engineer that keeps the primary region healthy.&lt;/p&gt;

&lt;p&gt;To new dads in tech: you already know this job. You know on-call, incidents, stakeholders, capacity planning. DadOps is just a new stack with worse documentation and a non-negotiable SLA.&lt;/p&gt;

&lt;p&gt;Now if you will excuse me, my key stakeholder just raised a Severity 1 alert: &lt;code&gt;HTTP 418 I'm a teapot&lt;/code&gt; = I am hungry. Time to execute the runbook. 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dads in tech: what is your #1 DadOps lesson? Drop it below. Let us write the docs no one gave us.&lt;/em&gt; 💙&lt;/p&gt;

</description>
      <category>devops</category>
      <category>dadops</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>DevOps to MLOps: Treat the ML Model as Your New Workload</title>
      <dc:creator>Anwaar Hussain</dc:creator>
      <pubDate>Fri, 05 Jun 2026 13:58:10 +0000</pubDate>
      <link>https://dev.to/awshuss/devops-to-mlops-treat-the-model-as-your-new-workload-b79</link>
      <guid>https://dev.to/awshuss/devops-to-mlops-treat-the-model-as-your-new-workload-b79</guid>
      <description>&lt;p&gt;&lt;em&gt;This post references AWS services, frameworks, and tools to explain the Machine Learning Operations (MLOps) concepts. The principles apply to any cloud platform, orchestration tool, or ML service. Swap them with your preferred solutions; the pipeline discipline remains the same. Note that a foundational understanding of ML models is a prerequisite to MLOps, but you can build it in parallel while applying your existing Continuous Integration/Continuous Deployment (CI/CD) skills.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I recently completed an internal AWS program focused on MLOps, and the biggest takeaway was this: if you already know DevOps, you already know most of MLOps.&lt;/p&gt;

&lt;p&gt;DevOps engineers building CI/CD pipelines for Infrastructure as Code (IaC), microservices, and serverless applications already have 80% of the skills needed for MLOps. The fundamentals of code versioning, continuous integration, continuous deployment, testing, deployment strategies, monitoring, and rollback all apply directly.&lt;/p&gt;

&lt;p&gt;The difference? Your workload changed. Instead of deploying application code or infrastructure templates, you are deploying a trained model. The pipeline stages stay the same. The artifacts passing through them are different.&lt;/p&gt;

&lt;p&gt;In this post, you will learn how DevOps pipeline concepts map to MLOps, what new considerations come with ML workloads, and how to structure your first ML pipeline using the tools you already know.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mental model: your workload changed, not your pipeline
&lt;/h2&gt;

&lt;p&gt;In DevOps, your workload is application code, a container image, or a CloudFormation template. You version it, test it, deploy it, monitor it, and roll it back when something breaks.&lt;/p&gt;

&lt;p&gt;In MLOps, your workload is the model. A model is the output of training code + training data + hyperparameters. It produces an artifact (a serialised file) that you deploy to an endpoint for inference.&lt;/p&gt;

&lt;p&gt;Everything else stays the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You version the model artifact the same way you version a container image.&lt;/li&gt;
&lt;li&gt;You test the model the same way you run integration tests on a microservice.&lt;/li&gt;
&lt;li&gt;You deploy the model the same way you deploy a Lambda function through stages.&lt;/li&gt;
&lt;li&gt;You monitor the model the same way you monitor API latency and error rates.&lt;/li&gt;
&lt;li&gt;You roll back the model the same way you roll back an API Gateway deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pipeline is familiar. The workload inside it is new.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repository structure: organising your ML workload
&lt;/h2&gt;

&lt;p&gt;In DevOps, you separate &lt;code&gt;src/&lt;/code&gt; from &lt;code&gt;infra/&lt;/code&gt; from &lt;code&gt;pipeline/&lt;/code&gt;. The same principle applies in MLOps. You add a &lt;code&gt;model/&lt;/code&gt; directory. This is your new workload.&lt;/p&gt;

&lt;p&gt;A consistent structure lets your CI/CD pipeline know exactly where to find training scripts, inference code, tests, and dependencies. No guessing, no hardcoded paths. Here is a generic ML repository layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ml-project/
├── model/
│   ├── train/
│   │   ├── Dockerfile               # Training container definition
│   │   ├── train.py                 # Training entry point
│   │   ├── preprocessing.py         # Feature engineering
│   │   └── requirements.txt         # Training dependencies
│   ├── inference/
│   │   ├── Dockerfile               # Inference container definition
│   │   ├── serve.py                 # Inference entry point
│   │   ├── predictor.py            # Prediction logic
│   │   └── requirements.txt        # Inference dependencies (lighter)
│   ├── tests/
│   │   ├── test_model_quality.py    # Accuracy, precision, recall
│   │   ├── test_bias.py            # Fairness metrics
│   │   └── test_data_quality.py    # Input validation
│   └── config/
│       ├── hyperparameters.json     # Training hyperparameters
│       └── baseline.json            # Model Monitor baseline
├── infra/
│   ├── lib/                         # AWS Cloud Development Kit (CDK) or CloudFormation stacks
│   └── config/                      # Environment-specific config
├── pipeline/
│   └── buildspec/                   # One buildspec per CI/CD stage
├── monitoring/
│   ├── baselines/                   # Drift detection baselines
│   └── alarms/                      # CloudWatch alarm definitions
├── docs/
│   └── architecture.png
├── README.md
└── .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is why this structure works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;model/train/ and model/inference/ are separated.&lt;/strong&gt; Different dependencies, different containers, different lifecycle. Training runs once or on a schedule. Inference runs continuously. Keeping them separate means your inference container stays lightweight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;model/tests/ lives next to model code.&lt;/strong&gt; Your CI pipeline runs model quality tests the same way it runs unit tests for application code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;model/config/ is versioned alongside the model.&lt;/strong&gt; When you retrain, hyperparameters and baselines change together. Git tracks both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pipeline/buildspec/ has one spec per stage.&lt;/strong&gt; Same pattern as your existing &lt;a href="https://aws.amazon.com/codebuild/" rel="noopener noreferrer"&gt;AWS CodeBuild&lt;/a&gt; projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/sagemaker/" rel="noopener noreferrer"&gt;Amazon SageMaker&lt;/a&gt; expects &lt;code&gt;/opt/ml/model/&lt;/code&gt; for artifacts and &lt;code&gt;/opt/ml/code/&lt;/code&gt; for scripts in custom containers. Each Dockerfile lives inside its respective directory (&lt;code&gt;model/train/&lt;/code&gt; and &lt;code&gt;model/inference/&lt;/code&gt;). Since the inference code maps directly to &lt;code&gt;/opt/ml/code/&lt;/code&gt;, the &lt;code&gt;COPY&lt;/code&gt; instruction is a one-liner. No path gymnastics.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;model/&lt;/code&gt; directory is to MLOps what &lt;code&gt;src/&lt;/code&gt; is to application development. It has source code, tests, dependencies, and config. Treat it the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stays the same
&lt;/h2&gt;

&lt;p&gt;The core DevOps pipeline stages transfer directly to MLOps. Here is how each one maps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code versioning
&lt;/h3&gt;

&lt;p&gt;You already version application code in Git. In MLOps, you version the same way but add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Training code (your &lt;code&gt;model/train/&lt;/code&gt; directory)&lt;/li&gt;
&lt;li&gt;Hyperparameters (JSON config files)&lt;/li&gt;
&lt;li&gt;Data versions (using tools like Data Version Control (DVC) or SageMaker Experiments)&lt;/li&gt;
&lt;li&gt;Model artifacts (tracked in SageMaker Model Registry)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The principle is identical. If you cannot reproduce it, you cannot trust it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous integration
&lt;/h3&gt;

&lt;p&gt;Your existing CI runs linting, unit tests, and contract tests on every pull request. In MLOps, you add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schema validation (linting your API spec with tools like Spectral)&lt;/li&gt;
&lt;li&gt;Model quality tests (accuracy, precision, recall against a baseline)&lt;/li&gt;
&lt;li&gt;Data quality checks (input validation, missing values, type mismatches)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pipeline still fails fast on the first broken test. The tests are different, not the pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous deployment and delivery
&lt;/h3&gt;

&lt;p&gt;You already deploy through stages: dev, staging, production. In MLOps, the same pattern applies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy model to staging endpoint&lt;/li&gt;
&lt;li&gt;Run integration tests against staging&lt;/li&gt;
&lt;li&gt;Approval gate (manual or automated)&lt;/li&gt;
&lt;li&gt;Deploy to production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/codepipeline/" rel="noopener noreferrer"&gt;AWS CodePipeline&lt;/a&gt; orchestrates this the same way it orchestrates your IaC deployments. The target changes from an &lt;a href="https://aws.amazon.com/cloudformation/" rel="noopener noreferrer"&gt;AWS CloudFormation&lt;/a&gt; stack to a SageMaker endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;p&gt;Your testing pyramid still applies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unit tests: Does the training script run without errors?&lt;/li&gt;
&lt;li&gt;Integration tests: Does the deployed endpoint return valid responses?&lt;/li&gt;
&lt;li&gt;Contract tests: Does the model output match the expected schema?&lt;/li&gt;
&lt;li&gt;Performance tests: Does inference latency meet Service Level Agreement (SLA) requirements?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You add model-specific tests: accuracy thresholds, bias checks, and drift baselines. The testing philosophy (fail fast, test early, automate everything) stays the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment strategies
&lt;/h3&gt;

&lt;p&gt;Blue/green and canary deployments work the same way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blue/green.&lt;/strong&gt; Deploy new model version to a separate endpoint. Switch traffic atomically. Roll back instantly if metrics degrade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canary.&lt;/strong&gt; Route 10% of traffic to the new model. Monitor prediction quality. Gradually increase to 100%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shadow.&lt;/strong&gt; Send production traffic to both old and new models. Compare outputs without affecting users. This is unique to ML but follows the same traffic-splitting principle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other strategies like Linear (gradually shifting traffic in equal increments over time) also apply. The choice depends on your risk tolerance and rollback speed requirements.&lt;/p&gt;

&lt;p&gt;SageMaker production variants handle traffic splitting between model versions natively. Same concept as weighted target groups, different workload.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring and feedback
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/cloudwatch/" rel="noopener noreferrer"&gt;Amazon CloudWatch&lt;/a&gt; metrics, alarms, and dashboards work the same way. You monitor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invocation count, latency, error rates (same as any API)&lt;/li&gt;
&lt;li&gt;Model-specific metrics: prediction distribution, confidence scores, feature drift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/xray/" rel="noopener noreferrer"&gt;AWS X-Ray&lt;/a&gt; traces requests end-to-end the same way it traces your microservices. The difference is you also trace which model version served each prediction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rollback
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/api-gateway/" rel="noopener noreferrer"&gt;Amazon API Gateway&lt;/a&gt; deployment history and SageMaker endpoint rollback work the same way as rolling back an &lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt; function or &lt;a href="https://aws.amazon.com/ecs/" rel="noopener noreferrer"&gt;Amazon Elastic Container Service (Amazon ECS)&lt;/a&gt; service. You point traffic back to the previous version.&lt;/p&gt;

&lt;p&gt;The difference in MLOps: rollback is not just operational, it is regulatory. More on this in the rollback section below.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is new for you
&lt;/h2&gt;

&lt;p&gt;These are the ML-specific concepts that do not have a direct DevOps equivalent. They extend your pipeline rather than replace it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model training
&lt;/h3&gt;

&lt;p&gt;Think of training as your "build" step, but for data. Instead of compiling code into a binary, you feed data through an algorithm to produce a model artifact.&lt;/p&gt;

&lt;p&gt;SageMaker Training Jobs handle this on managed compute. You specify the training script, input data location (&lt;a href="https://aws.amazon.com/s3/" rel="noopener noreferrer"&gt;Amazon Simple Storage Service (Amazon S3)&lt;/a&gt;), instance type, and hyperparameters. SageMaker provisions the infrastructure, runs training, and stores the output artifact in S3.&lt;/p&gt;

&lt;p&gt;The key difference from a code build: training can take minutes to days depending on data size and model complexity. This is why caching matters more in MLOps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model testing
&lt;/h3&gt;

&lt;p&gt;In application development, "does it run" is a valid first test. In ML, a model can run perfectly and still produce wrong results.&lt;/p&gt;

&lt;p&gt;Model testing validates performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accuracy: Does the model predict correctly above a threshold?&lt;/li&gt;
&lt;li&gt;Precision and recall: Does it balance false positives and false negatives?&lt;/li&gt;
&lt;li&gt;Bias: Does it treat different groups fairly?&lt;/li&gt;
&lt;li&gt;Robustness: Does it handle edge cases without failing silently?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You run these tests in CI the same way you run integration tests. If accuracy drops below baseline, the pipeline fails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fine-tuning
&lt;/h3&gt;

&lt;p&gt;Fine-tuning is iterative improvement of an existing model using new or domain-specific data. Think of it as patching, but with data instead of code.&lt;/p&gt;

&lt;p&gt;You take a pre-trained model, feed it additional data, and produce an updated artifact. The pipeline stages (test, validate, deploy) remain the same. The input changes from code to data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model monitoring (drift detection)
&lt;/h3&gt;

&lt;p&gt;This is the biggest difference from traditional DevOps. Application code does not degrade over time. Models do.&lt;/p&gt;

&lt;p&gt;Model drift happens when the real-world data distribution changes from what the model was trained on. The model still runs, still returns responses, but the quality of those responses degrades silently.&lt;/p&gt;

&lt;p&gt;SageMaker Model Monitor continuously evaluates live inference data against a training baseline. It detects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data quality drift: Input features change shape or distribution.&lt;/li&gt;
&lt;li&gt;Model quality drift: Accuracy, precision, or recall drops below threshold.&lt;/li&gt;
&lt;li&gt;Bias drift: Fairness metrics shift post-deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When drift is detected, Model Monitor fires an &lt;a href="https://aws.amazon.com/eventbridge/" rel="noopener noreferrer"&gt;Amazon EventBridge&lt;/a&gt; event. You can trigger an alarm, notify the team, or initiate automated rollback.&lt;/p&gt;

&lt;p&gt;In DevOps terms: Model Monitor is your health check, but for prediction quality rather than uptime.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevOps vs MLOps pipeline: the parallel
&lt;/h2&gt;

&lt;p&gt;The following diagram shows how every DevOps pipeline stage has a direct MLOps equivalent. The workload passing through the pipeline changed. The pipeline structure did not.&lt;/p&gt;

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

&lt;p&gt;The left side is your world today. The right side is MLOps. Notice how every stage has a direct equivalent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caching: why it matters more in MLOps
&lt;/h2&gt;

&lt;p&gt;In DevOps, a failed build takes seconds to minutes to re-run. In MLOps, a failed training job can waste hours or days of compute. Caching between pipeline stages becomes critical for cost and speed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model artifacts in S3.&lt;/strong&gt; Once training completes, store the artifact in a versioned S3 bucket. If deployment fails, you do not retrain. You redeploy the cached artifact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature Store.&lt;/strong&gt; Engineered features are expensive to compute. &lt;a href="https://aws.amazon.com/sagemaker/feature-store/" rel="noopener noreferrer"&gt;Amazon SageMaker Feature Store&lt;/a&gt; caches them for reuse across training and inference. This avoids recomputing the same transformations repeatedly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version resolution cache.&lt;/strong&gt; At inference time, resolving which model version to invoke on every request adds latency. A caching layer (such as &lt;a href="https://aws.amazon.com/dynamodb/" rel="noopener noreferrer"&gt;Amazon DynamoDB&lt;/a&gt; with &lt;a href="https://aws.amazon.com/dynamodb/dax/" rel="noopener noreferrer"&gt;DynamoDB Accelerator (DAX)&lt;/a&gt;) resolves version mappings in microseconds rather than milliseconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container images.&lt;/strong&gt; Cache your training and inference container images in &lt;a href="https://aws.amazon.com/ecr/" rel="noopener noreferrer"&gt;Amazon Elastic Container Registry (Amazon ECR)&lt;/a&gt;. Rebuilding containers for every pipeline run wastes time when only the model artifact changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In DevOps, you cache dependencies (node_modules, pip packages). In MLOps, you cache everything above plus the model itself. The cost of recomputation is orders of magnitude higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rollback: why it is non-negotiable in AI/ML
&lt;/h2&gt;

&lt;p&gt;In traditional DevOps, rollback is an operational best practice. In MLOps, it is a regulatory requirement. Regulators are paying attention to AI failures and the penalties are significant.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI incidents hit a record 362 in 2025, up from 233 in 2024 (&lt;a href="https://hai.stanford.edu/ai-index/2026-ai-index-report/responsible-ai" rel="noopener noreferrer"&gt;Stanford HAI AI Index 2026&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The EU AI Act imposes fines up to EUR 35M or 7% of global revenue for non-compliant AI systems (&lt;a href="https://www.euaiact.com/key-issue/1" rel="noopener noreferrer"&gt;Lawfare Analysis&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The Consumer Financial Protection Bureau (CFPB) fined Goldman Sachs $65M for algorithmic failures in Apple Card (&lt;a href="https://www.consumerfinance.gov/enforcement/actions/apple-inc/" rel="noopener noreferrer"&gt;CFPB Enforcement Action&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The Equal Employment Opportunity Commission (EEOC) fined iTutorGroup $365K for age-based algorithmic discrimination (&lt;a href="https://www.eeoc.gov/newsroom/itutorgroup-pay-365000-settle-eeoc-discriminatory-hiring-suit" rel="noopener noreferrer"&gt;EEOC Press Release&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Gartner predicts 40%+ of agentic AI projects will be cancelled by 2027 due to inadequate risk controls (&lt;a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027" rel="noopener noreferrer"&gt;Gartner Press Release&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your rollback strategy needs to answer three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;How fast can you roll back?&lt;/strong&gt; Target sub-5-minute recovery. API Gateway deployment history and SageMaker endpoint variants support instant traffic switching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can you prove which model served which prediction?&lt;/strong&gt; Regulators require traceability. Log model version metadata with every inference request using structured CloudWatch Logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is your audit trail immutable?&lt;/strong&gt; Use &lt;a href="https://aws.amazon.com/cloudtrail/" rel="noopener noreferrer"&gt;AWS CloudTrail&lt;/a&gt; with immutable logging. No one can tamper with the evidence after the fact.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In DevOps, rollback prevents downtime. In MLOps, rollback prevents fines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started: your first MLOps pipeline on AWS
&lt;/h2&gt;

&lt;p&gt;You do not need to learn a new orchestration tool or CI/CD platform. Start with what you know and extend your existing pipeline with ML-specific stages.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CodePipeline&lt;/strong&gt; orchestrates the pipeline. Same service, same console, same execution flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeBuild&lt;/strong&gt; runs each stage. Add a training buildspec that calls SageMaker Training Jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S3&lt;/strong&gt; stores model artifacts. Same versioned bucket pattern you use for CloudFormation templates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SageMaker Model Registry&lt;/strong&gt; tracks model versions. Think of it as ECR for models instead of containers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SageMaker Endpoints&lt;/strong&gt; serve inference. Think of it as a managed ECS service for your model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SageMaker Model Monitor&lt;/strong&gt; watches for drift. Think of it as CloudWatch alarms for prediction quality.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is what a training stage buildspec looks like. If you have written a buildspec manifest for compiling code, this structure is familiar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pipeline/buildspec/train.yml&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;

&lt;span class="na"&gt;phases&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runtime-versions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;python&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3.11&lt;/span&gt;
  &lt;span class="na"&gt;pre_build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Validating training config..."&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;python -m pytest model/tests/test_data_quality.py&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Starting SageMaker Training Job..."&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;python model/train/train.py&lt;/span&gt;
        &lt;span class="s"&gt;--config model/config/hyperparameters.json&lt;/span&gt;
        &lt;span class="s"&gt;--output s3://${ARTIFACT_BUCKET}/models/${CODEBUILD_RESOLVED_SOURCE_VERSION}/&lt;/span&gt;
  &lt;span class="na"&gt;post_build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Registering model in Model Registry..."&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;aws sagemaker create-model-package&lt;/span&gt;
        &lt;span class="s"&gt;--model-package-group-name ${MODEL_PACKAGE_GROUP}&lt;/span&gt;
        &lt;span class="s"&gt;--inference-specification file://model/inference/spec.json&lt;/span&gt;
        &lt;span class="s"&gt;--model-approval-status PendingManualApproval&lt;/span&gt;

&lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;model/config/hyperparameters.json&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;model/inference/spec.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/devops-pipeline-accelerator/introduction.html" rel="noopener noreferrer"&gt;AWS Prescriptive Guidance: DevOps Pipeline Accelerator&lt;/a&gt; provides a reference architecture for CI/CD pipelines. The same patterns (source, build, test, deploy, monitor) apply directly to MLOps.&lt;/p&gt;

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

&lt;p&gt;In this post, we showed how DevOps pipeline fundamentals apply directly to MLOps. Code versioning, continuous integration, continuous deployment, testing, deployment strategies, monitoring, and rollback all transfer to the ML space.&lt;/p&gt;

&lt;p&gt;The model is your new workload. Version it, test it, deploy it, monitor it, roll it back. The pipeline structure stays the same. What passes through it changes.&lt;/p&gt;

&lt;p&gt;Start with your existing pipeline. Add model training as a build step, model quality tests as integration tests, Model Registry as your artifact store, and Model Monitor as your health check. You already know how to do this. The workload is different. The discipline is the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/machine-learning/mlops-foundation-roadmap-for-enterprises-with-amazon-sagemaker/" rel="noopener noreferrer"&gt;MLOps Foundation Roadmap for Enterprises with Amazon SageMaker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/wellarchitected/latest/machine-learning-lens/well-architected-machine-learning.html" rel="noopener noreferrer"&gt;AWS Well-Architected Machine Learning Lens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html" rel="noopener noreferrer"&gt;Amazon SageMaker Model Monitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/machine-learning/multi-account-model-deployment-with-amazon-sagemaker-pipelines/" rel="noopener noreferrer"&gt;Multi-Account Model Deployment with Amazon SageMaker Pipelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Time to ship. Your first model is waiting.&lt;/em&gt; 🚀&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>mlops</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>AIP-C01 last-minute revision: exam traps, memory hooks, and quick notes</title>
      <dc:creator>Anwaar Hussain</dc:creator>
      <pubDate>Fri, 01 May 2026 15:22:37 +0000</pubDate>
      <link>https://dev.to/awshuss/aip-c01-last-minute-revision-exam-traps-memory-hooks-and-quick-notes-1m09</link>
      <guid>https://dev.to/awshuss/aip-c01-last-minute-revision-exam-traps-memory-hooks-and-quick-notes-1m09</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/awshuss/why-aws-certified-genai-developer-stands-apart-from-other-aws-certs-14n"&gt;Part 1&lt;/a&gt;, I explained why the &lt;a href="https://aws.amazon.com/certification/certified-generative-ai-developer-professional/" rel="noopener noreferrer"&gt;AWS Certified Generative AI Developer - Professional&lt;/a&gt; (AIP-C01) certification stands apart from other AWS certifications. This follow-up post is a concise, 30-60 minute pre-exam revision guide covering exam traps, memory hooks, and quick notes across all five domains.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; These notes are a quick revision companion only. They are not a substitute for thorough exam preparation. Always refer to official AWS documentation and the recommended courses listed at the end of this post for comprehensive preparation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Domain 1: Foundation Model Integration, Data Management, and Compliance (31%)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Foundation Models (FMs):&lt;/strong&gt; Large pre-trained transformer models available via &lt;a href="https://aws.amazon.com/bedrock/" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt;: AWS Nova, Claude (Anthropic), Llama (Meta), Amazon Titan (text, embeddings, image), Jurassic-2 (AI21 Labs), Stable Diffusion (Stability AI). Select FMs based on task, latency, cost, and token limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fine-tuning vs RAG:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tuning&lt;/strong&gt; adapts an FM to a specific use case with proprietary training data. Titan, Cohere, and Meta models support fine-tuning via Amazon Bedrock. Text models need labelled prompt-completion pairs; image models need &lt;a href="https://aws.amazon.com/s3/" rel="noopener noreferrer"&gt;Amazon Simple Storage Service (Amazon S3)&lt;/a&gt; paths linked to descriptions. Secure training data with &lt;a href="https://aws.amazon.com/vpc/" rel="noopener noreferrer"&gt;Amazon Virtual Private Cloud (Amazon VPC)&lt;/a&gt; + &lt;a href="https://aws.amazon.com/privatelink/" rel="noopener noreferrer"&gt;AWS PrivateLink&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG&lt;/strong&gt; provides dynamic, up-to-date knowledge through vector stores (&lt;a href="https://aws.amazon.com/opensearch-service/features/serverless/" rel="noopener noreferrer"&gt;Amazon OpenSearch Serverless&lt;/a&gt;, &lt;a href="https://aws.amazon.com/rds/aurora/" rel="noopener noreferrer"&gt;Amazon Aurora&lt;/a&gt; pgvector, &lt;a href="https://aws.amazon.com/memorydb/" rel="noopener noreferrer"&gt;Amazon MemoryDB&lt;/a&gt;, &lt;a href="https://aws.amazon.com/elasticache/" rel="noopener noreferrer"&gt;Amazon ElastiCache&lt;/a&gt;, MongoDB Atlas, Pinecone, Redis Enterprise Cloud).&lt;/li&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Fine-tune = "teach the model new tricks"; RAG = "give the model a cheat sheet"&lt;/li&gt;
&lt;li&gt;⚠️ &lt;em&gt;Exam Trap:&lt;/em&gt; Fine-tune for style/tone changes; RAG for dynamic, up-to-date knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;LoRA Adapters:&lt;/strong&gt; Lightweight fine-tuning technique. &lt;a href="https://aws.amazon.com/sagemaker/ai/?trk=e61dfee9-6d19-4aa1-b61f-2f170a2adb07&amp;amp;sc_channel=ps" rel="noopener noreferrer"&gt;Amazon SageMaker AI&lt;/a&gt; Model Registry stores adapter versions with rollback strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chunking Strategies:&lt;/strong&gt; Fixed-size, Hierarchical (smaller child chunks for precision, larger parent chunks for context), Semantic (FM-based, breaks content by meaning not length). Chunk size affects retrieval precision vs context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hybrid Search:&lt;/strong&gt; Combines keyword search + vector search. Amazon Bedrock reranker models re-score results for improved relevance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query Expansion and Decomposition:&lt;/strong&gt; Amazon Bedrock query expansion broadens search; &lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt; query decomposition breaks complex queries into sub-queries; &lt;a href="https://aws.amazon.com/step-functions/" rel="noopener noreferrer"&gt;AWS Step Functions&lt;/a&gt; orchestrates multi-step retrieval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Embedding Models:&lt;/strong&gt; Amazon Titan Embeddings, Cohere Embed. Match embedding model to vector store dimensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vector Store Optimization:&lt;/strong&gt; Binary vectors (32x compression vs float32), FP16 (16-bit scalar quantization for HNSW). &lt;a href="https://aws.amazon.com/opensearch-service/" rel="noopener noreferrer"&gt;Amazon OpenSearch Service&lt;/a&gt; Hierarchical Indices route queries from small fast top-level index to detailed domain-specific indices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt Engineering:&lt;/strong&gt; Prompt = Instructions + Context + Input data + Output indicator. Few-shot prompting (examples of desired outputs). Chain of Thought (CoT) forces step-by-step reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt Caching:&lt;/strong&gt; Reuse previously processed prompts to reduce cost and latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/bedrock/prompt-management/" rel="noopener noreferrer"&gt;Amazon Bedrock Prompt Management&lt;/a&gt;:&lt;/strong&gt; Create, evaluate, version, and share prompts across teams. Supports variables in reusable templates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Governance:&lt;/strong&gt; Data residency, encryption at rest (&lt;a href="https://aws.amazon.com/kms/" rel="noopener noreferrer"&gt;AWS Key Management Service (AWS KMS)&lt;/a&gt;), encryption in transit (Transport Layer Security (TLS) 1.2+).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/bedrock/bda/" rel="noopener noreferrer"&gt;Amazon Bedrock Data Automation (BDA)&lt;/a&gt;:&lt;/strong&gt; Extracts structured data from multimodal inputs (documents, images, videos, audio). Uses Blueprints to specify extraction fields. Output: JSON, CSV, markdown, HTML.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; BDA = "Swiss Army knife for document processing"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/transcribe/" rel="noopener noreferrer"&gt;Amazon Transcribe&lt;/a&gt;:&lt;/strong&gt; Speech-to-text with PII redaction, automatic language identification, custom vocabularies, and ML-powered toxicity detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bedrock Cross-Region Inference:&lt;/strong&gt; Provides resilient FM deployments across regions for fault tolerance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain 2: Implementation and Integration (26%)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bedrock Agents:&lt;/strong&gt; Action Groups (Lambda functions) + Knowledge Bases + Prompt Templates + Session Management. Action Groups rely on OpenAPI (Swagger) schema uploaded to Amazon S3.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Agent = "Brain (FM) + Hands (Action Groups) + Memory (Knowledge Bases)"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Model Context Protocol (MCP):&lt;/strong&gt; Standardised interface (JSON-RPC 2.0 over HTTP or stdio) for agent-tool interactions. MCP servers via Lambda (stateless) or &lt;a href="https://aws.amazon.com/ecs/" rel="noopener noreferrer"&gt;Amazon Elastic Container Service (Amazon ECS)&lt;/a&gt; (complex tools).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; MCP = "USB-C for AI agents, one plug fits all tools"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Agent Frameworks:&lt;/strong&gt; &lt;a href="https://strandsagents.com/latest/" rel="noopener noreferrer"&gt;Strands Agents&lt;/a&gt;, AWS Agent Squad, &lt;a href="https://aws.amazon.com/bedrock/agentcore/" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore&lt;/a&gt; for autonomous systems with memory and state management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Memory:&lt;/strong&gt; Short-term (chat history via Sessions and Events). Long-term (extracted insights, user preferences stored as Memory Records). AgentCore Memory provides scalable, serverless storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Agent Workflows:&lt;/strong&gt; Orchestrator delegates subtasks to worker LLMs, Synthesizer combines results. Chain of Sequence (sequential) or Parallelisation (concurrent execution, voting).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Multi-agent = "assembly line with a foreman (orchestrator) and workers"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/bedrock/flows/" rel="noopener noreferrer"&gt;Amazon Bedrock Flows&lt;/a&gt;:&lt;/strong&gt; Multi-step workflow orchestration with visual builder or JSON. Chain models, prompts, and conditions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sync vs Async Inference:&lt;/strong&gt; Sync for real-time (InvokeModel); async for batch/long-running (InvokeModelWithResponseStream). &lt;a href="https://aws.amazon.com/sqs/" rel="noopener noreferrer"&gt;Amazon Simple Queue Service (Amazon SQS)&lt;/a&gt; for async patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step Functions:&lt;/strong&gt; Complex multi-service workflows, human-in-the-loop, error handling, parallel processing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ &lt;em&gt;Exam Trap:&lt;/em&gt; Step Functions for complex orchestration; Bedrock Agents handle simple multi-step tasks automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;API Patterns:&lt;/strong&gt; REST (&lt;a href="https://aws.amazon.com/api-gateway/" rel="noopener noreferrer"&gt;Amazon API Gateway&lt;/a&gt;), GraphQL (&lt;a href="https://aws.amazon.com/appsync/" rel="noopener noreferrer"&gt;AWS AppSync&lt;/a&gt; with real-time subscriptions), WebSockets for streaming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resilience Patterns:&lt;/strong&gt; Exponential Backoff for retries (AWS SDK built-in). Circuit Breaker pattern via Step Functions + &lt;a href="https://aws.amazon.com/dynamodb/" rel="noopener noreferrer"&gt;Amazon DynamoDB&lt;/a&gt;. API Gateway rate limiting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Circuit Breaker = "fuse box that trips before the whole house burns down"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/cdk/" rel="noopener noreferrer"&gt;AWS Cloud Development Kit (AWS CDK)&lt;/a&gt; / &lt;a href="https://aws.amazon.com/cloudformation/" rel="noopener noreferrer"&gt;AWS CloudFormation&lt;/a&gt;:&lt;/strong&gt; IaC for deploying GenAI stacks across environments. One CDK app + Stage construct per environment. Explicit env (account + region) per stack. Separate AWS accounts per environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ &lt;em&gt;Exam Trap:&lt;/em&gt; Omitting env triggers environment-agnostic synthesis, breaking context lookups&lt;/li&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; "One blueprint, multiple construction sites"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Continuous Integration / Continuous Delivery or Deployment (CI/CD) + &lt;a href="https://aws.amazon.com/codedeploy/" rel="noopener noreferrer"&gt;AWS CodeDeploy&lt;/a&gt;:&lt;/strong&gt; Canary, blue/green, rolling deployments for Lambda and compute targets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration and Secrets Management:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html" rel="noopener noreferrer"&gt;AWS Systems Manager Parameter Store&lt;/a&gt;:&lt;/strong&gt; Static config (endpoints, URLs, free at 4 KB)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/secrets-manager/" rel="noopener noreferrer"&gt;AWS Secrets Manager&lt;/a&gt;:&lt;/strong&gt; Credentials with automatic rotation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/systems-manager/features/appconfig/" rel="noopener noreferrer"&gt;AWS AppConfig&lt;/a&gt;:&lt;/strong&gt; Dynamic runtime config without redeployment (feature flags, guardrail thresholds)&lt;/li&gt;
&lt;li&gt;⚠️ &lt;em&gt;Exam Trap:&lt;/em&gt; "rotation" = Secrets Manager. "without redeploying" or "feature flags" = AWS AppConfig&lt;/li&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; "Phone book, vault with auto-lock-change, remote control"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Human-in-the-Loop (HITL):&lt;/strong&gt; AI drafts, human refines. Route uncertain cases based on confidence scores. Collect feedback via API Gateway, store in DynamoDB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Q Family:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/q/developer/" rel="noopener noreferrer"&gt;Amazon Q Developer&lt;/a&gt;:&lt;/strong&gt; Code generation, security scans, IDE extensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/q/business/" rel="noopener noreferrer"&gt;Amazon Q Business&lt;/a&gt;:&lt;/strong&gt; Enterprise GenAI assistant with data connectors (Amazon S3, SharePoint, Slack, Salesforce)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html" rel="noopener noreferrer"&gt;Amazon Q Apps&lt;/a&gt;:&lt;/strong&gt; No-code GenAI productivity apps using natural language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Amazon Q Developer Project Configuration:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;code&gt;.amazonq/&lt;/code&gt; directory at the project root&lt;/li&gt;
&lt;li&gt;Key file: &lt;code&gt;.amazonq/rules.md&lt;/code&gt; (or multiple &lt;code&gt;.md&lt;/code&gt; files in &lt;code&gt;.amazonq/rules/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Rules provide project-specific context, coding standards, architecture patterns, and constraints to Amazon Q Developer&lt;/li&gt;
&lt;li&gt;Rules are scoped to the project, not global. Keep them concise and actionable&lt;/li&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; &lt;code&gt;.amazonq/rules.md&lt;/code&gt; = "instruction manual you leave for your AI coding assistant"&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Domain 3: AI Safety, Security, and Governance (20%)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/bedrock/guardrails/" rel="noopener noreferrer"&gt;Amazon Bedrock Guardrails&lt;/a&gt;:&lt;/strong&gt; Content filters (hate, insults, sexual, violence), denied topics, word filters, PII detection/masking, contextual grounding check (prevents hallucinations by measuring response alignment with retrieved context).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Guardrails = "bouncer at both doors" (input AND output filtering)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Defense-in-Depth for Content Safety:&lt;/strong&gt; &lt;a href="https://aws.amazon.com/comprehend/" rel="noopener noreferrer"&gt;Amazon Comprehend&lt;/a&gt; pre-processing &amp;gt; Amazon Bedrock Guardrails &amp;gt; Lambda post-processing &amp;gt; API Gateway filtering. Includes threat detection for prompt injection, jailbreaks, and input sanitisation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Defense-in-depth = "multiple security checkpoints, not just one gate"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hallucination Reduction:&lt;/strong&gt; Amazon Bedrock Knowledge Bases for grounding, confidence scoring, JSON Schema for structured outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon VPC Endpoints + AWS PrivateLink:&lt;/strong&gt; Keep Amazon Bedrock traffic private within your VPC. Essential for sensitive fine-tuning data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/iam/" rel="noopener noreferrer"&gt;AWS Identity and Access Management (IAM)&lt;/a&gt; + &lt;a href="https://aws.amazon.com/iam/identity-center/" rel="noopener noreferrer"&gt;AWS IAM Identity Center&lt;/a&gt;:&lt;/strong&gt; Centralised access management. &lt;a href="https://aws.amazon.com/iam/access-analyzer/" rel="noopener noreferrer"&gt;IAM Access Analyzer&lt;/a&gt; validates policies for least privilege.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html" rel="noopener noreferrer"&gt;Service Control Policies (SCPs)&lt;/a&gt; + &lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html" rel="noopener noreferrer"&gt;Resource Control Policies (RCPs)&lt;/a&gt;:&lt;/strong&gt; SCPs restrict what accounts can do; RCPs restrict resource access.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ &lt;em&gt;Exam Trap:&lt;/em&gt; SCPs don't grant permissions, they only restrict&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Additional Security Services:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/macie/" rel="noopener noreferrer"&gt;Amazon Macie&lt;/a&gt;:&lt;/strong&gt; Data security and DLP for Amazon S3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/cognito/" rel="noopener noreferrer"&gt;Amazon Cognito&lt;/a&gt;:&lt;/strong&gt; User auth for web/mobile apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/waf/" rel="noopener noreferrer"&gt;AWS WAF&lt;/a&gt;:&lt;/strong&gt; Web application firewall&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html" rel="noopener noreferrer"&gt;AWS Encryption SDK&lt;/a&gt;:&lt;/strong&gt; Client-side encryption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Responsible AI:&lt;/strong&gt; Fairness, explainability, transparency, human oversight, privacy and security, safety, controllability, veracity and robustness, governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Comprehend:&lt;/strong&gt; NLP for sentiment, entities, PII detection, custom classification and entity recognition.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Comprehend = "reads and understands text like a human"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Governance and Compliance:&lt;/strong&gt; SageMaker AI model cards for documentation. &lt;a href="https://aws.amazon.com/glue/" rel="noopener noreferrer"&gt;AWS Glue&lt;/a&gt; Data Catalog for data lineage. &lt;a href="https://aws.amazon.com/cloudtrail/" rel="noopener noreferrer"&gt;AWS CloudTrail&lt;/a&gt; audit logging. Continuous monitoring for misuse, drift, and bias.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain 4: Operational Efficiency and Optimization (12%)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/GenAI-observability.html" rel="noopener noreferrer"&gt;Amazon CloudWatch GenAI Observability&lt;/a&gt;:&lt;/strong&gt; Track latency, token usage (InputTokenCount, OutputTokenCount), errors, API invocation counts. Time to First Token (TTFT) for streaming latency. &lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries.html" rel="noopener noreferrer"&gt;Amazon CloudWatch Synthetics&lt;/a&gt; for canary monitoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bedrock CountTokens API:&lt;/strong&gt; Free API to estimate prompt token count before invoking the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html" rel="noopener noreferrer"&gt;AWS X-Ray&lt;/a&gt;:&lt;/strong&gt; End-to-end distributed tracing across API Gateway, Lambda, Amazon Bedrock, Knowledge Bases.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; X-Ray = "MRI for your application's request flow"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Provisioned Throughput vs On-Demand:&lt;/strong&gt; Reserved capacity for consistent performance vs pay-per-use. Provisioning is associated with a specific model ARN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt Caching:&lt;/strong&gt; Caches static prompt prefix (instructions, system prompt). Only dynamic content tokenised on subsequent calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost Optimisation:&lt;/strong&gt; Right-size models, cache prompts, batch inference, monitor token usage. Context Pruning (limit RAG chunks, filter via metadata, summarise old chat history). &lt;a href="https://aws.amazon.com/aws-cost-management/aws-cost-explorer/" rel="noopener noreferrer"&gt;AWS Cost Explorer&lt;/a&gt; and &lt;a href="https://aws.amazon.com/aws-cost-management/aws-cost-anomaly-detection/" rel="noopener noreferrer"&gt;AWS Cost Anomaly Detection&lt;/a&gt; for tracking GenAI spend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic Routing (Intelligent Prompt Routing):&lt;/strong&gt; Built into Amazon Bedrock. Routes complex queries to larger models, simple queries to smaller/cheaper models.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Dynamic Routing = "express lane for simple questions, full service for complex ones"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Non-deterministic Outputs:&lt;/strong&gt; Temperature, top-p, top-k control randomness. Lower temperature = more deterministic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;em&gt;Memory Hook:&lt;/em&gt; Temperature = "creativity dial". 0 = robot, 1 = poet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/sagemaker/clarify/" rel="noopener noreferrer"&gt;Amazon SageMaker Clarify&lt;/a&gt;:&lt;/strong&gt; Detects bias by measuring imbalances across demographic groups. Bias metrics: Class Imbalance (CI), Difference in Proportions of Labels (DPL).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-model-monitor.html" rel="noopener noreferrer"&gt;Amazon SageMaker Model Monitor&lt;/a&gt;:&lt;/strong&gt; Alerts via CloudWatch on quality deviations and data drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semantic Caching:&lt;/strong&gt; Cache similar queries' results using result fingerprinting. Edge caching via &lt;a href="https://aws.amazon.com/cloudfront/" rel="noopener noreferrer"&gt;Amazon CloudFront&lt;/a&gt; for reduced latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain 5: Testing, Validation, and Troubleshooting (11%)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model Evaluation:&lt;/strong&gt; Amazon Bedrock Model Evaluation for accuracy, robustness, toxicity. A/B testing, canary testing, cost-performance analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM-as-a-Judge:&lt;/strong&gt; Use an LLM to evaluate another LLM's outputs. Bedrock Evaluation Jobs measure RAG performance against benchmarks or LLM judges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RAG Evaluation Metrics:&lt;/strong&gt; Correctness, Completeness, Helpfulness, Logical Coherence, Faithfulness (how well responses align with retrieved text).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ROUGE Metric:&lt;/strong&gt; Measures overlap of units (words, n-grams) between generated text and ground truth for summarisation or translation tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Debugging:&lt;/strong&gt; Trace agent reasoning steps, validate action group responses, check knowledge base retrieval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bedrock Agent Tracing:&lt;/strong&gt; Trace types: PreProcessing, Orchestration, PostProcessing, Guardrail traces. Shows which knowledge bases were hit, how action groups were invoked, and errors encountered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/sagemaker/data-labeling/" rel="noopener noreferrer"&gt;Amazon SageMaker Ground Truth&lt;/a&gt;:&lt;/strong&gt; Data labelling service for creating high-quality training datasets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting Patterns:&lt;/strong&gt; Inconsistent outputs, agent failures, retrieval misses, latency spikes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context Window Overflow:&lt;/strong&gt; Dynamic chunking, prompt design optimisation, truncation error analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieval System Troubleshooting:&lt;/strong&gt; Embedding quality diagnostics, drift monitoring, vectorisation resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/augmented-ai/" rel="noopener noreferrer"&gt;Amazon Augmented AI (Amazon A2I)&lt;/a&gt;:&lt;/strong&gt; Human review/correction loops for quality assurance. Vital due to non-deterministic nature of GenAI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exam decision boundaries
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;rotation&lt;/strong&gt; = AWS Secrets Manager, not Parameter Store&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;without redeploying&lt;/strong&gt; or &lt;strong&gt;feature flags&lt;/strong&gt; = AWS AppConfig&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;consistent deployments across environments&lt;/strong&gt; = one AWS CDK app with Stages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;grounding&lt;/strong&gt; or &lt;strong&gt;hallucination prevention&lt;/strong&gt; = Amazon Bedrock Guardrails contextual grounding check or RAG with Knowledge Bases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;standardised agent-tool interface&lt;/strong&gt; = MCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;bias detection&lt;/strong&gt; or &lt;strong&gt;explainability&lt;/strong&gt; = Amazon SageMaker Clarify&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;data drift&lt;/strong&gt; or &lt;strong&gt;model quality monitoring&lt;/strong&gt; = Amazon SageMaker Model Monitor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;human review loop&lt;/strong&gt; = Amazon A2I&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;speech-to-text&lt;/strong&gt; = Amazon Transcribe&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;text extraction from documents&lt;/strong&gt; = Amazon Textract&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;conversational chatbot interface&lt;/strong&gt; = &lt;a href="https://aws.amazon.com/lex/" rel="noopener noreferrer"&gt;Amazon Lex&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;contact centre AI&lt;/strong&gt; = &lt;a href="https://aws.amazon.com/connect/" rel="noopener noreferrer"&gt;Amazon Connect&lt;/a&gt; + Amazon Lex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;real-time subscriptions&lt;/strong&gt; or &lt;strong&gt;GraphQL&lt;/strong&gt; = AWS AppSync&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;event-driven&lt;/strong&gt; = &lt;a href="https://aws.amazon.com/eventbridge/" rel="noopener noreferrer"&gt;Amazon EventBridge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;private Amazon Bedrock traffic&lt;/strong&gt; = Amazon VPC Endpoints + AWS PrivateLink&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sensitive data discovery in Amazon S3&lt;/strong&gt; = Amazon Macie&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key AWS services quick reference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amazon Bedrock Ecosystem:&lt;/strong&gt; Amazon Bedrock, Bedrock Agents, Amazon Bedrock AgentCore, Bedrock Knowledge Bases, Amazon Bedrock Guardrails, Amazon Bedrock Flows, Amazon Bedrock Prompt Management, Amazon Bedrock Data Automation (BDA), Bedrock Cross-Region Inference, Bedrock Model Evaluation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic AI:&lt;/strong&gt; Strands Agents, AWS Agent Squad, Model Context Protocol (MCP)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Processing and AI/ML:&lt;/strong&gt; Amazon Textract, Amazon Transcribe, Amazon Comprehend, Amazon Rekognition, Amazon Lex, Amazon Titan, Amazon SageMaker AI, Amazon SageMaker Clarify, Amazon SageMaker Ground Truth, &lt;a href="https://aws.amazon.com/sagemaker/jumpstart/" rel="noopener noreferrer"&gt;Amazon SageMaker JumpStart&lt;/a&gt;, Amazon SageMaker Model Monitor, SageMaker AI Model Registry, &lt;a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo.html" rel="noopener noreferrer"&gt;Amazon SageMaker Neo&lt;/a&gt;, Amazon A2I&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Q Family:&lt;/strong&gt; Amazon Q Developer, Amazon Q Business, Amazon Q Apps&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search and Vector:&lt;/strong&gt; Amazon OpenSearch Service, &lt;a href="https://aws.amazon.com/kendra/" rel="noopener noreferrer"&gt;Amazon Kendra&lt;/a&gt;, &lt;a href="https://aws.amazon.com/neptune/" rel="noopener noreferrer"&gt;Amazon Neptune&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration and Compute:&lt;/strong&gt; AWS Lambda, &lt;a href="https://aws.amazon.com/ec2/" rel="noopener noreferrer"&gt;Amazon Elastic Compute Cloud (Amazon EC2)&lt;/a&gt;, AWS Step Functions, Amazon API Gateway, AWS AppSync, Amazon EventBridge, Amazon DynamoDB, Amazon SQS, &lt;a href="https://aws.amazon.com/sns/" rel="noopener noreferrer"&gt;Amazon Simple Notification Service (Amazon SNS)&lt;/a&gt;, &lt;a href="https://aws.amazon.com/appflow/" rel="noopener noreferrer"&gt;Amazon AppFlow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure and Deployment:&lt;/strong&gt; AWS CDK, AWS CloudFormation, &lt;a href="https://aws.amazon.com/codepipeline/" rel="noopener noreferrer"&gt;AWS CodePipeline&lt;/a&gt; + &lt;a href="https://aws.amazon.com/codebuild/" rel="noopener noreferrer"&gt;AWS CodeBuild&lt;/a&gt; + AWS CodeDeploy, AWS AppConfig, AWS Systems Manager Parameter Store&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security, Identity, and Compliance:&lt;/strong&gt; IAM + IAM Identity Center, AWS KMS, AWS Secrets Manager, Amazon Macie, Amazon Cognito, AWS WAF, Amazon VPC + AWS PrivateLink&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; Amazon S3, &lt;a href="https://aws.amazon.com/ebs/" rel="noopener noreferrer"&gt;Amazon Elastic Block Store (Amazon EBS)&lt;/a&gt;, &lt;a href="https://aws.amazon.com/efs/" rel="noopener noreferrer"&gt;Amazon Elastic File System (Amazon EFS)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring and Observability:&lt;/strong&gt; Amazon CloudWatch, AWS X-Ray, AWS CloudTrail, AWS Cost Explorer, AWS Cost Anomaly Detection, &lt;a href="https://aws.amazon.com/grafana/" rel="noopener noreferrer"&gt;Amazon Managed Grafana&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recommended preparation sources
&lt;/h2&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;AWS Skill Builder - Exam Prep Plan: AWS Certified Generative AI Developer - Professional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/ultimate-aws-certified-generative-ai-developer-professional/?couponCode=KEEPLEARNING" rel="noopener noreferrer"&gt;Udemy - Ultimate AWS Certified Generative AI Developer Professional by Frank Kane and Stephane Maarek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portal.tutorialsdojo.com/courses/aws-certified-generative-ai-developer-professional-aip-c01-practice-exams/" rel="noopener noreferrer"&gt;Tutorials Dojo -
AWS Certified Generative AI Developer Professional Practice Exams AIP-C01 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also highly recommend reading the relevant AWS service FAQ pages. They provide deeper understanding of service capabilities, limitations, and best practices that frequently appear in exam questions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;All the best on your AIP-C01 journey, and happy GenAI building!&lt;/em&gt; 🚀&lt;/p&gt;

</description>
      <category>aws</category>
      <category>genai</category>
      <category>serverless</category>
      <category>bedrock</category>
    </item>
    <item>
      <title>Why AWS Certified GenAI Developer stands apart from other AWS certs</title>
      <dc:creator>Anwaar Hussain</dc:creator>
      <pubDate>Wed, 15 Apr 2026 13:11:54 +0000</pubDate>
      <link>https://dev.to/awshuss/why-aws-certified-genai-developer-stands-apart-from-other-aws-certs-14n</link>
      <guid>https://dev.to/awshuss/why-aws-certified-genai-developer-stands-apart-from-other-aws-certs-14n</guid>
      <description>&lt;p&gt;I recently passed the &lt;a href="https://aws.amazon.com/certification/certified-generative-ai-developer-professional/" rel="noopener noreferrer"&gt;AWS Certified Generative AI Developer - Professional&lt;/a&gt; (AIP-C01) exam, bringing my total to 13 AWS certifications. In 2024, I earned my AWS Golden Jacket—a recognition reserved for those who achieve all &lt;a href="https://aws.amazon.com/certification/" rel="noopener noreferrer"&gt;12 active AWS certifications&lt;/a&gt;. (&lt;a href="https://aws.amazon.com/certification/certified-machine-learning-specialty/" rel="noopener noreferrer"&gt;AWS Machine Learning Specialty&lt;/a&gt; certification retired on March 31, 2026.) With this breadth of AWS certification experience, I can confidently say that AIP-C01 stands apart from every other AWS credential I've earned.&lt;/p&gt;

&lt;p&gt;This isn't just another cloud certification with a new badge. While my journey through Solution Architect, DevOps Engineer, Security Specialty, and other AWS certifications taught me to architect, secure, and operate cloud infrastructure, the GenAI Developer certification demanded something fundamentally different. It required me to synthesize knowledge across traditional artificial intelligence and machine learning (AI/ML), large language models (LLMs), serverless architecture, and application development—validating skills that didn't exist as a cohesive discipline until recently.&lt;/p&gt;

&lt;p&gt;AWS designed this certification to help address a critical gap: organizations need GenAI Developers and Architects who can design robust systems, implement secure solutions, integrate AI capabilities into existing applications, and operate these systems reliably at scale. The challenge is that this role requires expertise spanning multiple domains—a combination rarely validated by a single credential until now.&lt;/p&gt;

&lt;h2&gt;
  
  
  A different kind of preparation
&lt;/h2&gt;

&lt;p&gt;Back in December 2025, when I started preparing for this certification, my approach was quite similar to before. I followed well-known courses, studied AWS documentation and service FAQs, set up quick configurations in the console, and worked through practice exams. By the time I completed all of that, unlike in the past, I had one clear thought: "You are not ready for this!"&lt;/p&gt;

&lt;p&gt;Throughout my initial preparation, I kept recalling a narrative from 15 years ago during my Bachelor's degree in Telecommunications Engineering. We were told that jobs in the telecom sector were saturated post-boom from the 1990s and early 2000s. The rapid advancement in radio frequency (RF) and antenna technologies and the advent of new mobile network standards like 2G and 3G meant that all the jobs were taken by Electrical and Electronics Engineers, Network Engineers, and similar roles, which left field specialists with limited opportunities. I don't know how true that was as I clearly didn't pursue that industry for long.&lt;/p&gt;

&lt;p&gt;This memory resurfaced because I saw a similar pattern emerging in the GenAI space. I found myself wondering if AI/ML Consultants, Data Scientists, DevOps Engineers, and Application Architects would simply take over the GenAI space, leaving no room for dedicated GenAI Developers and Architects. There's nothing wrong with professionals from these backgrounds switching to the GenAI domain—as long as the right skills and knowledge are acquired. The challenge comes when you rely solely on your major specialization and treat GenAI as a minor add-on rather than developing the comprehensive skill set this discipline demands.&lt;/p&gt;

&lt;p&gt;Coming from a DevOps and Cloud Infrastructure Architect background, I recognized significant knowledge gaps. To fill those, I enrolled in AWS internal Area of Depth (AoD) programs—specifically Serverless Application, ML, and MLOps—to enhance my skills. These programs helped me understand AWS services like &lt;a href="https://aws.amazon.com/step-functions/" rel="noopener noreferrer"&gt;AWS Step Functions&lt;/a&gt;, &lt;a href="https://aws.amazon.com/xray/" rel="noopener noreferrer"&gt;AWS X-Ray&lt;/a&gt;, and &lt;a href="https://aws.amazon.com/appsync/" rel="noopener noreferrer"&gt;AWS AppSync&lt;/a&gt; (particularly GraphQL APIs), along with REST APIs, WebSockets, and asynchronous and synchronous architectures on the application side. On the ML side, I gained understanding of the ML lifecycle on AWS, fine-tuning models, optimizing their parameters, and importing them to Bedrock to fill vital gaps in my knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes AIP-C01 different
&lt;/h2&gt;

&lt;p&gt;To understand why this certification matters, it helps to look at how we got here. About three years ago, when &lt;a href="https://chatgpt.com/" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt;/&lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; took the world by storm with the GenAI and LLM revolution, we saw AWS flagbearer GenAI service &lt;a href="https://aws.amazon.com/bedrock/" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt; being used primarily for setting up chatbots, statbots, and AI assistants with Retrieval Augmented Generation (RAG) enabled and basic agentic setups. Those were small-scale and mostly proof-of-concept (PoC)-grade solutions. Before Agentic AI became mainstream, the focus was narrow—build an auxiliary AI tool, add some retrieval capabilities, and call it done.&lt;/p&gt;

&lt;p&gt;As organizations moved beyond experimentation to production deployment, the industry recognized a critical skills gap. To address that, AWS formulated this certification to prepare developers and architects who can deliver GenAI solutions at production grade. The focus is not entirely on AI/ML or LLMs (a common misconception about GenAI), but on fitting GenAI into business-critical applications and architectures as a key tool in futuristic tech stacks. The certification covers Bedrock heavily, but not just as a service for running chatbots. It validates your ability to run agents with AWS-managed orchestration or agent frameworks: &lt;a href="https://strandsagents.com/latest/" rel="noopener noreferrer"&gt;Strands&lt;/a&gt;, &lt;a href="https://www.langchain.com/" rel="noopener noreferrer"&gt;LangChain&lt;/a&gt;, etc managing agents running on &lt;a href="https://aws.amazon.com/bedrock/agentcore/" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore&lt;/a&gt;. It's about building systems that integrate GenAI capabilities into enterprise applications that need to scale, perform reliably, and deliver measurable business value.&lt;/p&gt;

&lt;p&gt;Most other AWS certifications test your knowledge of cloud services and best practices within defined domains. The GenAI Developer certification assumes you already understand these fundamentals and pushes you into territory that requires running GenAI workloads alongside business-critical applications in production environments.&lt;/p&gt;

&lt;p&gt;The exam covers five domains that reflect real-world operational complexity:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 1: Foundation Model Integration, Data Management, and Compliance&lt;/strong&gt; tests your ability to select appropriate models, implement RAG architectures, and handle data governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 2: Implementation and Integration&lt;/strong&gt; validates you can build agentic AI systems and integrate GenAI capabilities into existing applications using serverless orchestration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 3: AI Safety, Security, and Governance&lt;/strong&gt; helps you implement guardrails and responsible AI practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 4: Operational Efficiency and Optimization&lt;/strong&gt; focuses on monitoring GenAI applications and optimizing costs for production workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain 5: Testing, Validation, and Troubleshooting&lt;/strong&gt; covers debugging agent behaviors and resolving production issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building production-grade GenAI applications
&lt;/h2&gt;

&lt;p&gt;The certification validates more than just your ability to call foundation model APIs—it tests your understanding of how to architect complete GenAI solutions using serverless technologies and deploy them across multiple environments using &lt;a href="https://aws.amazon.com/cdk/" rel="noopener noreferrer"&gt;AWS Cloud Development Kit (AWS CDK)&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html" rel="noopener noreferrer"&gt;AWS CloudFormation&lt;/a&gt; through continuous integration and continuous delivery (CI/CD) pipelines.&lt;/p&gt;

&lt;p&gt;Real-world implementations comprise of synchronous and asynchronous inference patterns, event-driven architectures using &lt;a href="https://aws.amazon.com/eventbridge/" rel="noopener noreferrer"&gt;Amazon EventBridge&lt;/a&gt;, workflow orchestration with Step Functions, data processing with &lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt;, state management with &lt;a href="https://aws.amazon.com/dynamodb/" rel="noopener noreferrer"&gt;Amazon DynamoDB&lt;/a&gt;, and security with &lt;a href="https://aws.amazon.com/iam/" rel="noopener noreferrer"&gt;AWS Identity and Access Management (AWS IAM)&lt;/a&gt;. They require abilities to design serverless architectures that scale automatically, handle failures gracefully, and optimize costs.&lt;/p&gt;

&lt;p&gt;Production-grade solutions leverage AWS AI/ML services to complement Amazon Bedrock. &lt;a href="https://aws.amazon.com/comprehend/" rel="noopener noreferrer"&gt;Amazon Comprehend&lt;/a&gt; provides natural language processing capabilities. &lt;a href="https://aws.amazon.com/rekognition/" rel="noopener noreferrer"&gt;Amazon Rekognition&lt;/a&gt; captures frames from videos for visual analysis. &lt;a href="https://aws.amazon.com/bedrock/data-automation/" rel="noopener noreferrer"&gt;Amazon Bedrock Data Automation&lt;/a&gt; handles complex document processing, while &lt;a href="https://aws.amazon.com/textract/" rel="noopener noreferrer"&gt;Amazon Textract&lt;/a&gt; extracts text and data from documents.&lt;/p&gt;

&lt;p&gt;Vector stores for semantic and hybrid search rely on &lt;a href="https://aws.amazon.com/opensearch-service/" rel="noopener noreferrer"&gt;Amazon OpenSearch Service&lt;/a&gt; and &lt;a href="https://aws.amazon.com/s3/" rel="noopener noreferrer"&gt;Amazon Simple Storage Service (Amazon S3)&lt;/a&gt;. &lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-caching.html" rel="noopener noreferrer"&gt;Prompt caching&lt;/a&gt; helps reduce costs by reusing previously processed prompts. &lt;a href="https://aws.amazon.com/bedrock/prompt-management/" rel="noopener noreferrer"&gt;Amazon Bedrock Prompt Management&lt;/a&gt; simplifies the creation, evaluation, versioning, and sharing of prompts to help you get the best responses from foundation models. Flow orchestration with &lt;a href="https://aws.amazon.com/bedrock/flows/" rel="noopener noreferrer"&gt;Amazon Bedrock Flows&lt;/a&gt; enables you to design and execute complex multi-step workflows. Additionally, &lt;a href="https://aws.amazon.com/bedrock/guardrails/" rel="noopener noreferrer"&gt;Amazon Bedrock Guardrails&lt;/a&gt; provides content filtering and safety controls to help you implement responsible AI practices.&lt;/p&gt;

&lt;p&gt;Security and governance are critical. Keeping Amazon Bedrock traffic private requires &lt;a href="https://aws.amazon.com/vpc/" rel="noopener noreferrer"&gt;Amazon Virtual Private Cloud (Amazon VPC)&lt;/a&gt; endpoints, while &lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html" rel="noopener noreferrer"&gt;Service Control Policies (SCPs)&lt;/a&gt;, &lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html" rel="noopener noreferrer"&gt;Resource Control Policies (RCPs)&lt;/a&gt;, and &lt;a href="https://aws.amazon.com/iam/identity-center/" rel="noopener noreferrer"&gt;AWS IAM Identity Center&lt;/a&gt; manage access by identities and model resources centrally. &lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/GenAI-observability.html" rel="noopener noreferrer"&gt;Amazon CloudWatch GenAI Observability&lt;/a&gt; provides comprehensive monitoring for AI workloads, tracking latency, token usage, errors, and API invocation counts.&lt;/p&gt;

&lt;p&gt;Beyond the core services, Lambda functions complement LLM flows through &lt;a href="https://aws.amazon.com/bedrock/flows/" rel="noopener noreferrer"&gt;Amazon Bedrock Flows&lt;/a&gt; and Step Functions orchestration. Lambda enables custom processing logic within your GenAI workflows, handling tasks like data transformation, API integrations, and business logic execution. The certification tests your knowledge of various deployment strategies for compute resources using &lt;a href="https://aws.amazon.com/codedeploy/" rel="noopener noreferrer"&gt;AWS CodeDeploy&lt;/a&gt;, including canary deployments, blue/green deployments, and rolling updates across Lambda functions and other compute targets. A critical aspect is understanding dynamic configuration loading through &lt;a href="https://aws.amazon.com/systems-manager/features/appconfig/" rel="noopener noreferrer"&gt;AWS AppConfig&lt;/a&gt;, which allows you to modify application behavior without redeployment—essential for managing feature flags, model parameters, and operational settings in production GenAI applications.&lt;/p&gt;

&lt;p&gt;The certification assesses your ability to troubleshoot issues unique to GenAI applications—inconsistent model outputs, agent failures, non-deterministic behaviors, and the operational complexity of systems that make autonomous decisions. These skills help distinguish professionals who can deploy GenAI applications that deliver business value from those who primarily build PoC solutions.&lt;/p&gt;

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

&lt;p&gt;AIP-C01 certification represents a new category of cloud certification—one that validates your ability to work across multiple disciplines and build production-ready GenAI applications. It's not just another AWS certification with a different badge. It's AWS's answer to the GenAI skills gap, designed to prepare professionals for roles that didn't exist a few years ago but are now critical to many organizations' AI strategies.&lt;/p&gt;

&lt;p&gt;The market recognizes this value. According to &lt;a href="https://www.glassdoor.co.uk/" rel="noopener noreferrer"&gt;Glassdoor&lt;/a&gt; data from April 2026, GenAI roles command strong compensation in both the US and UK markets. In the United States, GenAI Developers earn an average of US$81K/yr (range: US$63K-US$104K), GenAI Engineers earn US$100K/yr (range: US$76K-US$130K), and GenAI Architects earn US$140K/yr (range: US$105K-US$188K). In the United Kingdom, GenAI Engineers earn an average of £38K/yr (range: £29K-£48K). The salary progression clearly reflects the increasing complexity and business impact of these roles.&lt;/p&gt;

&lt;p&gt;If you're considering this certification, prepare for an exam that challenges you to think like an architect, developer, and operator simultaneously. It tests your ability to synthesize knowledge across traditional AI/ML, LLMs, serverless architecture, and application development. When you pass, you'll have validated skills that are currently in high demand and valuable for building the next generation of AI-powered applications.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Ready to start your AIP-C01 journey? Begin by reviewing the &lt;a href="https://docs.aws.amazon.com/aws-certification/latest/ai-professional-01/ai-professional-01.html" rel="noopener noreferrer"&gt;official exam guide&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>genai</category>
      <category>serverless</category>
      <category>bedrock</category>
    </item>
  </channel>
</rss>
