<?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: Faheem abid 011</title>
    <description>The latest articles on DEV Community by Faheem abid 011 (@faheem_abid011_4eaf853dc).</description>
    <link>https://dev.to/faheem_abid011_4eaf853dc</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%2F3615373%2F17dad0f0-614d-487e-85f4-1b4feaef935d.jpg</url>
      <title>DEV Community: Faheem abid 011</title>
      <link>https://dev.to/faheem_abid011_4eaf853dc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/faheem_abid011_4eaf853dc"/>
    <language>en</language>
    <item>
      <title>Building a Serverless Student Management System Using AWS (Lambda, API Gateway, DynamoDB, S3 &amp; CloudFront)</title>
      <dc:creator>Faheem abid 011</dc:creator>
      <pubDate>Wed, 19 Nov 2025 09:23:31 +0000</pubDate>
      <link>https://dev.to/faheem_abid011_4eaf853dc/building-a-serverless-student-management-system-using-aws-lambda-api-gateway-dynamodb-s3--46i0</link>
      <guid>https://dev.to/faheem_abid011_4eaf853dc/building-a-serverless-student-management-system-using-aws-lambda-api-gateway-dynamodb-s3--46i0</guid>
      <description>&lt;p&gt;In this project, I designed and deployed a complete serverless Student Management application using AWS services.&lt;br&gt;
The system lets users add new student records and retrieve existing data, powered entirely by:&lt;/p&gt;

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

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

&lt;p&gt;API Gateway (REST API)&lt;/p&gt;

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

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

&lt;p&gt;IAM (Role-based permissions)&lt;/p&gt;

&lt;p&gt;This article contains everything needed to recreate the project from scratch&lt;br&gt;
&lt;strong&gt;1. Create DynamoDB Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open DynamoDB in the AWS Console&lt;/p&gt;

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

&lt;p&gt;Set:&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%2F8ct5m66x65uzo91v00vh.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%2F8ct5m66x65uzo91v00vh.png" alt=" " width="800" height="346"&gt;&lt;/a&gt;&lt;br&gt;
Create the table.&lt;/p&gt;

&lt;p&gt;🔎 Ensure the partition key name matches exactly with the name used inside your Lambda functions.&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;Select Lambda as the use case&lt;/p&gt;

&lt;p&gt;Attach the policy: AmazonDynamoDBFullAccess&lt;/p&gt;

&lt;p&gt;Name it: 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%2Ftaifdl9807zdvnqprlsr.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%2Ftaifdl9807zdvnqprlsr.png" alt=" " width="800" height="344"&gt;&lt;/a&gt;&lt;br&gt;
Create the role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Create Lambda Function – Fetch Students (GET)&lt;/strong&gt;&lt;/p&gt;

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

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

&lt;p&gt;Choose Python 3.12&lt;/p&gt;

&lt;p&gt;Select Use an existing role&lt;/p&gt;

&lt;p&gt;Pick the role: lambda-dynamodb-full-access&lt;/p&gt;

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

&lt;p&gt;Deploy the function&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Create Lambda Function – Insert Students (POST)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Repeat the same steps as the GET function:&lt;/p&gt;

&lt;p&gt;Create a new Lambda (Python 3.12)&lt;/p&gt;

&lt;p&gt;Choose the same IAM role&lt;/p&gt;

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

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

&lt;p&gt;*&lt;em&gt;5. Build REST API Using API Gateway&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Open API Gateway&lt;/p&gt;

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

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

&lt;p&gt;API name: any&lt;/p&gt;

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

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

&lt;p&gt;Add Methods&lt;/p&gt;

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

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

&lt;p&gt;Method: GET&lt;/p&gt;

&lt;p&gt;Integration type: Lambda&lt;/p&gt;

&lt;p&gt;Select the GET Lambda function&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%2Feghbqmpqwemkgp1wk04r.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%2Feghbqmpqwemkgp1wk04r.png" alt=" " width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

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

&lt;p&gt;Select the POST Lambda function&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%2F4fwz7r1wuougi19fx2be.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%2F4fwz7r1wuougi19fx2be.png" alt=" " width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

&lt;p&gt;Add it to your script.js&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Create S3 Bucket for Hosting the Website&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Keep Block Public Access ON&lt;/p&gt;

&lt;p&gt;Upload:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;script.js&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Enable Static Website Hosting in S3&lt;/strong&gt;&lt;/p&gt;

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

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

&lt;p&gt;Enable it and 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%2F6uxy88fj5r0xmajkcb18.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%2F6uxy88fj5r0xmajkcb18.png" alt=" " width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Allow CloudFront to Access S3 (Bucket Policy)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since your bucket will remain private, CloudFront needs permission to read files.&lt;/p&gt;

&lt;p&gt;Use this policy template:&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:&lt;/p&gt;

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

&lt;p&gt;YOUR-ACCOUNT-ID&lt;/p&gt;

&lt;p&gt;YOUR-DISTRIBUTION-ID&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Create CloudFront Distribution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open CloudFront&lt;/p&gt;

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

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

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

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

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

&lt;p&gt;Default Root Object: index.html&lt;br&gt;
Ensure:&lt;br&gt;
✔ Your S3 bucket is private&lt;br&gt;
✔ CloudFront accesses S3 using OAC&lt;/p&gt;

&lt;p&gt;Create the distribution.&lt;/p&gt;

&lt;p&gt;Copy the CloudFront URL:&lt;/p&gt;

&lt;p&gt;dxxxxxx.cloudfront.net&lt;/p&gt;

&lt;p&gt;This becomes your main website link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Add CORS to S3 (Optional but Recommended)&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 serverless system now supports:&lt;/p&gt;

&lt;p&gt;✔ Adding student records (POST Lambda)&lt;br&gt;
✔ Fetching student data (GET Lambda)&lt;br&gt;
✔ API handling with API Gateway&lt;br&gt;
✔ Fast NoSQL storage using DynamoDB&lt;br&gt;
✔ S3 hosting for the front-end&lt;br&gt;
✔ CloudFront as a secure CDN&lt;br&gt;
✔ OAC-based private bucket access&lt;br&gt;
✔ Proper CORS configuration&lt;br&gt;
✔ 100% serverless, scalable, and cost-efficient architecture&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&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%2F3fgi8lff63ezb2pshbix.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%2F3fgi8lff63ezb2pshbix.png" alt=" " width="800" height="317"&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%2Fpzx9odzqej1ujosa4zq2.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%2Fpzx9odzqej1ujosa4zq2.png" alt=" " width="800" height="160"&gt;&lt;/a&gt;&lt;br&gt;
This project is an excellent introduction to:&lt;/p&gt;

&lt;p&gt;Serverless development on AWS&lt;/p&gt;

&lt;p&gt;Working with DynamoDB&lt;/p&gt;

&lt;p&gt;Writing Lambda functions in Python&lt;/p&gt;

&lt;p&gt;Building APIs with API Gateway&lt;/p&gt;

&lt;p&gt;Hosting static websites on S3&lt;/p&gt;

&lt;p&gt;Using CloudFront for global delivery&lt;/p&gt;

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

</description>
      <category>cloudcomputing</category>
      <category>webdev</category>
      <category>serverless</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
