// 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
/blogresolves to/blog.html(or build with file-based output like Astro’sbuild.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.