Travis Pollard
whoamitravis@travispollard.comCloud / DevOps Engineer_Architecture

# Request pathRoute 53 resolves travispollard.com and www.travispollard.com to the CloudFront distribution via alias recordsCloudFront terminates TLS with an ACM certificate (SNI, TLS 1.2 minimum) and redirects any HTTP request to HTTPSCache misses fall through to the S3 static website origin holding the exported Next.js buildThe visitor counter calls API Gateway, which invokes a Python Lambda that increments a DynamoDB item and returns the count# Commit to production1. A push to the repository triggers the CodePipeline source stage2. CodeBuild installs dependencies with npm ci and installs Playwright browsers3. next build produces a fully static export of the site into frontend/out4. Playwright smoke tests run against the build before anything ships5. The build artifact is published to the S3 bucket that backs the CloudFront distributionInfrastructure
| Resource | Configuration |
|---|---|
| S3 | Static website hosting for the exported Next.js build |
| CloudFront | Global CDN, TLS 1.2_2021 minimum, HTTP to HTTPS redirect, compression, PriceClass_100 |
| Route 53 | Hosted zone with alias, MX, NS, and SOA records, plus ACM validation records |
| ACM | TLS certificate for the apex and www names, DNS validated through Route 53 |
| API Gateway + Lambda + DynamoDB | Visitor counter written in Python with boto3 |
| CodePipeline + CodeBuild | Build, test, and deploy on every push, defined in buildspec.yml |
| Terraform | Every resource above is defined in modules: route53, s3, acm, cloudfront |
Writeup
I wrote about building this stack end to end, from an empty S3 bucket to a working CI/CD pipeline: From S3 to CI/CD: My Cloud Resume Challenge Journey
Source
The Terraform configuration and the Next.js frontend for this site live in one repository: github.com/jtravisp/travispollard.com