どうもこんにちは。
今回は、RailsをAWS Elastic Beanstalk環境へデプロイした時に失敗したので、その時の対処方法を備忘録として残します。
発生していたエラー
今回、デプロイに失敗した理由が、「nokogiri gemが正常にインストールできない」ことでした。
An error occurred while installing nokogiri (1.16.7), and Bundler cannot continue.
In Gemfile:
dropzonejs-rails was resolved to 0.8.5, which depends on
rails was resolved to 7.0.5, which depends on
actioncable was resolved to 7.0.5, which depends on
actionpack was resolved to 7.0.5, which depends on
actionview was resolved to 7.0.5, which depends on
rails-dom-testing was resolved to 2.2.0, which depends on
nokogiri
なんでだーと思って調べていると、nokogiriってCのネイティブライブラリなんですね。
Cのネイティブライブラリとは、Rubyのためのライブラリというわけではなく、他の言語でも使用されるC言語で開発されたライブラリという認識です。
つまり、「nokogiriが動くために必要なCのライブラリが足りない」かなと推測できます。
犯人だぁれ?
さらに、ちょっとGemfile.lockを確認してみてると、aarch64用のnokogiriがインストールされていました。
nokogiri (1.16.5-aarch64-linux)
犯人はこいつでした。
EB環境はlinux/x86_64環境で動作しているので、そりゃ失敗するわけだ。
どう解決する?
ということで、linux/x86_64アーキテクチャでも動作するようにGemをインストールしなおしましょう。
1. ローカルのDockerfileで必要なライブラリをインストール
RUN apt-get update -qq && apt-get install -y build-essential libxml2-dev libxslt1-dev
2. ビルド
docker-compose build
3. 立ち上げ
docker-compose up
4. --platform=rubyを指定してnokogiriをインストール
docker-compose exec web gem install nokogiri --platform=ruby -- --use-system-libraries
5. force_ruby_platformをTRUEに設定
docker-compose exec web bundle config set force_ruby_platform true
6. bundle install
docker-compose exec web bundle install
Gemfile.lock確認
nokogiri (1.16.7)
マイナーバージョンあがっちゃったけどまぁOK!
これでEB環境にデプロイしてもエラーは消えました。
まとめ
Mac使っている人は、アーキテクチャの違いに気をつけてデプロイしたり環境構築したりすると良いと思います。
以上