Hosting your blog for peanuts

#serverless #static #hosting

If you have a blog or a static website, you can combine a bunch of tools to provide a super-fast solution that costs less than a cup of coffee a month.

Hosting is always a compromise of reliability, scalability, pricing, and tech buzz. The good news is that Amazon provides file storage called S3, moreover, it allows you yo host your static website on S3. It is rumoured that static is the new dynamic, so here you go.

I use this approach, combining a few additional tools:

  • S3 is a way to store files in the cloud
  • Route 53 is a DNS service to bridge your domain with your content
  • CloudFront to distribute your site over HTTPS

Prerequisites

  • Buy domain name – Google Domains, GoDaddy, or any other provider
  • Create an AWS Account
  • Setup the AWS CLI

Amazon AWS has tutorials for setting almost everything up. Official instructions for configuring the AWS CLI are available here.

Install the Ghost and run it locally

Follow this tutorial from ghost platform. You’ll be able to see your blog with this link http://localhost:2369

Generate a static version of your blog

You have to generate assets for static website from your localhost ghost blog. I found several solutions to do this:

  • HTTrack – not well maintained, but works good tho, except thumbnails images, they need to be set explicitly.
  • Buster – completely abandoned, I’d rather skip it.
  • Ghost-static-site-generator – my current working solution, allows to parse your site with one command:
gssg --url https://yourdomain.com

Create S3 bucket

You can create the S3 bucket for your site using CLI or AWS Console. Name it youdomain.com, enable "Static website hosting" in bucket’s properties, set index.html as the default index document, allow all public access and set the following bucket

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.rezamousavi.com/*"
        }
    ]
}

Also, save you bucket pathname, you’ll need it later http://yourdomain.com.s3-website.eu-central-1.amazonaws.com/

Then create the second bucket and name it www.yourdomain.com. This bucket should redirect requests to your fist one. Set bucket website endpoint to the path of your first bucket.

Upload our blog static files to the S3 bucket

It’s relatively easy with AWS CLI:

aws s3 sync static_site_folder s3://yourdomain.com --acl public-read --delete

Now by checking the URL of your first bucket you’ll see your static website.

Create CloudFront distribution for our S3 bucket

Create a web distribution using HTTPS with CloudFront. Add you first bucket URL in the “Origin Domain Name”. Redirect HTTP to HTTPS. Set custom SSL certificate, which you can obtain with AWS Certificate Manager. After the distribution has been deployed, you’ll get the URL like *.cloudfront.net. You can access your website by visiting it.

Update our domain DNS records

The last thing is to route your domain and CloudFront URL. Unfortunately, Google Domains doesn’t support CNAME-like functionality at the zone apex, but you can have Google Domains forward your root domain to your www CNAME. I go for AWS Route 53 instead.

In Route 53 console create a new hosted zone for your domain. Set Alias Target to your CloudFront distribution URL.

Additionally, create one more record with www.yourdomain.com and list it in the alternate domain name in distribution preferences.

Update newly obtained DNS in your domain provider console/admin panel.

Important notice

CloudFront caches your s3 files for one day. If you like to update your website instantly, you should invalidate your objects in CloudFront distribution cache and push new changes. Watch out free tier limits. Learn more on AWS knowledge center.

Ready to go. Happy hosting and blogging!