DEV Community

ANIRUDDHA  ADAK
ANIRUDDHA ADAK Subscriber

Posted on

A Portfolio website using Hugo and deployed to AWS using Pulumi

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

  1. Initial Setup: Spent 2 hours learning Pulumi's TypeScript SDK and AWS provider structure

  2. 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

  1. Challenges:
  • DNS propagation delays with Route53

  • Configuring correct CORS policies for CDN

  • Debugging Pulumi preview vs actual deployment differences

  1. Solutions:
  • Implemented Pulumi's waitUntil for resource stabilization

  • Used 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,

    }],

});

Enter fullscreen mode Exit fullscreen mode

Best Practices:

  1. Environment-specific configurations using .env files

  2. Custom Pulumi stack selector for multi-environment management

  3. Automated cost estimation via pulumi import commands

  4. Security group rules limited to CloudFront IP ranges

  5. 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)