// blog

Hosting a Static Site on AWS for Under $1/Month

July 10, 2026 ·awss3cloudfrontdevops


You don’t need a VPS, Kubernetes, or a $20/month PaaS to host a personal website. Here’s the architecture I use and what it actually costs.

The architecture

  • S3 stores the built HTML/CSS/JS files (private bucket).
  • CloudFront serves them globally over HTTPS with edge caching.
  • ACM provides a free TLS certificate.
  • Route 53 (optional) handles DNS for a custom domain.

The real monthly bill

Service Cost
S3 storage (~50 MB) ~$0.001
S3 requests ~$0.01
CloudFront (free tier: 1 TB/mo) $0.00
ACM certificate $0.00
Route 53 hosted zone $0.50
Total ~$0.51

The only fixed cost is the Route 53 hosted zone. Skip the custom domain and it’s effectively free.

Gotchas

  • Keep the S3 bucket private and use CloudFront Origin Access Control — never enable public bucket hosting.
  • Set up a CloudFront function or error mapping so /blog resolves to /blog.html (or build with file-based output like Astro’s build.format: 'file').
  • Always invalidate the CloudFront cache after deploying (aws cloudfront create-invalidation). The first 1,000 invalidation paths per month are free.

Deploying in one command

npm run build
aws s3 sync dist/ s3://my-site-bucket --delete
aws cloudfront create-invalidation --distribution-id ABC123 --paths "/*"

Wire that into GitHub Actions and you’ve got push-to-deploy with zero servers.


← Back to all posts