A serverless resume website built on AWS Cloud, with automatic deployment with GitHub Actions. Using Terraform, we have created Infrastructure as Code (IaC) for automatic service management.
Visit: https://james-hodson.com
- Frontend: Static site hosted on S3, delivered via CloudFront
- Backend: Serverless API using API Gateway and Lambda (Python)
- Database: DynamoDB for visitor count storage
- DNS & SSL: Route 53 and AWS Certificate Manager
- Analytics: CloudFront logs analyzed with AWS Glue and Athena
- Static Site Generator: Eleventy (11ty)
- Cloud Provider: AWS
- Infrastructure: S3, CloudFront, Route 53, API Gateway, Lambda, DynamoDB, GitHub Actions
- Languages: HTML, CSS, JavaScript, Python
- Analytics: AWS Glue, Athena
- Python 3.12+
- Node.js 18+
- AWS CLI with SSO configured
- Terraform 1.0+
- uv
git clone git@github.com:jamesdidathing/cloud-site.git
cd cloud-siteHomebrew:
brew install uv# Install Python (if not already installed)
uv python install 3.12
# Create virtual environment and install dependencies
uv sync --all-extras
# Activate the environment
source .venv/bin/activate # macOS/Linuxnpm install# Run Lambda function unit tests
uv run pytest tests/test_lambda.py -v# Install Playwright browsers (first time only)
uv run playwright install chromium
# Run E2E tests
uv run pytest tests/test_website.py -vOn every push to main/develop:
- ✅ Run unit tests
- ✅ Lint with Ruff
- ✅ Type checking with Ty
- ✅ Check code formatting
Manual deployment trigger:
- ✅ Run all tests
- ✅ Build Eleventy site
- ✅ Deploy to S3
- ✅ Invalidate CloudFront
- ✅ Run E2E tests
.
├── .github/
│ └── workflows/ # CI/CD workflows
├── lambda/
│ ├── visitor_counter.py # Visitor counter Lambda
│ └── event_writer.py # S3 event writer Lambda
├── terraform/
│ ├── main.tf # Infrastructure definitions
│ ├── variables.tf # Input variables
│ ├── outputs.tf # Output values
│ └── cloudfront-function.js
├── tests/
│ ├── test_lambda.py # Unit tests
│ └── test_website.py # E2E tests
├── src/ # Eleventy source files
├── pyproject.toml # Python dependencies & config
├── uv.lock # Dependency lockfile
├── package.json # Node.js dependencies
└── .eleventy.js # Eleventy configuration
Built as part of the Cloud Resume Challenge