どうもこんにちは。
今回は、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
がインストールされていました。
Gemfile.lock
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確認
Gemfile.lock
nokogiri (1.16.7)
マイナーバージョンあがっちゃったけどまぁOK!
これでEB環境にデプロイしてもエラーは消えました。
まとめ
Mac使っている人は、アーキテクチャの違いに気をつけてデプロイしたり環境構築したりすると良いと思います。
以上