Rails7 からは Webpacker の標準サポートが外されました。これにより 7 以前から Webpacker を使って動かしているアプリを Rails7 にアップグレードすると、そのままでは AWS Elastic Beanstalk にデプロイすることができません。

AWS Elastic Beanstalk にデプロイをすると assets:precompile のタイミングで error Command "webpack" not found. というエラーになります。エラー文言の通り webpack コマンドがないというエラーです。

この原因は Webpacker の標準サポートが外されたことにより、従来は bundle exec rake assets:precompile の実行タイミングに自動で bundle exec rake yarn:install が実行されていましたが Rails7 からは実行されなくなったことです。

該当のコミット

-# Run Yarn prior to Sprockets assets precompilation, so dependencies are available for use.
-if Rake::Task.task_defined?("assets:precompile") && File.exist?(Rails.root.join("bin", "yarn"))
-  Rake::Task["assets:precompile"].enhance [ "yarn:install" ]
-end

この yarn:install はその名前の通り yarn install コマンドを実行してくれます。これが実行されないと webpack コマンド自体がインストールされません。

Beanstalk は自動で assets:precompile を実行する

Rails7 で yarn:install が自動実行されなくなった対処法はシンプルで、手動で yarn:install を実行するだけです。ただし AWS Elastic Beanstalk の場合はデプロイ時に自動で assets:precompile を実行してくれるお陰で手動で実行するタイミングがありません。

container_commands は実行タイミングがもっと後なので間に合いませんし、commands では早すぎます。というわけで、 AWS Elastic Beanstalk で Webpacker を動かす方法は先ほどのコミットをなかったことにするのが簡単です。

依存ファイルを作成する

適当に lib/tasks/yarn.rake ファイルを作成し、以下の内容を記述します。

Rake::Task["assets:precompile"].enhance [ "yarn:install" ]

これで Rails6 と同様に assets:precompile の際に yarn:install が実行されます。デプロイも正常にできるようになると思います。良かったですね。とはいえ Webpacker はもうメンテナンスがされないので、早いうちに他に移行をした方が良いでしょう。