よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

bundle install時にnative extensions errorが発生する場合はメモリ不足の可能性があるかも!?

Amazon EC2の低スペックインスタンス(Micro instance)で、bundle installすると、native extensionのインストールでエラーが発生する場合があります。
インストール時に必要となるライブラリが本当に足りない場合は、必須ライブラリをインストールする必要がありますが、
通常のgem installでインストールできるが、bundle installでは以下のようなエラーになる場合は、メモリ不足を疑ってみましょう

※以下はmysqlのgemをインストールしようとしたときに発生したエラーです。

Installing mysql (2.8.1) with native extensions /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/site_ruby/1.8/rubygems/installer.rb:529:in `build_extensions': ERROR: Failed to build gem native extension. (Gem::Installer::ExtensionBuildError)

/opt/ruby-enterprise-1.8.7-2011.02/bin/ruby extconf.rb

Gem files will remain installed in /opt/application/releases/20110408/vendor/bundle/ruby/1.8/gems/mysql-2.8.1 for inspection.
Results logged to /opt/application/releases/20110408/vendor/bundle/ruby/1.8/gems/mysql-2.8.1/ext/mysql_api/gem_make.out
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/site_ruby/1.8/rubygems/installer.rb:482:in `each'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/site_ruby/1.8/rubygems/installer.rb:482:in `build_extensions'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/site_ruby/1.8/rubygems/installer.rb:156:in `install'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/source.rb:96:in `install'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/installer.rb:55:in `run'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/spec_set.rb:12:in `each'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/spec_set.rb:12:in `each'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/installer.rb:44:in `run'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/installer.rb:8:in `install'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/cli.rb:226:in `install'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/vendor/thor/task.rb:22:in `send'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/vendor/thor/task.rb:22:in `run'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/vendor/thor/invocation.rb:118:in `invoke_task'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/vendor/thor.rb:246:in `dispatch'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/lib/bundler/vendor/thor/base.rb:389:in `start'
from /opt/ruby-enterprise-1.8.7-2011.02/lib/ruby/gems/1.8/gems/bundler-1.0.10/bin/bundle:13
from /opt/ruby-enterprise/bin/bundle:19:in `load'
from /opt/ruby-enterprise/bin/bundle:19

ちなみに私の場合は、MySQLHttpdなどの常駐プロセスを一時的に停止し、空きメモリ量を増やした後にbundle installするとうまくいきましたので、同様の事象に遭遇している人はダメモトで試してみてください。