This is a submission for the Pulumi Deploy and Document Challenge: Fast Static Website Deployment
What I Built
A statically generated portfolio website using Hugo and deployed to AWS using Pulumi. The project automates provisioning of an S3 bucket for hosting, CloudFront CDN for distribution, and Route53 DNS records. Includes automated HTTPS via ACM certificates and integrates GitHub Actions for CI/CD.
The README includes:
Full architecture diagram
Environment setup instructions
Pulumi deployment walkthrough
Cost estimation guide
Security hardening practices
My Journey
Initial Setup: Spent 2 hours learning Pulumi's TypeScript SDK and AWS provider structure
Core Implementation:
Generated Hugo site with custom theme
Configured S3 bucket with public-read access and static website hosting
Set up CloudFront distribution with custom domain and SSL
- Challenges:
DNS propagation delays with Route53
Configuring correct CORS policies for CDN
Debugging Pulumi preview vs actual deployment differences
- Solutions:
Implemented Pulumi's
waitUntil
for resource stabilizationUsed Terraform CDK patterns for complex resource relationships
Added comprehensive unit tests with Pulumi Test Framework
Using Pulumi
Pulumi was chosen for its:
Strong TypeScript support with real TypeScript typing
Multi-cloud capabilities (could easily port to Azure/GCP)
Resource dependency visualization in VSCode
Rollback capabilities during deployment failures
Key Pulumi features used:
// Infrastructure components
const websiteBucket = new s3.Bucket('WebsiteBucket', {
website: {
indexDocument: 'index.html',
},
});
const distribution = new cloudfront.Distribution('WebsiteDistribution', {
origins: [{
domainName: websiteBucket.bucketRegionalDomainName,
originPath: '',
}],
enabled: true,
defaultRootObject: 'index.html',
priceClass: PriceClass.PriceClass_100,
});
// DNS automation
const record = new route53.ARecord('WebsiteAlias', {
zoneId: zone.zoneId,
name: 'dev-portfolio.com',
aliases: [{
name: distribution.domainName,
zoneId: distribution.hostedZoneId,
}],
});
Best Practices:
Environment-specific configurations using
.env
filesCustom Pulumi stack selector for multi-environment management
Automated cost estimation via
pulumi import
commandsSecurity group rules limited to CloudFront IP ranges
Automated deployment notifications through Slack integration
Submission Checklist
✅ Working production deployment
✅ Comprehensive documentation
✅ Automated testing workflow
✅ Cost optimization analysis
✅ Security vulnerability scan results
Thanks ....
Top comments (0)