<?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: M Ahmar</title>
    <description>The latest articles on DEV Community by M Ahmar (@m_ahmer_8d4ccaa480ee051e1).</description>
    <link>https://dev.to/m_ahmer_8d4ccaa480ee051e1</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%2F3610795%2F70a87341-04fd-409d-a904-a6784d5bd946.png</url>
      <title>DEV Community: M Ahmar</title>
      <link>https://dev.to/m_ahmer_8d4ccaa480ee051e1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/m_ahmer_8d4ccaa480ee051e1"/>
    <language>en</language>
    <item>
      <title>Building a Serverless Student Management System Using AWS (Lambda, API Gateway, DynamoDB, S3 &amp; CloudFront)</title>
      <dc:creator>M Ahmar</dc:creator>
      <pubDate>Fri, 14 Nov 2025 06:51:50 +0000</pubDate>
      <link>https://dev.to/m_ahmer_8d4ccaa480ee051e1/building-a-serverless-student-management-system-using-aws-lambda-api-gateway-dynamodb-s3--1j31</link>
      <guid>https://dev.to/m_ahmer_8d4ccaa480ee051e1/building-a-serverless-student-management-system-using-aws-lambda-api-gateway-dynamodb-s3--1j31</guid>
      <description>&lt;p&gt;In this project, I built a fully serverless Student Management Web App using AWS.&lt;br&gt;
The application allows users to insert student data and retrieve existing student records, using:&lt;/p&gt;

&lt;p&gt;AWS Lambda&lt;/p&gt;

&lt;p&gt;DynamoDB&lt;/p&gt;

&lt;p&gt;API Gateway&lt;/p&gt;

&lt;p&gt;S3 Static Hosting&lt;/p&gt;

&lt;p&gt;CloudFront CDN&lt;/p&gt;

&lt;p&gt;This article contains everything needed to recreate the project from scratch&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Create DynamoDB Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to DynamoDB&lt;/p&gt;

&lt;p&gt;Click Create Table&lt;/p&gt;

&lt;p&gt;Table name → studentData&lt;/p&gt;

&lt;p&gt;Partition key → studentid (String)&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%2Fk50itlb01b1cx8cgmnfh.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%2Fk50itlb01b1cx8cgmnfh.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&gt;
Create table&lt;/p&gt;

&lt;p&gt;💡 Make sure the partition key exactly matches your Lambda code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🟧 2. Create IAM Role for Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to IAM → Roles → Create Role&lt;/p&gt;

&lt;p&gt;Use case → Lambda&lt;/p&gt;

&lt;p&gt;Attach policy:&lt;br&gt;
✔ AmazonDynamoDBFullAccess&lt;/p&gt;

&lt;p&gt;Name → lambda-dynamodb-full-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%2Fysj8u656yzs4amcg99yy.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%2Fysj8u656yzs4amcg99yy.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create role&lt;br&gt;
&lt;strong&gt;🟩 3. Create Lambda Function – GET Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open AWS Lambda&lt;/p&gt;

&lt;p&gt;Create function → Python 3.12&lt;/p&gt;

&lt;p&gt;Execution role → Use existing role&lt;/p&gt;

&lt;p&gt;Select lambda-dynamodb-full-access&lt;/p&gt;

&lt;p&gt;Paste code from getstudents.py&lt;/p&gt;

&lt;p&gt;Deploy&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🟩 4. Create Lambda Function – INSERT Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create function → Python 3.12&lt;/p&gt;

&lt;p&gt;Execution role → Use existing role&lt;/p&gt;

&lt;p&gt;Select lambda-dynamodb-full-access&lt;/p&gt;

&lt;p&gt;Paste code from insertstudentdata.py&lt;/p&gt;

&lt;p&gt;Deploy&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔵5. Build REST API with API Gateway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to API Gateway&lt;/p&gt;

&lt;p&gt;Choose Build under REST API&lt;/p&gt;

&lt;p&gt;API name → anything&lt;/p&gt;

&lt;p&gt;Endpoint type → Edge Optimized&lt;/p&gt;

&lt;p&gt;Click Create API&lt;/p&gt;

&lt;p&gt;Create Methods&lt;br&gt;
GET Method&lt;/p&gt;

&lt;p&gt;Resource /&lt;/p&gt;

&lt;p&gt;Create Method → GET&lt;/p&gt;

&lt;p&gt;Integration → Lambda&lt;/p&gt;

&lt;p&gt;Choose GET Lambda (function-1)&lt;/p&gt;

&lt;p&gt;POST Method&lt;/p&gt;

&lt;p&gt;Resource /&lt;/p&gt;

&lt;p&gt;Create Method → POST&lt;/p&gt;

&lt;p&gt;Integration → Lambda&lt;/p&gt;

&lt;p&gt;Choose POST Lambda (function-2)&lt;/p&gt;

&lt;p&gt;Enable CORS&lt;/p&gt;

&lt;p&gt;Select resource&lt;/p&gt;

&lt;p&gt;Click Enable CORS&lt;/p&gt;

&lt;p&gt;Deploy API&lt;/p&gt;

&lt;p&gt;Deploy → New stage → prod&lt;/p&gt;

&lt;p&gt;Copy Invoke URL&lt;/p&gt;

&lt;p&gt;Paste this URL inside your script.js&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%2Ff29knflf28q3hmuqh8yd.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%2Ff29knflf28q3hmuqh8yd.png" alt=" " width="800" height="366"&gt;&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;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🟣 6. Create S3 Bucket for Front-End&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to S3 → Create bucket&lt;/p&gt;

&lt;p&gt;Block Public Access → Enabled (default)&lt;/p&gt;

&lt;p&gt;Upload index.html and script.js&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;🟠 7. Enable Static Website Hosting in S3&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Go to Properties&lt;/p&gt;

&lt;p&gt;Scroll to Static Website Hosting&lt;/p&gt;

&lt;p&gt;Enable&lt;/p&gt;

&lt;p&gt;Set:&lt;/p&gt;

&lt;p&gt;Index document → index.html&lt;/p&gt;

&lt;p&gt;Error document → index.html&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%2Fw1cl4plghfszwtl0rkq0.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%2Fw1cl4plghfszwtl0rkq0.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🟢 8. Write S3 Bucket Policy for CloudFront Access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since the bucket will be private, CloudFront needs explicit access.&lt;/p&gt;

&lt;p&gt;You will add a policy like:&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": [
    {
      "Sid": "AllowCloudFrontAccess",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-bucket-name/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::YOUR-ACCOUNT-ID:distribution/YOUR-DISTRIBUTION-ID"
        }
      }
    }
  ]
}

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

&lt;/div&gt;



&lt;p&gt;Replace the 3 fields:&lt;/p&gt;

&lt;p&gt;your-bucket-name&lt;/p&gt;

&lt;p&gt;your AWS account ID&lt;/p&gt;

&lt;p&gt;your CloudFront distribution ID&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔵 9. Create CloudFront Distribution for S3 Website&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to CloudFront&lt;/p&gt;

&lt;p&gt;Click Create Distribution&lt;/p&gt;

&lt;p&gt;Key Settings&lt;/p&gt;

&lt;p&gt;Origin domain → Your S3 bucket&lt;/p&gt;

&lt;p&gt;Origin access → Origin Access Control (OAC) → Create new&lt;/p&gt;

&lt;p&gt;Viewer protocol policy → Redirect HTTP to HTTPS&lt;/p&gt;

&lt;p&gt;Default root object → index.html&lt;/p&gt;

&lt;p&gt;Important:&lt;/p&gt;

&lt;p&gt;✔ Make the S3 bucket private&lt;br&gt;
✔ CloudFront will access the bucket using OAC&lt;/p&gt;

&lt;p&gt;Finish creation&lt;/p&gt;

&lt;p&gt;Copy the CloudFront Distribution Domain Name&lt;br&gt;
(example: d123xyzabcdef.cloudfront.net)&lt;/p&gt;

&lt;p&gt;💡 Use this URL as your website link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔵 10. Add CORS Rules to S3 (Optional)&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;[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET", "POST", "PUT", "DELETE", "HEAD"],
    "AllowedOrigins": ["*"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3000
  }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 Final Output&lt;/p&gt;

&lt;p&gt;Your system now supports:&lt;/p&gt;

&lt;p&gt;✔ Insert student data (POST Lambda)&lt;br&gt;
✔ Fetch student data (GET Lambda)&lt;br&gt;
✔ API communication through API Gateway&lt;br&gt;
✔ Data stored in DynamoDB&lt;br&gt;
✔ Frontend hosted on S3&lt;br&gt;
✔ Distributed globally using CloudFront&lt;br&gt;
✔ Secure bucket access using OAC&lt;br&gt;
✔ CORS enabled&lt;br&gt;
✔ Fully serverless and scalable&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;📝 Conclusion&lt;br&gt;
*&lt;/em&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%2Fcjsnkpv2jg1lsmug71wv.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%2Fcjsnkpv2jg1lsmug71wv.png" alt=" " width="800" height="596"&gt;&lt;/a&gt;&lt;br&gt;
This project is perfect for learning:&lt;/p&gt;

&lt;p&gt;Serverless backend development&lt;/p&gt;

&lt;p&gt;DynamoDB NoSQL design&lt;/p&gt;

&lt;p&gt;Lambda with Python&lt;/p&gt;

&lt;p&gt;API Gateway routing&lt;/p&gt;

&lt;p&gt;Secure S3 hosting&lt;/p&gt;

&lt;p&gt;CloudFront CDN integration&lt;/p&gt;

&lt;p&gt;IAM roles and permissions&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>cloudformation</category>
      <category>lambda</category>
      <category>s3</category>
    </item>
  </channel>
</rss>
