Cloud Resume Challenge
A breakdown of how this website is deployed and hosted on AWS every service, every tool, and what each one demonstrates in terms of real cloud skills.
Architecture · Terraform
Service Breakdown
Amazon S3
All the HTML, CSS, and JS files for this site live in an S3 bucket. S3 is object storage cheap, durable, and scales automatically. The bucket is configured for static website hosting with public-read access blocked at bucket level (CloudFront handles delivery instead).
Amazon CloudFront
CloudFront sits in front of S3 and serves the site from edge locations globally so visitors get fast load times regardless of where they are. It also handles HTTPS via an ACM (AWS Certificate Manager) certificate, meaning the site runs securely on a custom domain.
Amazon Route 53
Route 53 will handle the DNS for the custom domain pointing it at the CloudFront distribution. This demonstrates understanding of DNS records (A records, CNAME, aliases), hosted zones, and how domain resolution works in AWS.
AWS Lambda
A serverless Python function that runs whenever someone visits the site it reads the current visitor count from DynamoDB, increments it, and returns the value. No server to manage, no cost when idle. This is the core of the Cloud Resume Challenge's backend requirement.
Amazon DynamoDB
A single DynamoDB table stores the visitor counter. DynamoDB is a NoSQL key-value database fully managed, serverless, and scales to any load. For this use case it's overkill, but that's the point: learning when and how to use it.
GitHub Actions
Every time I push code to the GitHub repo, a GitHub Actions workflow automatically syncs the updated files to S3 and invalidates the CloudFront cache. No manual uploads the pipeline handles deployment. This demonstrates real DevOps practice.
AWS IAM
IAM roles and policies control what each service can access. Lambda gets a role that only allows it to read/write the specific DynamoDB table. GitHub Actions uses an IAM user with only the permissions needed to deploy. Least privilege principle throughout.
AWS Certificate Manager
ACM provisions and manages the HTTPS certificate for the custom domain. It handles renewal automatically no manual certificate management. Attached to the CloudFront distribution so all traffic is encrypted in transit.
Amazon API Gateway
API Gateway creates a public HTTPS endpoint that the frontend JavaScript can call to trigger the Lambda visitor counter. It handles routing, request validation, and CORS connecting the frontend to the serverless backend cleanly.
Bonus Feature
The contact form on this site does not just send an email and disappear. Every message submitted gets stored in DynamoDB via a Lambda function triggered by API Gateway. That means I have a record of every message in the cloud, queryable, durable, and fully serverless. It also gives this project a real two-way data flow to demonstrate, not just static hosting.
What gets stored
Name, email, message body, timestamp, unique message ID
Cost to run
Effectively zero. Lambda and DynamoDB free tier covers thousands of messages per month
Why it matters
Demonstrates a real serverless write pattern, not just static hosting
Why This Project
Security
Security isn't an afterthought here — it's built into every layer. This is what a secure-by-default serverless deployment looks like in practice.
Security posture summary
No public S3
Bucket is private. CloudFront OAC is the only entity that can read files.
No persistent credentials
OIDC for CI/CD, IAM roles for Lambda. Zero long-lived access keys in the codebase.
Encrypted in transit + at rest
HTTPS enforced by CloudFront. DynamoDB encrypted by default. TLS 1.2 minimum.
Cost Breakdown
One thing that separates people who understand the cloud from people who just use it: knowing what things cost. Here is a real monthly estimate for this entire stack, broken down by service, with free tier limits noted where they apply.
Assumptions: personal portfolio site, ~1,000 visitors/month, ~50 contact form submissions/month, files totalling ~5MB.
After free tier ends
CloudFront and API Gateway free tiers expire after 12 months. After that, estimated cost rises to roughly $0.60/month at this traffic level. Still less than a coffee.
If traffic scaled 100x
100,000 visitors/month would cost roughly $2-4/month. The serverless architecture means cost scales linearly with actual usage, no idle server costs.
Domain cost
The only real fixed cost is the domain name itself (~$12/year) plus the Route 53 hosted zone ($0.50/month). Everything else is effectively free at this scale.
Want to verify these numbers yourself?
AWS Pricing Calculator →Infrastructure as Code
This project is being provisioned with Terraform. Every resource — the S3 bucket, CloudFront distribution, Lambda functions, DynamoDB tables, API Gateway, IAM roles — will be defined as code in a single Terraform config. One terraform apply to build the entire stack from scratch. That is Infrastructure as Code, and it is how real engineering teams work.
Why this matters to employers
Reproducibility
Spin up an identical environment in minutes. No more "works on my account" problems. Every environment, dev, staging, prod, is built from the same code.
Version control
Infrastructure changes go through pull requests like any other code. You can see who changed what, when, and roll back if something breaks.
It's on the job spec
Almost every cloud engineer role lists Terraform or CloudFormation. Understanding what IaC is and why it exists puts you ahead of candidates who have only ever used the console.
The goal: every resource in this stack defined as Terraform HCL. Run terraform apply once and the entire infrastructure comes up. Run terraform destroy and it's gone cleanly. No orphaned resources, no manual steps, no drift.