This project deploys a static resume as a fully serverless AWS application with a live visitor counter. A browser request hits CloudFront, which serves cached HTML/CSS/JS from an S3 bucket over HTTPS. Client-side JavaScript then calls an API Gateway endpoint, which invokes a Lambda function that atomically increments a counter stored in DynamoDB. Every layer here maps directly to a production pattern: S3 for static assets, CloudFront for CDN + TLS, API Gateway as the HTTP front door, Lambda for stateless compute, and DynamoDB for low-latency key-value storage. GitHub Actions ties it together with automated test-and-deploy pipelines for both the frontend and backend. [ Browser ] | v [ CloudFront ] (HTTPS, edge caching) | v [ S3 Bucket ] (HTML / CSS / JS) | v (JS fetch call) [ API Gateway ] (GET /count) | v [ Lambda Function ] (Python, boto3) | v [ DynamoDB Table ] (visitor count) > 📌 **Remember:** Every service used here fits inside the AWS Free Tier at this traffic volume — S3, CloudFront, Lambda, DynamoDB, and API Gateway all have generous free allowances. ### What each service actually does (read this before you start) If you are new to AWS, here is what each of the five services is, in plain terms, before you touch any commands: * **S3 (Simple Storage Service)** is object storage — think of it like a folder in the cloud that can hold any file. It has a special mode called "static website hosting" that lets it serve HTML/CSS/JS files directly to a browser, like a basic web server, but with no server for you to manage or patch. * **CloudFront** is a Content Delivery Network (CDN). It copies your files to data centers around the world so people load your site from a server near them instead of one far away. It also gives you free HTTPS — S3 alone cannot do this. * **DynamoDB** is a NoSQL database — a place to store simple pieces of data (like a visitor count) without needing to design tables and relationships the way you would in MySQL or PostgreSQL. You just store a key and a value. * **Lambda** is a way to run a small piece of code (a "function") without owning or managing a server. AWS runs your Python code only when something triggers it, and you are billed only for the milliseconds it actually runs. * **API Gateway** is the "front door" that lets a browser call your Lambda function over the internet. A browser cannot call Lambda directly — API Gateway turns your function into a normal HTTPS URL the browser can `fetch()`. Together: the browser loads your resume from CloudFront/S3, then JavaScript on the page quietly asks API Gateway "how many people have visited?", API Gateway wakes up Lambda, Lambda adds 1 to the number stored in DynamoDB and hands the new number back, and your page displays it.
\n