Amplify Hosting でまともな Jekyll を使う
このブログは 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.yml
で bundle 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 秒ほどで終わるようになりました。