<?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: LAVANYA LAHARI NANDIPATI</title>
    <description>The latest articles on DEV Community by LAVANYA LAHARI NANDIPATI (@lahari_nandipati_aae7627d).</description>
    <link>https://dev.to/lahari_nandipati_aae7627d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3524945%2Ff594d67b-215b-4a20-abc6-25604dbc4b8b.jpeg</url>
      <title>DEV Community: LAVANYA LAHARI NANDIPATI</title>
      <link>https://dev.to/lahari_nandipati_aae7627d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lahari_nandipati_aae7627d"/>
    <language>en</language>
    <item>
      <title>Building a HIPAA-Compliant Chatbot with AWS Lambda &amp; Bedrock</title>
      <dc:creator>LAVANYA LAHARI NANDIPATI</dc:creator>
      <pubDate>Thu, 25 Sep 2025 18:26:30 +0000</pubDate>
      <link>https://dev.to/lahari_nandipati_aae7627d/building-a-hipaa-compliant-chatbot-with-aws-lambda-bedrock-3b4a</link>
      <guid>https://dev.to/lahari_nandipati_aae7627d/building-a-hipaa-compliant-chatbot-with-aws-lambda-bedrock-3b4a</guid>
      <description>&lt;p&gt;As a software engineer working in healthcare, I’ve seen first-hand how patients want instant answers but compliance makes everything tricky. We can’t just throw PHI (Protected Health Information) into ChatGPT and call it a day.  &lt;/p&gt;

&lt;p&gt;So I decided to build a &lt;strong&gt;HIPAA-friendly chatbot&lt;/strong&gt; using &lt;strong&gt;AWS Lambda&lt;/strong&gt; (serverless backend) and &lt;a href="https://aws.amazon.com/bedrock/" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt; (LLM service) — with &lt;strong&gt;data masking&lt;/strong&gt; to keep sensitive info safe.  &lt;/p&gt;




&lt;h2&gt;
  
  
  📌 This post walks you through:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Why chatbots in healthcare are challenging 🚑
&lt;/li&gt;
&lt;li&gt;How to design a compliant architecture 🔐
&lt;/li&gt;
&lt;li&gt;Code snippets for AWS Lambda + Bedrock ⚙️
&lt;/li&gt;
&lt;li&gt;Tips for keeping PHI secure 🛡️
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚨 The Challenge: AI + Healthcare = Risk
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chatbots are great for FAQs, triage, and scheduling.
&lt;/li&gt;
&lt;li&gt;But if you send raw PHI (like names, MRNs, diagnoses) to an LLM… that’s a compliance nightmare.
&lt;/li&gt;
&lt;li&gt;HIPAA requires &lt;strong&gt;minimum necessary access&lt;/strong&gt; and strict controls.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture at a Glance
&lt;/h2&gt;

&lt;p&gt;Flow:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Patient message → API Gateway
&lt;/li&gt;
&lt;li&gt;Lambda pre-processor → scrubs PHI (names, DOB, SSNs)
&lt;/li&gt;
&lt;li&gt;Bedrock LLM → processes the masked query
&lt;/li&gt;
&lt;li&gt;Lambda post-processor → reinserts placeholders if needed
&lt;/li&gt;
&lt;li&gt;Response → returned to patient securely
&lt;/li&gt;
&lt;/ol&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%2Fphats2jxl0avhggz6u23.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%2Fphats2jxl0avhggz6u23.png" alt="Flowchart showing HIPAA-compliant chatbot architecture: Patient → API Gateway → Lambda → Bedrock → Lambda → Patient" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;API Gateway → Lambda (mask PHI) → Bedrock → Lambda (restore placeholders) → Patient  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚙️ Step 1: Setting up AWS Lambda
&lt;/h2&gt;

&lt;p&gt;A basic Python Lambda handler:&lt;br&gt;
&lt;/p&gt;

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

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

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mask_phi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# toy example: replace dates + names
&lt;/span&gt;    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\d{2}/\d{2}/\d{4}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[DATE]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(Alice|Bob|John)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[NAME]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&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;text&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;user_input&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;queryStringParameters&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;masked_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mask_phi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bedrock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;modelId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;masked_input&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="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="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🤖 Step 2: Talking to Bedrock Safely
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Always send &lt;strong&gt;masked input only&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Example:
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;John Smith has a fever since 09/21/2025. Should he see a doctor?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Masked:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[NAME] has a fever since [DATE]. Should they see a doctor?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔐 Step 3: Post-Processing
&lt;/h2&gt;

&lt;p&gt;If you need to restore placeholders (like &lt;code&gt;Hello [NAME]&lt;/code&gt;), you can map them back safely from session state.  &lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Why This Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Patients get &lt;strong&gt;instant responses&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Engineers stay &lt;strong&gt;HIPAA-compliant&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless (Lambda)&lt;/strong&gt; keeps costs low
&lt;/li&gt;
&lt;li&gt;Bedrock provides &lt;strong&gt;enterprise-grade LLMs&lt;/strong&gt; without exposing PHI
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;Add &lt;strong&gt;DynamoDB&lt;/strong&gt; to store chat history (encrypted)
&lt;/li&gt;
&lt;li&gt;Plug in &lt;strong&gt;Cognito&lt;/strong&gt; for authentication
&lt;/li&gt;
&lt;li&gt;Expand PHI scrubbing with &lt;strong&gt;Amazon Comprehend Medical&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙌 Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;As engineers, we often think &lt;em&gt;"just ship the feature"&lt;/em&gt; — but in healthcare, &lt;strong&gt;privacy &lt;em&gt;is&lt;/em&gt; the feature&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;This project taught me that it’s possible to &lt;strong&gt;marry AI innovation with compliance&lt;/strong&gt; if we design carefully.  &lt;/p&gt;

&lt;p&gt;👉 👉 Repo link: &lt;a href="https://github.com/laharinandipati/hipaa-chatbot-bedrock" rel="noopener noreferrer"&gt;GitHub – hipaa-chatbot-bedrock&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>software</category>
      <category>hipaa</category>
      <category>awsbedrock</category>
    </item>
  </channel>
</rss>
