---
layout: post
title:  "Notes from setting up a Jekyll blog on AWS S3 and CloudFront"
slug: jekyll-aws-s3-cloudfront
date:   2017-12-29 15:00:00 +0000
categories: jekyll setup
---

Here are my notes from today's task of setting up this blog.

* Using [Jekyll](https://jekyllrb.com/)
  * Easy to setup
  * Built-in syntax highlighting
  * write/commit/push workflow
  * easy to deploy as static website
  * Compatible with GitHub and GitLab pages
* Theme
  * Using [minima theme](https://github.com/jekyll/minima)
  * Basic but easy to customize and extend
  * Overrides:
    * [`home.html`](https://gitlab.com/rfwatson/techblog/commit/1f9e5bcc69b1d25329c7552a7d3152ff63725250#f87bb2fcce406e16253570011cce02227981f242_0_25) to add full post content to homepage
    * [`assets/main.scss`](https://gitlab.com/rfwatson/techblog/blob/1f9e5bcc69b1d25329c7552a7d3152ff63725250/assets/main.scss) with CSS/design changes
  * Fonts
    * Webfonts from [Google Fonts](https://fonts.google.com/)
* Hosting
  * Considered [GitHub pages](https://pages.github.com/), [GitLab pages](https://about.gitlab.com/features/pages/) and static hosting using [AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html)
  * Requirements:
    * free (gratis)
    * easy-to-maintain, preferably static/serverless
    * Basic HTTPS support, with redirect from HTTP
  * GitLab Pages
    * Free static site hosting comparable to GitHub Pages
    * Pros:
      * Powerful containerized [CI/build system](https://about.gitlab.com/features/gitlab-ci-cd/)
      * HTTPS support for static site, even on custom domains
    * Cons:
      * No option to force HTTPS
      * Tricky to get LetsEncrypt TLS certs to work with CI/build system - [official tutorial](https://about.gitlab.com/2016/04/11/tutorial-securing-your-gitlab-pages-with-tls-and-letsencrypt/) is slightly out-of-date
  * GitHub pages
    * Pros:
      * Popular and well-documented
      * HTTPS support, including option to force HTTPS
    * Cons:
      * No HTTPS support for custom domains
  * AWS S3
    * Pros:
      * less managed than GitLab/GitHub - so a bit more setup, but also more flexibility
      * HTTPS support, as well as supporting "redirect objects" which effectively allow us to set up arbitrary 301 redirects on our site programatically.
      * supports multiple subdomains
    * Cons:
       * Not quite free, but very low cost for low usage
  * Ended up choosing S3
    * Created bucket, enabled static website hosting option
    * Added Cloudfront web distribution
      * Follow approach [here](http://someguyontheinter.net/blog/serving-index-pages-from-a-non-root-location-via-cloudfront/) to avoid 403 errors from S3 when serving paths without an explicit `index.html`, like `/about`
    * Added simple deploy script making use of [AWS CLI](https://aws.amazon.com/cli://aws.amazon.com/cli/)
* DNS
  * Registered domain
  * Added hosted zone to [AWS Route 53](https://aws.amazon.com/route53/)
  * Updated nameserver records in Namecheap control panel to point at AWS
  * Added alias record to point at Cloudfront distribution
  * Added MX record to point at pre-existing [Mailinabox](http://mailinabox.email/) setup
