Amplify Hosting でまともな Jekyll を使う

Posted on

このブログは Jekyll で構築されていて、S3 の Static website hosting と CloudFront を組み合わせて配信しています(一部のパスは CloudFront で別のオリジンに向けています)。ブログの更新はすべて Pull request ベースでやっているので、PR ごとのプレビューのために Amplify Hosting を試してみました。

Amplify Hosting は Jekyll のサポートを謳っていますが、お世辞にも理想的なビルド環境とは言えません。

具体的には、デフォルトでインストールされている Ruby が EOL になったバージョンですし、Jekyll のバージョンが決め打ちになっていて Gemfile.lock で指定されたバージョンは使われません(Live package updates という仕組みはありますが、決め打ちになっているバージョンを上書きできるだけ)。また、Jekyll には必要ないパッケージやツールが大量にインストールされるためプロビジョニングに時間がかかります。

Amplify Hosting で使われている Dockerfile は aws-amplify/amplify-hosting で確認できます。

カスタムビルドイメージで Ruby 公式のイメージを使う

Amplify Hosting はカスタムビルドイメージを使うことができるので、Ruby 公式の Docker イメージを指定すれば上記のような問題は解決できます。

自分は ECR public repository の public.ecr.aws/docker/library/ruby:3.2 を使っています。 slim を使うとカスタムビルドイメージに必須のパッケージが入っていないため、ビルドのステップまで進みませんでした。

あとは amplify.ymlbundle install すれば Gemfile.lock が使われます。ついでに Gem のインストール先を vendor/bundle にしてキャッシュさせています。

version: 1
frontend:
  phases:
    preBuild:
      commands:
        - bundle config set path 'vendor/bundle'
        - bundle install
        - bundle check
    build:
      commands:
        - bundle exec jekyll build
  artifacts:
    baseDirectory: _site
    files:
      - '**/*'
  cache:
    paths:
      - 'vendor/bundle/**/*'

ここまで無駄を削ぎ落とせば、プロビジョニングからデプロイまで 90 秒ほどで終わるようになりました。

Popular Entries

Recent Entries