<?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: AKASH S</title>
    <description>The latest articles on DEV Community by AKASH S (@akashabish).</description>
    <link>https://dev.to/akashabish</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%2F3089871%2F098ac719-6901-43c0-aa4f-3152fdf84496.jpg</url>
      <title>DEV Community: AKASH S</title>
      <link>https://dev.to/akashabish</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akashabish"/>
    <language>en</language>
    <item>
      <title>PDF to Multilingual Audiobook: Building a Serverless AI Pipeline on AWS</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Sat, 10 Jan 2026 17:48:20 +0000</pubDate>
      <link>https://dev.to/akashabish/pdf-to-multilingual-audio-building-a-serverless-ai-pipeline-on-aws-5gnp</link>
      <guid>https://dev.to/akashabish/pdf-to-multilingual-audio-building-a-serverless-ai-pipeline-on-aws-5gnp</guid>
      <description>&lt;p&gt;In this project, I built a fully serverless, event-driven AI pipeline on AWS that automatically converts a &lt;strong&gt;PDF document into translated speech audio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Whenever a &lt;strong&gt;PDF is uploaded to an S3 bucket&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text is extracted using &lt;strong&gt;Amazon Textract&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The extracted text is translated using &lt;strong&gt;Amazon Translate&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The translated text is converted into &lt;strong&gt;speech using polly&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The final audio file is stored back in S3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this happens automatically, without any manual trigger or server management.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PDF Upload (Amazon S3)
        ↓
AWS Lambda (Triggered by S3 event)
        ↓
Amazon Textract (OCR)
        ↓
Amazon Translate (Language Translation)
        ↓
Amazon Polly (Text to Speech)
        ↓
Audio Output Stored in S3

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

&lt;/div&gt;



&lt;p&gt;AWS Services Used&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon S3&lt;/strong&gt; – File storage and event trigger&lt;/li&gt;
&lt;li&gt;AWS Lambda – Serverless compute&lt;/li&gt;
&lt;li&gt;Amazon &lt;strong&gt;Textract&lt;/strong&gt; – Extract text from PDFs&lt;/li&gt;
&lt;li&gt;Amazon &lt;strong&gt;Translate&lt;/strong&gt; – Translate extracted text&lt;/li&gt;
&lt;li&gt;Amazon &lt;strong&gt;Polly&lt;/strong&gt; – Convert text into speech&lt;/li&gt;
&lt;li&gt;AWS &lt;strong&gt;IAM&lt;/strong&gt; – Secure access control&lt;/li&gt;
&lt;li&gt;Amazon &lt;strong&gt;CloudWatch&lt;/strong&gt; – Logging and monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Project Flow :
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Upload PDF to S3&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A PDF file is uploaded to the input/ folder of the S3 bucket.&lt;/li&gt;
&lt;li&gt;This upload event automatically triggers the Lambda function.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Step 2: Extract Text with Textract&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda starts an asynchronous Textract job to extract text from the uploaded PDF.&lt;/li&gt;
&lt;li&gt;Textract reads the PDF directly from S3 and returns the extracted text.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Extracted text using lambda and logged by cloud watch.&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%2F6nyit6mms8itdhpa16o7.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%2F6nyit6mms8itdhpa16o7.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Translate the Extracted Text&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The extracted English text is passed to Amazon Translate.&lt;/li&gt;
&lt;li&gt;The text is translated into a target language (for example, Tamil).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Step 4: Convert Translated Text to Speech&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The translated text is sent to Amazon Polly.&lt;/li&gt;
&lt;li&gt;Polly generates a natural-sounding MP3 audio file using a language-appropriate voice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Store the Audio Output&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The generated MP3 file is saved in the output/ folder of the same S3 bucket.&lt;/li&gt;
&lt;li&gt;The entire process completes automatically in a few seconds.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Codes to perform lambda and role permissions.&lt;br&gt;
&lt;code&gt;lambda_function.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3
import time
import uuid

textract = boto3.client('textract')
translate = boto3.client('translate')
polly = boto3.client('polly')
s3 = boto3.client('s3')

BUCKET_NAME = "pdf-translate-speech-ak"

def lambda_handler(event, context):

    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']

    print(f"PDF uploaded: {key}")

    if not key.startswith("input/"):
        return {"statusCode": 200, "message": "Not an input file"}

    response = textract.start_document_text_detection(
        DocumentLocation={
            'S3Object': {
                'Bucket': bucket,
                'Name': key
            }
        }
    )

    job_id = response['JobId']
    print(f"Textract Job ID: {job_id}")

    extracted_text = ""
    while True:
        result = textract.get_document_text_detection(JobId=job_id)
        status = result['JobStatus']

        if status == "SUCCEEDED":
            for block in result['Blocks']:
                if block['BlockType'] == "LINE":
                    extracted_text += block['Text'] + " "
            break
        elif status == "FAILED":
            raise Exception("Textract failed")

        time.sleep(5)

    print("Text extraction completed")

    translated = translate.translate_text(
        Text=extracted_text[:5000],  # safeguard
        SourceLanguageCode="en",
        TargetLanguageCode="ta"
    )

    translated_text = translated['TranslatedText']

    speech = polly.synthesize_speech(
        Text=translated_text[:3000],
        OutputFormat="mp3",
        VoiceId="Aditi"
    )

    audio_key = f"output/translated_audio_{uuid.uuid4()}.mp3"

    s3.put_object(
        Bucket=bucket,
        Key=audio_key,
        Body=speech['AudioStream'].read(),
        ContentType="audio/mpeg"
    )

    print(f"Audio saved: {audio_key}")

    return {
        "statusCode": 200,
        "audio_file": audio_key
    }

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

&lt;/div&gt;



&lt;p&gt;Role and it's Policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "textract:StartDocumentTextDetection",
        "textract:GetDocumentTextDetection"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "translate:TranslateText"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "polly:SynthesizeSpeech"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::pdf-translate-speech-ak/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:*"
      ],
      "Resource": "*"
    }
  ]
}

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

&lt;/div&gt;



&lt;p&gt;Output Translated Audio:&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%2Fcqzmeagm271ivb8hwutd.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%2Fcqzmeagm271ivb8hwutd.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect With Me&lt;/p&gt;

&lt;p&gt;👤 &lt;a href="https://www.linkedin.com/in/akashsasi01/" rel="noopener noreferrer"&gt;Akash S&lt;/a&gt;&lt;br&gt;
☁️ AWS | Cloud | AI Projects&lt;br&gt;
✍️ Writing about real-world cloud learning&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>Serverless PDF-to-Speech Narrator on AWS (Textract + Polly)</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Sat, 10 Jan 2026 04:23:32 +0000</pubDate>
      <link>https://dev.to/akashabish/serverless-pdf-to-speech-narrator-on-aws-textract-polly-29ha</link>
      <guid>https://dev.to/akashabish/serverless-pdf-to-speech-narrator-on-aws-textract-polly-29ha</guid>
      <description>&lt;p&gt;&lt;strong&gt;Ever wished your PDFs could just read themselves aloud?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this project, I built a fully automated, &lt;strong&gt;serverless PDF-to-Speech system&lt;/strong&gt; on AWS where uploading a PDF instantly generates an audio narration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No servers. No manual processing. Just upload → listen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In One Line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Upload a PDF to S3 → extract text using Textract → convert text to speech using Polly → save audio back to S3.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fvwhhmaxv34vk8mikwmfa.jpg" 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%2Fvwhhmaxv34vk8mikwmfa.jpg" alt=" " width="508" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps to be followed:
&lt;/h2&gt;

&lt;p&gt;1.Created a single Amazon S3 bucket with two folders: input/ for PDF uploads and output/ for generated audio files.&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%2Fv06d9z1bn9799al4jpce.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%2Fv06d9z1bn9799al4jpce.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Configured an IAM role for Lambda with permissions to access S3, Amazon Textract, Amazon Polly, and CloudWatch logs.&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%2Fsq4urv1v3iekhxszut04.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%2Fsq4urv1v3iekhxszut04.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Policy.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "textract:StartDocumentTextDetection",
        "textract:GetDocumentTextDetection"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "polly:SynthesizeSpeech"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::pdf-narrator-ak/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:*"
      ],
      "Resource": "*"
    }
  ]
}

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

&lt;/div&gt;



&lt;p&gt;3.Created an AWS Lambda function (Python 3.10) and attached the IAM role to enable secure service access.&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%2Fvm7dng8m1j6eul9nasd2.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%2Fvm7dng8m1j6eul9nasd2.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lambda_function.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3
import time
import uuid

textract = boto3.client('textract')
polly = boto3.client('polly')
s3 = boto3.client('s3')

BUCKET_NAME = "pdf-narrator-ak"

def lambda_handler(event, context):

    # 1️⃣ Get PDF details
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']

    print(f"PDF received: {key}")

    # Ensure only input folder triggers processing
    if not key.startswith("input/"):
        return {"statusCode": 200, "message": "Not an input file"}

    # 2️⃣ Start Textract job
    response = textract.start_document_text_detection(
        DocumentLocation={
            'S3Object': {
                'Bucket': bucket,
                'Name': key
            }
        }
    )

    job_id = response['JobId']
    print(f"Textract Job ID: {job_id}")

    # 3️⃣ Wait for Textract to finish
    text = ""
    while True:
        result = textract.get_document_text_detection(JobId=job_id)
        status = result['JobStatus']

        if status == "SUCCEEDED":
            for block in result['Blocks']:
                if block['BlockType'] == "LINE":
                    text += block['Text'] + " "
            break
        elif status == "FAILED":
            raise Exception("Textract failed")
        time.sleep(5)

    print("Text extraction completed")

    # 4️⃣ Convert text to speech (limit handled)
    speech = polly.synthesize_speech(
        Text=text[:3000],
        OutputFormat="mp3",
        VoiceId="Joanna"
    )

    # 5️⃣ Save MP3 to output folder
    audio_key = f"output/audio_{uuid.uuid4()}.mp3"

    s3.put_object(
        Bucket=bucket,
        Key=audio_key,
        Body=speech['AudioStream'].read(),
        ContentType="audio/mpeg"
    )

    print(f"Audio saved to {audio_key}")

    return {
        "statusCode": 200,
        "message": "PDF converted to speech",
        "audio_file": audio_key
    }

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

&lt;/div&gt;



&lt;p&gt;4.Added an S3 event trigger to invoke the Lambda function whenever a PDF is uploaded to the input/ folder.&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%2Fjl7fbn68mimr5ej2iv1a.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%2Fjl7fbn68mimr5ej2iv1a.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;br&gt;
Implemented Lambda logic to extract text from uploaded PDFs using Amazon Textract (asynchronous processing).&lt;/p&gt;

&lt;p&gt;5.Processed the extracted text and sent it to Amazon Polly to generate natural-sounding speech.&lt;/p&gt;

&lt;p&gt;6.Stored the generated MP3 audio file in the output/ folder of the same S3 bucket.&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%2F1buq9koa2tavxhah4ikm.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%2F1buq9koa2tavxhah4ikm.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&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%2Folzkilv50bqy4dhu0z0m.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%2Folzkilv50bqy4dhu0z0m.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Monitored execution flow, errors, and logs using Amazon CloudWatch.&lt;/p&gt;

&lt;p&gt;8.Verified successful execution by downloading and playing the generated audio file from S3.&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%2Fwfnknjynlptyp1zbjk85.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%2Fwfnknjynlptyp1zbjk85.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect With Me&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/akashsasi01/" rel="noopener noreferrer"&gt;👤 Akash S&lt;/a&gt;&lt;br&gt;
☁️ AWS | Cloud | AI Projects&lt;br&gt;
✍️ Writing about real-world cloud learning&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>aws</category>
    </item>
    <item>
      <title>Automated AWS Receipt Processing System using Textract, Lambda &amp; MySQL</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Fri, 19 Dec 2025 09:47:32 +0000</pubDate>
      <link>https://dev.to/akashabish/automated-aws-receipt-processing-system-using-textract-lambda-mysql-idg</link>
      <guid>https://dev.to/akashabish/automated-aws-receipt-processing-system-using-textract-lambda-mysql-idg</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this blog, I’ll walk you through how I built an end-to-end automated receipt processing system on AWS using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon S3&lt;/li&gt;
&lt;li&gt;AWS Lambda&lt;/li&gt;
&lt;li&gt;Amazon Textract (AnalyzeExpense)&lt;/li&gt;
&lt;li&gt;Amazon RDS (MySQL)&lt;/li&gt;
&lt;li&gt;Lambda Layers (pymysql)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/AKASH-1AK/receipt-textract.git" rel="noopener noreferrer"&gt;Use this repo if needed&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Architecture Overview
User uploads receipt (PDF / JPG)
        ↓
Amazon S3 (ObjectCreated event)
        ↓
AWS Lambda
        ↓
Amazon Textract (AnalyzeExpense)
        ↓
Amazon RDS (MySQL)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Create the MySQL Database (RDS) and set up a DB with Wanted Entities and Attributes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE DATABASE receipt_db;

USE receipt_db;

CREATE TABLE ride_receipts (
    receipt_id INT AUTO_INCREMENT PRIMARY KEY,
    customer_name VARCHAR(100),
    ride_id VARCHAR(50),
    driver_name VARCHAR(100),
    vehicle_number VARCHAR(20),
    mode_of_vehicle VARCHAR(50),
    selected_price DECIMAL(10,2),
    time_of_ride TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Create Lambda Layer for pymysql&lt;/p&gt;

&lt;p&gt;AWS Lambda does not include pymysql by default, so we must add it using a Lambda Layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir pymysql_layer
cd pymysql_layer
mkdir python
pip install pymysql -t python/
zip -r pymysql_layer.zip python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Upload Layer in AWS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go to Lambda → Layers&lt;/li&gt;
&lt;li&gt;Create new layer&lt;/li&gt;
&lt;li&gt;Runtime: &lt;strong&gt;Python 3.10&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Upload pymysql_layer.zip&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Create Lambda Function&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runtime: &lt;strong&gt;Python 3.10&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Attach pymysql layer&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add IAM permissions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AmazonTextractFullAccess&lt;/li&gt;
&lt;li&gt;AmazonS3ReadOnlyAccess&lt;/li&gt;
&lt;li&gt;CloudWatchLogsFullAccess&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Lambda Function Code&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listens for a receipt upload event from Amazon S3.&lt;/li&gt;
&lt;li&gt;Reads the uploaded file’s bucket name and object key.&lt;/li&gt;
&lt;li&gt;Sends the receipt to Amazon Textract for structured data extraction.&lt;/li&gt;
&lt;li&gt;Processes the extracted text to identify key receipt details.&lt;/li&gt;
&lt;li&gt;Stores the structured data into a MySQL database automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: Configure S3 Trigger&lt;/p&gt;

&lt;p&gt;Go to Lambda → Configuration → Triggers&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;strong&gt;S3 trigger&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Event type: ObjectCreated (&lt;strong&gt;PUT&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Bucket: &lt;strong&gt;receipt-inp-ak&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 6&lt;/strong&gt;: Upload Receipt to S3(Upload a clean file receipt1.jpg,receipt.pdf)&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%2Fw366cw19u0icdt7tr617.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%2Fw366cw19u0icdt7tr617.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7&lt;/strong&gt;:Debug Using CloudWatch&lt;br&gt;
Check logs in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CloudWatch → /aws/lambda/receipt-textract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Successful log example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Processing file: receipt.pdf
Extracted: {
 'vehicle_number': 'TN01B3694',
 'mode_of_vehicle': 'Car',
 'selected_price': 150.0
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fppt7vkq9t1e7dhjpxjtq.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%2Fppt7vkq9t1e7dhjpxjtq.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8&lt;/strong&gt;: Verify Data in MySQL by using &lt;strong&gt;Select&lt;/strong&gt; query.&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%2F5quyyhuh5jj215vl29kr.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%2F5quyyhuh5jj215vl29kr.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: Don't forgot to delete the resources which we created .stay tuned for more blogs and Deployment.&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>mysql</category>
      <category>aws</category>
      <category>automation</category>
    </item>
    <item>
      <title>📊How I Learnt AWS SNS, CloudWatch, and CloudTrail (With Real-World Use Cases)</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Sun, 24 Aug 2025 19:00:29 +0000</pubDate>
      <link>https://dev.to/akashabish/how-i-learnt-aws-sns-cloudwatch-and-cloudtrail-with-real-world-use-cases-2mio</link>
      <guid>https://dev.to/akashabish/how-i-learnt-aws-sns-cloudwatch-and-cloudtrail-with-real-world-use-cases-2mio</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;In today’s world,companies like &lt;strong&gt;Zomato, Uber, and Swiggy&lt;/strong&gt; works heavily on real-time notifications, monitoring, and security tracking to ensure smooth operations.&lt;strong&gt;Amazon Web Services (AWS)&lt;/strong&gt; provides three powerful services to achieve this: &lt;strong&gt;Amazon SNS&lt;/strong&gt; (Simple Notification Service), &lt;strong&gt;Amazon CloudWatch&lt;/strong&gt;, and &lt;strong&gt;AWS CloudTrail&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this blog, We explore these services with real-world examples and see how they fit into everyday cloud scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon SNS – Simple Notification Service
&lt;/h2&gt;

&lt;p&gt;SNS is a fully managed &lt;strong&gt;messaging service&lt;/strong&gt; that allows applications, services, or &lt;strong&gt;users to communicate instantly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Topic&lt;/strong&gt; (channel of communication).&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;Subscribers&lt;/strong&gt; (email, SMS, Lambda, SQS, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish&lt;/strong&gt; a Message (from applications or AWS services).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zomato/Uber notifications:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When our food is out for delivery, &lt;strong&gt;SNS publishes a message&lt;/strong&gt; → you receive an SMS/email instantly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud billing alerts:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If our AWS usage bill crosses a set threshold, &lt;strong&gt;SNS triggers an email&lt;/strong&gt; alert to prevent unexpected costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon CloudWatch – Monitoring and Observability
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CloudWatch is AWS’s monitoring service for applications, infrastructure, and services.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Metrics Monitoring:&lt;/strong&gt; CPU, memory, storage, network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboards&lt;/strong&gt;: Visualize performance in real time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alarms&lt;/strong&gt;: Trigger actions (like auto-scaling or notifications).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logs&lt;/strong&gt;: Application logs, server logs, error logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CloudWatch Agent&lt;/strong&gt;: Install on EC2/on-premises servers to push &lt;strong&gt;custom metrics&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uber ride-tracking servers: &lt;strong&gt;CloudWatch monitors EC2&lt;/strong&gt; instances handling &lt;strong&gt;GPS data&lt;/strong&gt;; if CPU usage spikes, auto-scaling is triggered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AWS CloudTrail – Auditing and Governance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CloudTrail is AWS’s auditing service that records all API calls and user actions across your AWS account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;why it's using:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tracks &lt;strong&gt;who&lt;/strong&gt; did &lt;strong&gt;what&lt;/strong&gt; and &lt;strong&gt;when&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Helps in security analysis and compliance.&lt;/li&gt;
&lt;li&gt;Provides audit logs for governance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IAM&lt;/strong&gt; activity monitoring: Detects if someone tried to create a new admin user without approval.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon SNS&lt;/strong&gt;: Notifies users instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon CloudWatch&lt;/strong&gt;: Monitors and visualizes metrics/logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CloudTrail&lt;/strong&gt;: Tracks all AWS activity for security and compliance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✨ Stay tuned for more learnings as I continue my AWS journey!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>awschallenge</category>
      <category>aws</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🌍AWS Route 53 – A Beginner-Friendly Guide</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Thu, 21 Aug 2025 17:16:33 +0000</pubDate>
      <link>https://dev.to/akashabish/aws-route-53-a-beginner-friendly-guide-kbj</link>
      <guid>https://dev.to/akashabish/aws-route-53-a-beginner-friendly-guide-kbj</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;When building and deploying an application, one of the most important steps is making it accessible to end-users across the globe. This is where &lt;strong&gt;Amazon Route 53&lt;/strong&gt;, a global &lt;strong&gt;Domain Name System (DNS)&lt;/strong&gt; web service, comes in.Route 53 helps translate &lt;strong&gt;domain names (like myapp.com) into IP addresses (like 192.0.2.1)&lt;/strong&gt;, ensuring users can easily reach your application hosted on AWS or elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step: Setting Up Route 53
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1) Purchase a Domain&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buy a domain from a domain provider (e.g., GoDaddy, Hostinger, Namecheap).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2) Open AWS Console → Route 53&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Route 53 and create a &lt;strong&gt;Hosted Zone&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter the purchased domain name and choose whether it should be &lt;strong&gt;Public&lt;/strong&gt; (internet-facing) or &lt;strong&gt;Private&lt;/strong&gt; (internal VPC use).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3) Hosted Zone Records&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS automatically creates &lt;strong&gt;SOA&lt;/strong&gt; (Start of Authority) and &lt;strong&gt;NS&lt;/strong&gt; (Name Server) records.&lt;/li&gt;
&lt;li&gt;We’ll be provided with &lt;strong&gt;4 Name Servers&lt;/strong&gt; (NS).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4) Update Domain Provider Settings&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy the &lt;strong&gt;NS values&lt;/strong&gt; (without the trailing dot) and update them in our domain provider’s dashboard (GoDaddy, Hostinger, etc.).&lt;/li&gt;
&lt;li&gt;This step links our purchased domain with AWS Route 53.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5) Create Records in Route 53&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a &lt;strong&gt;new record&lt;/strong&gt; (e.g., A record).&lt;/li&gt;
&lt;li&gt;Set the &lt;strong&gt;Type&lt;/strong&gt; (A, CNAME, etc.) and provide the Value (like your EC2 Public IP or Load Balancer DNS name).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6) Choose a Routing Policy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select how Route 53 should route traffic (Simple, Latency, Failover, etc.).&lt;/li&gt;
&lt;li&gt;Save the record.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;7) Test Your Domain&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open a browser and type our domain name.&lt;/li&gt;
&lt;li&gt;It should resolve to our configured IP or load balancer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Route 53 Routing Policies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;So we can learn more about Routing polices
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| Routing Policy            | Description                                                                       | Use Case Example                                                          |
| ------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| Simple Routing            | Directs traffic to a single resource.                                             | A small website hosted on one EC2 instance.                               |
| Weighted Routing          | Splits traffic across resources based on percentages.                             | A/B testing between two application versions.                             |
| Latency-based Routing     | Sends users to the region with the lowest network latency.                        | A global e-commerce site with servers in the US, Europe, and Asia.        |
| Failover Routing          | Routes traffic to a standby resource if the primary one fails.                    | Disaster recovery setup with primary and backup servers.                  |
| Geolocation Routing       | Routes traffic based on the user’s location.                                      | Directing Indian users to a server in Mumbai, and US users to Ohio.       |
| Geoproximity Routing      | Routes traffic based on the geographic location of resources, with optional bias. | Regional applications that want to prefer one location slightly more.     |
| Multivalue Answer Routing | Returns multiple healthy IPs for load balancing.                                  | Distributing requests across multiple EC2 instances running the same app. |

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hosting a Website with Route 53
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Let’s say we bought the domain &lt;code&gt;mytravelblog.tech&lt;/code&gt; from GoDaddy. we host our application on an EC2 instance with the &lt;code&gt;IP 13.250.45.67&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Here’s how Route 53 helps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We need to create a Public Hosted Zone in Route 53 for &lt;code&gt;mytravelblog.tech&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Route 53 gives us &lt;strong&gt;4 Name Servers&lt;/strong&gt;.we update these in GoDaddy’s domain settings.&lt;/li&gt;
&lt;li&gt;We need to add an A record in &lt;strong&gt;Route 53 with the value 13.250.45.67&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;We need to choose &lt;strong&gt;Simple Routing&lt;/strong&gt; so all traffic goes to this EC2.&lt;/li&gt;
&lt;li&gt;Now, when someone types &lt;strong&gt;mytravelblog.tech&lt;/strong&gt; in their browser, Route 53 resolves it to our &lt;strong&gt;EC2 IP&lt;/strong&gt;, and your website loads.&lt;/li&gt;
&lt;li&gt;If later, our site grows and we add a Load Balancer with Auto Scaling, we can update Route 53 to point to the &lt;strong&gt;Load Balancer DNS instead of a static IP&lt;/strong&gt; — ensuring scalability and high availability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So that we can easily setup the &lt;strong&gt;Route53 and make our website live&lt;/strong&gt; and make it more availability.&lt;/p&gt;

&lt;p&gt;🚀Stay tuned for more Blogs and Deployment!!!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>awschallenge</category>
      <category>web</category>
    </item>
    <item>
      <title>🛢RDS Powers a Secure Three-Tier Application on AWS</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Tue, 19 Aug 2025 10:15:47 +0000</pubDate>
      <link>https://dev.to/akashabish/rds-powers-a-secure-three-tier-application-on-aws-25h6</link>
      <guid>https://dev.to/akashabish/rds-powers-a-secure-three-tier-application-on-aws-25h6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;When we design applications in the cloud, it’s not just about running code. It’s about organizing layers, controlling access, and making sure everything scales smoothly. One of the best ways to do this is through a &lt;strong&gt;three-tier architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this blog, I’ll walk you through how &lt;strong&gt;RDS&lt;/strong&gt; fits into a three-tier app on AWS, and we’ll take a &lt;strong&gt;real-world Data Entry Portal&lt;/strong&gt; as our example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Three Tiers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;three-tier&lt;/strong&gt; app is like a relay race. Each tier does its job, then hands over to the next:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Tier&lt;/strong&gt; – The entry point. This is where users connect through a browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Tier&lt;/strong&gt; – The logic hub. It processes requests and applies business rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Tier&lt;/strong&gt; – The memory. It stores and retrieves data whenever the app needs it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On AWS, these tiers are usually split like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Tier&lt;/strong&gt;: EC2 instances behind a Load Balancer in public subnets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Tier&lt;/strong&gt;: EC2 instances in private subnets (no direct internet access).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DB Tier&lt;/strong&gt;: An Amazon RDS instance running MySQL or PostgreSQL in private subnets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Not Connect Directly to RDS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s a common mistake we make:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We connect to RDS from our laptop or from a &lt;strong&gt;single EC2&lt;/strong&gt; using a &lt;strong&gt;public IP&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This might work in a demo, but in real projects &lt;strong&gt;it’s risky&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Databases should never be &lt;strong&gt;publicly accessible&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public IPs change if EC2 is replaced&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Auto Scaling creates multiple &lt;strong&gt;EC2 instances&lt;/strong&gt;, and you can’t keep &lt;strong&gt;whitelisting new IPs&lt;/strong&gt; every time.&lt;/p&gt;

&lt;p&gt;So,Use &lt;strong&gt;Security Groups&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of allowing one &lt;strong&gt;IP&lt;/strong&gt;, We allow the App Tier’s Security Group in the &lt;strong&gt;RDS inbound rules&lt;/strong&gt;. That way, no matter how many &lt;strong&gt;EC2 instances Auto Scaling creates&lt;/strong&gt;, they can all talk to the &lt;strong&gt;database securely&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Example: A Data Entry Portal
&lt;/h2&gt;

&lt;p&gt;Let’s imagine an organization that runs a &lt;strong&gt;Data Entry Portal&lt;/strong&gt; for its employees:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Login through Web Tier&lt;/strong&gt;&lt;br&gt;
Employees visit the portal from their browser. The &lt;strong&gt;request hits the Load Balancer&lt;/strong&gt;, which sends it to one of the web servers (EC2 in the public subnet).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Processing in App Tier&lt;/strong&gt;&lt;br&gt;
The web server hands the &lt;strong&gt;request to the App Tier&lt;/strong&gt;, where the logic runs: checking user permissions, validating data, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Secure Storage in DB Tier&lt;/strong&gt;&lt;br&gt;
Once processed, the data is stored in an &lt;strong&gt;Amazon RDS MySQL database&lt;/strong&gt;. The app tier instances talk to the database &lt;strong&gt;via private IPs only&lt;/strong&gt;, secured with &lt;strong&gt;security groups&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;   Internet User
        ↓
   Load Balancer
        ↓
   Web Tier (EC2 in Public Subnet)
        ↓
   App Tier (EC2 in Private Subnet)
        ↓
   DB Tier (Amazon RDS in Private Subnet)

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

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Scalable&lt;/strong&gt;: Auto Scaling adds EC2s without breaking DB connections.&lt;br&gt;
&lt;strong&gt;Secure&lt;/strong&gt;: RDS never faces the internet.&lt;br&gt;
&lt;strong&gt;Organized&lt;/strong&gt;: Each tier has a clear responsibility.&lt;br&gt;
&lt;strong&gt;Real-World Ready&lt;/strong&gt;: This is the exact setup used in enterprise portals, e-commerce sites, and SaaS platforms.&lt;/p&gt;

&lt;p&gt;If you’re planning your first project on AWS, try this pattern—it’s simple to start with, but powerful enough to grow into large-scale applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay tuned for updates..!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>awschallenge</category>
      <category>webdev</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Smart Routing &amp; Auto Scaling with ALB and ASG in AWS - Part 2</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Sun, 10 Aug 2025 06:44:54 +0000</pubDate>
      <link>https://dev.to/akashabish/smart-routing-auto-scaling-with-alb-and-asg-in-aws-part-2-448e</link>
      <guid>https://dev.to/akashabish/smart-routing-auto-scaling-with-alb-and-asg-in-aws-part-2-448e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction to Application Load Balancer (ALB)
&lt;/h2&gt;

&lt;p&gt;As we went deeper into AWS, we discovered the Application Load Balancer (ALB) a more advanced and flexible version of CLB.&lt;/p&gt;

&lt;p&gt;Unlike CLB, which sends traffic blindly, ALB is context-aware. It looks at the request’s path or hostname and decides which server should handle it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Used ALB: Step-by-Step
&lt;/h2&gt;

&lt;p&gt;1) &lt;strong&gt;Launched EC2 Instances&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One for /app1&lt;/li&gt;
&lt;li&gt;One for /app2&lt;/li&gt;
&lt;li&gt;Each had its own custom index.html&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2)&lt;strong&gt;Created Target Groups&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each group pointed to different EC2s&lt;/li&gt;
&lt;li&gt;Configured health checks on /index.html&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3)&lt;strong&gt;Created an ALB&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selected Internet-facing&lt;/li&gt;
&lt;li&gt;Chose appropriate VPC and Availability Zones&lt;/li&gt;
&lt;li&gt;Enabled HTTP listener on port 80&lt;/li&gt;
&lt;li&gt;Assigned a security group with HTTP and SSH&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4)&lt;strong&gt;Added Path-Based Routing Rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/app1 → Target Group A&lt;/li&gt;
&lt;li&gt;/app2 → Target Group B&lt;/li&gt;
&lt;li&gt;We can also configure host-based routing (e.g., admin.ourapp.com)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-World Example: Online Food Ordering App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;we’re building a Zomato or Swiggy-like app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/menu → Served from one backend&lt;/li&gt;
&lt;li&gt;/checkout → Comes from another backend&lt;/li&gt;
&lt;li&gt;/admin → Managed through a different instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, ALB works like a digital receptionist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It understands our user’s request.&lt;/li&gt;
&lt;li&gt;Then routes it to the correct backend based on the URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What About Auto Scaling Group (ASG)?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once we configured ALB for smart routing, we integrated Auto Scaling Group (ASG) to handle traffic spikes automatically.&lt;/p&gt;

&lt;p&gt;With ASG:&lt;/p&gt;

&lt;p&gt;As traffic increases → New EC2s are launched automatically&lt;/p&gt;

&lt;p&gt;As traffic drops → Unneeded EC2s are terminated&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Example: IPL Live Score App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine we're running a site that shows live cricket scores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;During the match, millions of fans visit the site → ASG launches extra instances&lt;/li&gt;
&lt;li&gt;After the match, traffic reduces → ASG removes the extra machines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile, ALB keeps routing traffic only to the healthy instances.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;ALB gives us smart routing based on URL paths or domains.&lt;/li&gt;
&lt;li&gt;Target Groups help organize and manage our backend services.&lt;/li&gt;
&lt;li&gt;ASG makes our application elastic, scaling with demand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was a game-changing learning experience — and we’re just getting started.&lt;br&gt;
&lt;strong&gt;More AWS experiments coming soon!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awschallenge</category>
      <category>devops</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>📊AWS Load Balancers-Part 1</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Thu, 07 Aug 2025 10:35:45 +0000</pubDate>
      <link>https://dev.to/akashabish/aws-load-balancers-our-traffic-police-in-the-cloud-3ck5</link>
      <guid>https://dev.to/akashabish/aws-load-balancers-our-traffic-police-in-the-cloud-3ck5</guid>
      <description>&lt;h2&gt;
  
  
  What is a Load Balancer?
&lt;/h2&gt;

&lt;p&gt;In cloud computing, traffic isn't just about cars and roads — it’s about user requests and servers. A Load Balancer is like a &lt;strong&gt;traffic police&lt;/strong&gt; officer at a junction, ensuring that vehicles (&lt;strong&gt;requests&lt;/strong&gt;) are evenly distributed to available lanes (&lt;strong&gt;EC2 instances&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Without it, one server might &lt;strong&gt;crash due to heavy traffic&lt;/strong&gt; while another sits idle. AWS Load Balancers help us avoid this by &lt;strong&gt;distributing load&lt;/strong&gt; automatically and intelligently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Load Balancers in AWS:
&lt;/h2&gt;

&lt;p&gt;AWS provides three types of load balancers under the &lt;strong&gt;Elastic Load Balancing (ELB) service&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Classic Load Balancer (CLB)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Legacy option; supports &lt;strong&gt;HTTP, HTTPS, and TCP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Simple &lt;strong&gt;round-robin&lt;/strong&gt; routing&lt;/li&gt;
&lt;li&gt;No advanced routing features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Application Load Balancer (ALB)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Used for &lt;strong&gt;HTTP and HTTPS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;path-based and host-based&lt;/strong&gt; routing&lt;/li&gt;
&lt;li&gt;Ideal for microservices and web apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Network Load Balancer (NLB)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designed for high-performance &lt;strong&gt;TCP and UDP&lt;/strong&gt; traffic&lt;/li&gt;
&lt;li&gt;Great for &lt;strong&gt;gaming, VoIP, real-time video streaming&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Our Hands-On with Classic Load Balancer (CLB):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To understand how CLB works, we created two EC2 instances:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each instance hosted a different &lt;strong&gt;static HTML&lt;/strong&gt; page.&lt;/li&gt;
&lt;li&gt;This allowed us to visually confirm where each request was being routed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a &lt;strong&gt;Classic Load Balancer&lt;/strong&gt; from the ELB dashboard.&lt;/li&gt;
&lt;li&gt;Selected &lt;strong&gt;Internet-facing, configured VPC and availability zones&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enabled &lt;strong&gt;HTTP (port 80) and SSH (port 22)&lt;/strong&gt; in the Security Group.&lt;/li&gt;
&lt;li&gt;Configured health checks using &lt;code&gt;/index.html&lt;/code&gt; to monitor instance status.&lt;/li&gt;
&lt;li&gt;Finally, we attached both instances to the load balancer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we visited the &lt;strong&gt;DNS name of the load balancer in our browser&lt;/strong&gt;, we saw that it was alternating responses between the two EC2 instances thanks to the &lt;strong&gt;round-robin algorithm&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Real World Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Imagine we’re at a food court with multiple counters. There's someone directing customers.&lt;/li&gt;
&lt;li&gt;If one counter is full, they send the next customer to the next available one.&lt;/li&gt;
&lt;li&gt;If a counter shuts down (instance fails), they stop directing people there.&lt;/li&gt;
&lt;li&gt;That’s exactly how CLB works and it's basic, but it gets the job done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;It helped us understand:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How AWS distributes incoming traffic&lt;/li&gt;
&lt;li&gt;The importance of health checks&lt;/li&gt;
&lt;li&gt;Basic availability zone redundancy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if we want smarter routing based on &lt;strong&gt;URL paths or subdomains&lt;/strong&gt;, then it’s time to dive into &lt;strong&gt;ALB&lt;/strong&gt; which we’ll explore in the next blog!📍📢&lt;/p&gt;

</description>
      <category>awschallenge</category>
      <category>aws</category>
      <category>awsbigdata</category>
      <category>devops</category>
    </item>
    <item>
      <title>🌐📶AWS VPC: A Beginner's Guide - Part 2</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Sun, 20 Jul 2025 18:18:53 +0000</pubDate>
      <link>https://dev.to/akashabish/aws-vpc-a-beginners-guide-part-2-3gbo</link>
      <guid>https://dev.to/akashabish/aws-vpc-a-beginners-guide-part-2-3gbo</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;In my last blog, I shared how to launch an &lt;strong&gt;EC2&lt;/strong&gt; instance inside a public subnet in a &lt;strong&gt;custom AWS VPC&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But what if we want more security — like running our application or database servers in a &lt;strong&gt;private subnet, isolated from the internet&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;That’s where things like &lt;strong&gt;Private Subnets, NAT Gateways, and Bastion Hosts&lt;/strong&gt; come in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this blog, We’ll Learn:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up a &lt;strong&gt;private subnet&lt;/strong&gt; in our existing VPC&lt;/li&gt;
&lt;li&gt;Creating a &lt;strong&gt;NAT Gateway&lt;/strong&gt; for internet access (outbound only)&lt;/li&gt;
&lt;li&gt;Using a Bastion Host (jump server) to SSH into the private EC2&lt;/li&gt;
&lt;li&gt;Let’s build a secure network architecture!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recap: Components We Need..!&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;| Component                  | Description                                      |
| -------------------------- | ------------------------------------------------ |
| VPC                        | our existing Virtual Private Cloud              |
| Public Subnet              | Already created for Bastion Host                 |
| Private Subnet             | New subnet with no direct internet access        |
| Internet Gateway (IGW)**   | Already attached to VPC                          |
| NAT Gateway                | Needed for outbound internet from private subnet |
| Route Tables               | One for public, one for private subnet           |
| Bastion Host               | Public EC2 to connect securely to private EC2    |

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

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;1. Use the Existing VPC&lt;/strong&gt;&lt;br&gt;
We’ve already created a VPC (e.g., 10.0.0.0/16), continue using it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Create a Private Subnet&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Subnets &amp;gt; &lt;strong&gt;Create Subnet&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPC: &lt;code&gt;my-custom-vpc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Name: &lt;code&gt;private-subnet&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CIDR block: &lt;code&gt;10.0.2.0/24&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Availability Zone: &lt;strong&gt;Same as NAT Gateway&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Do NOT enable auto-assign public IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Create a NAT Gateway&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;NAT Gateway &amp;gt; Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subnet: &lt;strong&gt;Our Public Subnet&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Elastic IP: Allocate a new one&lt;/li&gt;
&lt;li&gt;Name it: &lt;code&gt;my-nat-gateway&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click Create NAT Gateway&lt;/li&gt;
&lt;li&gt;NAT Gateway must be in a public subnet because it needs internet access via IGW.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Create a Private Route Table&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Route Tables &amp;gt; &lt;strong&gt;Create Route Table&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name: &lt;strong&gt;private-route-table&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;VPC: &lt;strong&gt;my-custom-vpc&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add Route:&lt;/li&gt;
&lt;li&gt;Destination: &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Target: NAT Gateway&lt;/li&gt;
&lt;li&gt;Go to Subnet Associations&lt;/li&gt;
&lt;li&gt;Select our private-subnet&lt;/li&gt;
&lt;li&gt;Now, private subnet has outbound internet access only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Launch EC2 in Private Subnet&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to EC2 &amp;gt; Launch Instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: &lt;strong&gt;private-ec2&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Amazon Linux 2&lt;/li&gt;
&lt;li&gt;Subnet: &lt;strong&gt;private-subnet&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Auto-assign Public IP: Disabled&lt;/li&gt;
&lt;li&gt;Key Pair: Choose existing&lt;/li&gt;
&lt;li&gt;Security Group:&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow SSH from Bastion Host’s internal IP or SG&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;EC2 in private subnet won’t be accessible directly from our local machine.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Use Existing Public EC2 as Bastion Host to Access Private EC2&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect to the Private EC2 (2-Hop SSH):
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Step 1: SSH into our public EC2 (Bastion Host)
ssh -i your-key.pem ec2-user@&amp;lt;Public-IP-of-Bastion&amp;gt;

# Step 2: From inside the Bastion EC2, SSH into the private EC2
ssh -i your-key.pem ec2-user@&amp;lt;Private-IP-of-Private-EC2&amp;gt;

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

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;8. Test Internet Connectivity&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;ping google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it replies, then our NAT Gateway is working properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Points to Remember:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private subnets increase security by not exposing EC2 to the internet directly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAT Gateway&lt;/strong&gt; allows outbound-only access (like updates, package installs)&lt;/li&gt;
&lt;li&gt;Bastion Host is required to &lt;strong&gt;SSH into private EC2&lt;/strong&gt; (jump server setup)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CIDR blocks&lt;/strong&gt; must remain within the &lt;strong&gt;VPC range&lt;/strong&gt; (e.g., 10.0.0.0/16)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thanks for Reading!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’re just getting started with AWS, this guide should help you take that first confident step into cloud networking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy cloud building!&lt;/strong&gt;🙌&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🌐📶AWS VPC: A Beginner's Guide - Part 1</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Sun, 20 Jul 2025 17:29:37 +0000</pubDate>
      <link>https://dev.to/akashabish/aws-vpc-a-beginners-guide-part-1-30ej</link>
      <guid>https://dev.to/akashabish/aws-vpc-a-beginners-guide-part-1-30ej</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I first heard about &lt;strong&gt;VPC (Virtual Private Cloud)&lt;/strong&gt;, it felt overwhelming — &lt;strong&gt;CIDR blocks, subnets, gateways, and route tables&lt;/strong&gt; sounded too complex. But once I broke it down and actually launched an EC2 instance inside a custom VPC, everything started making sense.&lt;/p&gt;

&lt;p&gt;In this blog, We'll learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What a &lt;strong&gt;VPC&lt;/strong&gt; is and why we use it&lt;/li&gt;
&lt;li&gt;Key components like &lt;strong&gt;subnets, gateways, and routing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;How to create a &lt;strong&gt;VPC step-by-step&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;How to &lt;strong&gt;launch an EC2 instance inside it&lt;/strong&gt; and test the internet connection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What is a VPC?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;VPC (Virtual Private Cloud)&lt;/strong&gt; is our &lt;strong&gt;own private space&lt;/strong&gt; in the AWS cloud.Like our own virtual data center, where all our resources (EC2, databases, etc.) live — &lt;strong&gt;securely and privately&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VPC Components and its Explanation:&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;| Component                  | Description                                                            |
| -------------------------- | ---------------------------------------------------------------------- |
| VPC                        | our private cloud with a defined IP range                             |
| Public Subnet              | A subnet that can access the internet                                  |
| Private Subnet             | A subnet isolated from the internet                                    |
| Internet Gateway (IGW)     | Enables resources in public subnet to access the internet              |
| NAT Gateway                | Allows private subnet resources to access the internet (outbound only) |
| Route Table                | Controls routing decisions for subnets                                 |
| Subnet Association         | Binds a route table to a specific subnet                               |
| CIDR                       | IP address range for our VPC (like 10.0.0.0/16)                     |

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What is CIDR?&lt;/strong&gt;&lt;br&gt;
CIDR (Classless Inter-Domain Routing) defines the size of the IP address block for our VPC or subnet.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10.0.0.0/16 gives you ~65,000 IPs&lt;/li&gt;
&lt;li&gt;10.0.1.0/24 gives you 256 IPs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In AWS, VPC CIDRs can range from /16 (biggest) to /28 (smallest). For our demo, we’ll use 10.0.0.0/16.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step: Create a Custom VPC and Launch EC2:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create a VPC&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to VPC Dashboard&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create VPC&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose:&lt;/li&gt;
&lt;li&gt;Name: &lt;code&gt;my-custom-vpc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;IPv4 CIDR block: &lt;code&gt;10.0.0.0/16&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we have a VPC with &lt;strong&gt;65,536 IPs!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Public Subnet&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Subnets &amp;gt; &lt;strong&gt;Create Subnet&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose our VPC: &lt;code&gt;my-custom-vpc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CIDR block: &lt;code&gt;10.0.1.0/24&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Availability Zone: (Choose one)&lt;/li&gt;
&lt;li&gt;Enable auto-assign &lt;strong&gt;public IPv4&lt;/strong&gt; address&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Create and Attach an Internet Gateway (IGW)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Internet Gateways &amp;gt; Create IGW&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name it: &lt;code&gt;my-igw&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt; and then &lt;strong&gt;Attach to VPC&lt;/strong&gt; → &lt;strong&gt;Choose my-custom-vpc&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Create a Route Table&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Route Tables &amp;gt; Create&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name it: &lt;code&gt;my-public-rt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;my-custom-vpc&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;After creating, &lt;strong&gt;click Edit Routes&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;Add route: &lt;strong&gt;Destination 0.0.0.0/0, Target Internet Gateway&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Subnet Associations, attach our Public Subnet&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Now our public subnet is internet-enabled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Launch EC2 inside VPC&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;EC2 &amp;gt; Launch Instance&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose:&lt;/li&gt;
&lt;li&gt;Name: &lt;code&gt;my-ec2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Amazon Linux 2&lt;/li&gt;
&lt;li&gt;Instance type: &lt;code&gt;t2.micro&lt;/code&gt; (Free Tier)&lt;/li&gt;
&lt;li&gt;Key pair: Create or choose existing&lt;/li&gt;
&lt;li&gt;Network: Choose &lt;strong&gt;my-custom-vpc&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Subnet: Choose &lt;strong&gt;my-public-subnet&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Auto-assign Public IP: Enable &lt;/li&gt;
&lt;li&gt;Add Security Group rule:&lt;/li&gt;
&lt;li&gt;Allow SSH from our IP&lt;/li&gt;
&lt;li&gt;Optional: &lt;strong&gt;Allow HTTP/HTTPS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Launch the instance &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Connect to EC2 and Test Internet:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open Git Bash or terminal&lt;/li&gt;
&lt;li&gt;Run
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod 400 your-key.pem
ssh -i your-key.pem ec2-user@&amp;lt;your-public-ip&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;After login:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If we can see replies, our EC2 is connected to the internet via our custom VPC!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Points to Remember:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every subnet must be within the VPC’s CIDR range&lt;/li&gt;
&lt;li&gt;Public subnets require an IGW + correct route table&lt;/li&gt;
&lt;li&gt;Auto-assigning Public IP is essential for internet access&lt;/li&gt;
&lt;li&gt;Security groups act like firewalls — allow only what we need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thanks for reading!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’re just getting started with AWS, this guide should help you take that first confident step into cloud networking.And wait for the next part of &lt;strong&gt;Connecting with Private Subnet and NAT Gateway&lt;/strong&gt;..!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy cloud building!&lt;/strong&gt; ☁️💻🚀&lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>aws</category>
      <category>cloudpractitioner</category>
      <category>awschallenge</category>
    </item>
    <item>
      <title>🔑Mastering AWS IAM: The Beginner-Friendly Way</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Fri, 18 Jul 2025 13:36:31 +0000</pubDate>
      <link>https://dev.to/akashabish/mastering-aws-iam-the-beginner-friendly-way-lgj</link>
      <guid>https://dev.to/akashabish/mastering-aws-iam-the-beginner-friendly-way-lgj</guid>
      <description>&lt;h2&gt;
  
  
  What is IAM?
&lt;/h2&gt;

&lt;p&gt;IAM (Identity and Access Management) is the &lt;strong&gt;heart of AWS&lt;/strong&gt; security. It decides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Who&lt;/strong&gt; can access our AWS account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What&lt;/strong&gt; they can do (read, write, delete, launch etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which services&lt;/strong&gt;/resources they can interact with&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IAM helps us securely control access without sharing our Root account (super admin--my free tier root user acc).&lt;/p&gt;

&lt;h2&gt;
  
  
  IAM Users:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A User = one person with credentials (&lt;strong&gt;username + password or access key&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Created by the &lt;strong&gt;Root user&lt;/strong&gt; (owner of AWS account).&lt;/li&gt;
&lt;li&gt;We give only the &lt;strong&gt;permissions&lt;/strong&gt; they need, nothing more!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m the root user of my &lt;strong&gt;AWS Free Tier&lt;/strong&gt;. I want my friend Sanjay to &lt;strong&gt;learn AWS but not touch everything&lt;/strong&gt;.So I create an &lt;strong&gt;IAM user&lt;/strong&gt; called sanjay, and give him access only to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;VPC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;He now has &lt;strong&gt;his own login&lt;/strong&gt; , and I can use &lt;strong&gt;my root user in my own&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  IAM Groups:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Group = collection of users with common permissions.&lt;/li&gt;
&lt;li&gt;Instead of assigning policies to each user manually, just assign it to the group.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world Example:&lt;/strong&gt;&lt;br&gt;
I have &lt;strong&gt;two teams&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ML Dev Team&lt;/strong&gt; – needs SageMaker, Fargate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fullstack Team&lt;/strong&gt; – needs Amplify, Lambda&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I create &lt;strong&gt;2 groups&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ML-Team: attach &lt;strong&gt;ML-related policies&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;FullStack-Team: attach &lt;strong&gt;web-related policies&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I &lt;strong&gt;add users&lt;/strong&gt; to the respective groups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Giving Admin Powers (Team Leads)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes a user in the group needs more power than others (&lt;strong&gt;like a Team Lead&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;We can do this in 2 ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attach an &lt;strong&gt;additional policy&lt;/strong&gt; to that user&lt;/li&gt;
&lt;li&gt;Use an &lt;strong&gt;Inline Policy&lt;/strong&gt; (explained below)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  IAM Roles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Role = permission container &lt;strong&gt;used by services&lt;/strong&gt;, not users.&lt;/li&gt;
&lt;li&gt;Helps one AWS service talk to another securely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world Example&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I have an EC2 instance that needs to read data from an S3 bucket.&lt;/li&gt;
&lt;li&gt;I create a Role with &lt;code&gt;AmazonS3ReadOnlyAccess&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Then attach the role to the EC2 instance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the &lt;strong&gt;EC2&lt;/strong&gt; can access &lt;strong&gt;S3&lt;/strong&gt; without any access keys. Fully secure..!&lt;/p&gt;
&lt;h2&gt;
  
  
  Inline Policy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A custom policy attached &lt;strong&gt;directly to a user or group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Used for special, &lt;strong&gt;one-time&lt;/strong&gt; permissions.&lt;/li&gt;
&lt;li&gt;Gets deleted if the user is deleted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world Example&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sanjay needs temporary access to &lt;strong&gt;DynamoDB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Instead of creating a new group, I create an &lt;strong&gt;inline policy&lt;/strong&gt; just for him.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Resource Policy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Like Bucket Policy in S3&lt;/li&gt;
&lt;li&gt;Used to control access directly from the resource itself.&lt;/li&gt;
&lt;li&gt;Example: give access to &lt;strong&gt;specific users/folders&lt;/strong&gt; inside an &lt;strong&gt;S3 bucket&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One &lt;strong&gt;S3 bucket&lt;/strong&gt;, two folders: &lt;code&gt;ml/&lt;/code&gt; and &lt;code&gt;nlp/&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User 1&lt;/strong&gt; needs access to &lt;code&gt;ml/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User 2&lt;/strong&gt; needs access to &lt;code&gt;nlp/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will write a &lt;strong&gt;bucket policy&lt;/strong&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:user/user1" },
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::my-bucket/ml/*"
    },
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:user/user2" },
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::my-bucket/nlp/*"
    }
  ]
}

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

&lt;/div&gt;



&lt;p&gt;We can add &lt;strong&gt;multiple users or groups in "Principal"&lt;/strong&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Words
&lt;/h2&gt;

&lt;p&gt;This blog is my &lt;strong&gt;personal IAM notes&lt;/strong&gt;, written after I struggled to understand it and finally cracked it with &lt;strong&gt;real-world examples&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hope it helps fellow beginners and AWS learners .&lt;/p&gt;

&lt;p&gt;Happy Learning, Happy Securing ..!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>aws</category>
      <category>awschallenge</category>
      <category>devops</category>
    </item>
    <item>
      <title>📦EBS vs EFS - Understanding AWS Storage in Simple Terms</title>
      <dc:creator>AKASH S</dc:creator>
      <pubDate>Fri, 18 Jul 2025 06:42:23 +0000</pubDate>
      <link>https://dev.to/akashabish/ebs-vs-efs-understanding-aws-storage-in-simple-terms-900</link>
      <guid>https://dev.to/akashabish/ebs-vs-efs-understanding-aws-storage-in-simple-terms-900</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;When working with Amazon &lt;strong&gt;EC2&lt;/strong&gt; instances in AWS, one important decision we'll face is choosing the right storage option.&lt;/p&gt;

&lt;p&gt;Two popular choices provided by AWS are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EBS&lt;/strong&gt; (Elastic Block Store)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EFS&lt;/strong&gt; (Elastic File System)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But when should we use &lt;strong&gt;EBS&lt;/strong&gt;? And when does &lt;strong&gt;EFS&lt;/strong&gt; make more sense?&lt;br&gt;
Let’s break it down in the most beginner-friendly!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is EBS (Elastic Block Store)?
&lt;/h2&gt;

&lt;p&gt;Imagine EBS as the hard disk attached to our computer &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key points to note down&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block-level&lt;/strong&gt; storage (like HDD or SSD)&lt;/li&gt;
&lt;li&gt;Attached to a &lt;strong&gt;single EC2&lt;/strong&gt; instance at a time&lt;/li&gt;
&lt;li&gt;Stores all your system files, installed packages, project folders, &lt;code&gt;.git, .ssh,&lt;/code&gt; etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent&lt;/strong&gt; — our data stays even after instance shutdown (unless deleted manually)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example Use Case :
&lt;/h2&gt;

&lt;p&gt;we're launching an &lt;strong&gt;EC2 instance to deploy a Flask app&lt;/strong&gt;. we install Python, Docker, and some required libraries. All of this is stored in the EBS volume attached to our EC2. If we stop and restart the EC2, the data remains intact.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is EFS (Elastic File System)?
&lt;/h2&gt;

&lt;p&gt;Now we can think of EFS like a shared Google Drive. It's a network file system that multiple machines can connect to and use at the same time.&lt;br&gt;
&lt;strong&gt;Key points to note down:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File-level&lt;/strong&gt; storage (it save's ad folder and file structure as file explorer in windows)&lt;/li&gt;
&lt;li&gt;Can be mounted on &lt;strong&gt;multiple EC2&lt;/strong&gt; instances simultaneously&lt;/li&gt;
&lt;li&gt;Accessible over a network (&lt;strong&gt;NFS-Network File System)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatically scales&lt;/strong&gt; as we store more data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example Use Case :
&lt;/h2&gt;

&lt;p&gt;Like we're part of a team using multiple EC2 instances to work on a shared dataset. we store that data in EFS, so everyone’s &lt;strong&gt;EC2 can read and write to it at the same time — like a shared workspace.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table Comparison from Chat-GPT:&lt;/strong&gt;&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%2Figsynqov1y72ah5m7awe.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%2Figsynqov1y72ah5m7awe.png" alt=" " width="699" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;EBS → Like your &lt;strong&gt;personal hard disk&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;EFS → Like a shared &lt;strong&gt;Google Drive folder for your team&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this helped you understand &lt;strong&gt;EBS&lt;/strong&gt; vs &lt;strong&gt;EFS&lt;/strong&gt; better, drop a ❤️ and let me know your thoughts in the comments. Happy Cloud Learning! ☁️💻&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
