Pulumi Challenge Submission: Interactive Resume Deployment
Live Demo | github page | GitHub Repository
What I Built ๐ ๏ธ
I created and deployed an interactive resume website using modern web technologies and Pulumi's infrastructure-as-code capabilities. The solution features:
- Single-page React application with animations and glassmorphism design
- AWS Cloud Infrastructure (S3 + CloudFront) provisioned through code
- CI/CD-ready configuration
- Cost-optimized architecture (<$1/month)
- Responsive design for all devices
Key Technical Features:
- Scroll progress indicator
- Animated skill matrix
- Expandable project cards
- Dark/light theme toggle
- AWS CloudFront CDN caching
- HTTPS enforcement
Project Structure ๐
interactive-resume/
โโโ frontend/ # React application
โ โโโ public/ # Static assets
โ โโโ src/ # Components & styles
โ โโโ package.json # Frontend dependencies
โ
โโโ infra/ # Pulumi infrastructure
โ โโโ index.ts # AWS resource definitions
โ โโโ Pulumi.yaml # Project configuration
โ โโโ Pulumi.dev.yaml # Development stack config
โ
โโโ README.md # Deployment documentation
Technical Stack ๐ป
Component | Technologies Used |
---|---|
Frontend | React, TypeScript, Framer Motion, Styled Components |
Infrastructure | Pulumi (TypeScript), AWS S3, CloudFront |
DevOps | GitHub Actions, AWS CLI |
Design | Glassmorphism, CSS Animations |
My Journey ๐งญ
Initial Challenges ๐ง
- Pulumi Configuration "Error: Missing required configuration variable 'interactive-resume:aws:region' Solution: Learned Pulumi's namespacing pattern:
pulumi config set aws:region us-east-1
- TypeScript Build Issues "Could not find entry point 'index.js'" Solution: Added proper TypeScript configuration:
{
"compilerOptions": {
"outDir": "./bin",
"rootDir": "./"
}
}
- CloudFront-S3 Permissions "403 Access Denied" errors Solution: Implemented Origin Access Identity:
const oai = new aws.cloudfront.OriginAccessIdentity("oai");
Key Learnings ๐
-
Infrastructure as Code Benefits
- Reproducible environments
- Version-controlled infrastructure
- Easy tear-down with
pulumi destroy
-
AWS Cost Optimization
- Using CloudFront Price Class 100
- S3 Intelligent-Tier storage
- Free TLS certificates via ACM
-
CI/CD Patterns
- Automated S3 deployments
- Cache invalidation workflows
- Environment-specific configurations
Deployment Walkthrough ๐
Prerequisites
- AWS account with CLI credentials
- Pulumi CLI installed
- Node.js v18+
Step-by-Step Process
- Clone Repository
git clone https://github.com/mahesh-space/interactive-resume.git
- Frontend Setup
cd frontend
npm install
npm run build
- Infrastructure Deployment
cd ../infra
npm install
pulumi stack init dev
pulumi config set aws:region us-east-1
pulumi up
Deployment Architecture:
graph LR
A[User] --> B[CloudFront CDN]
B --> C[S3 Bucket]
C --> D[Static Website Files]
D --> E[React Application]
Pulumi Implementation Details โ๏ธ
Key Resources Provisioned:
// Create S3 bucket
const siteBucket = new aws.s3.Bucket("resumeBucket", {
website: {
indexDocument: "index.html",
errorDocument: "404.html",
},
acl: "private",
});
// Configure CloudFront
const cdn = new aws.cloudfront.Distribution("cdn", {
enabled: true,
defaultCacheBehavior: { /* ... */ },
origins: [{
s3OriginConfig: {
originAccessIdentity: oai.cloudfrontAccessIdentityPath,
},
}],
});
Notable Configurations:
- S3 bucket policy restricting access to CloudFront
- Cache headers optimization
- Error document handling
- Cost monitoring tags
Best Practices Implemented โ
-
Security
- S3 bucket private by default
- HTTPS enforcement
- IAM least privilege principle
-
Performance
- Global CDN distribution
- Brotli compression
- Cache-control headers
-
Maintainability
- Separated frontend/infra codebases
- Detailed documentation
- Environment-specific configs
Future Improvements ๐ฎ
- Add CI/CD pipeline with GitHub Actions
- Implement visitor counter using Lambda@Edge
- Add automated accessibility testing
- Create staging/production environments
Top comments (2)
Nicely done! Everything was very transparent and very well documented.
Thank you so much for the kind words! Iโm really glad to hear that everything was clear and well-documented. If you have any questions or need further details, feel free to reach out!