WEB系プログラミングに関する雑記ブログ

このブログは、主にWEB系の話(プログラミング、IT系のニュースなど)をします。

EC2インスタンスでbundle installした時にエラーが起きた時の解決方法

クローンしたアプリケーションを起動するために、bundle installしたところ、 エラーが起きました。

[ec2-user@ip-xxx-xx-xx-xxx <レポジトリ名>]$ bundle install


~省略~

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sassc-2.0.1/ext
/home/ec2-user/.rbenv/versions/2.5.1/bin/ruby -rrubygems /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rake-12.3.2/exe/rake
RUBYARCHDIR=/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0-static/sassc-2.0.1
RUBYLIBDIR=/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0-static/sassc-2.0.1
cd libsass
make lib/libsass.so
mkdir lib
cc -Wall -O2 -I /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sassc-2.0.1/ext/libsass/include -fPIC -fPIC -c -o src/cencode.o src/cencode.c
src/cencode.c: In function ‘base64_encode_block’:
src/cencode.c:50:5: warning: empty declaration [enabled by default]
     __attribute__ ((fallthrough));
     ^
src/cencode.c:64:5: warning: empty declaration [enabled by default]
     __attribute__ ((fallthrough));
     ^
g++ -Wall -O2 -std=c++0x -I /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sassc-2.0.1/ext/libsass/include -fPIC -fPIC -c -o src/ast.o
src/ast.cpp
make: g++: コマンドが見つかりませんでした
make: *** [src/ast.o] エラー 127
rake aborted!
Command failed with status (2): [make lib/libsass.so...]

Tasks: TOP => lib/libsass.so
(See full trace by running task with --trace)

rake failed, exit code 1

Gem files will remain installed in /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sassc-2.0.1 for inspection.
Results logged to /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0-static/sassc-2.0.1/gem_make.out

An error occurred while installing sassc (2.0.1), and Bundler cannot continue.
Make sure that `gem install sassc -v '2.0.1' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  bootstrap was resolved to 4.3.1, which depends on
    sassc-rails was resolved to 2.1.1, which depends on
      sassc

エラー文を読んでみると、

make: g++: コマンドが見つかりませんでした

とあります。

そこで、以下のコマンドを実行。

$ sudo yum -y install gcc-c++

そして、再度bundle install。

すると先ほどのエラーは解決しましたが、 今度は別のエラーが発生しちゃいました。。


[ec2-user@ip-xxx-xx-xx-xxx <レポジトリ名>]$ bundle install


~省略~

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sassc-2.0.1/ext
/home/ec2-user/.rbenv/versions/2.5.1/bin/ruby -rrubygems /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rake-12.3.2/exe/rake
RUBYARCHDIR=/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0-static/sassc-2.0.1
RUBYLIBDIR=/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0-static/sassc-2.0.1
cd libsass
make lib/libsass.so
mkdir lib
cc -Wall -O2 -I /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sassc-2.0.1/ext/libsass/include -fPIC -fPIC -c -o src/cencode.o src/cencode.c
src/cencode.c: In function ‘base64_encode_block’:
src/cencode.c:50:5: warning: empty declaration [enabled by default]
     __attribute__ ((fallthrough));
     ^
src/cencode.c:64:5: warning: empty declaration [enabled by default]
     __attribute__ ((fallthrough));
     ^
g++ -Wall -O2 -std=c++0x -I /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sassc-2.0.1/ext/libsass/include -fPIC -fPIC -c -o src/ast.o
src/ast.cpp
virtual memory exhausted: メモリを確保できません
make: *** [src/ast.o] エラー 1
rake aborted!
Command failed with status (2): [make lib/libsass.so...]

Tasks: TOP => lib/libsass.so
(See full trace by running task with --trace)

rake failed, exit code 1

Gem files will remain installed in /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sassc-2.0.1 for inspection.
Results logged to /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0-static/sassc-2.0.1/gem_make.out

An error occurred while installing sassc (2.0.1), and Bundler cannot continue.
Make sure that `gem install sassc -v '2.0.1' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  bootstrap was resolved to 4.3.1, which depends on
    sassc-rails was resolved to 2.1.1, which depends on
      sassc

エラー文をみると、

virtual memory exhausted: メモリを確保できません

とあります。

そのため、

$ top

を実行し、メモリ容量を確認します。

top - 11:03:53 up 6 min,  1 user,  load average: 0.02, 0.12, 0.07
Tasks:  77 total,   1 running,  52 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1009496k total,   535964k used,   473532k free,     3124k buffers
Swap:        0k total,        0k used,        0k free,    36188k cached

スワップ領域(仮想メモリ)のtotalが0kなのでスワップ領域がない状態であり、 メモリ不足に対応できなかったものと考えられます。

そのため、解決策として、

サーバーの仮想メモリを増やします。

手順としては、以下の通り。

まずは、2GiBのファイルを作成します。

$ sudo dd if=/dev/zero of=/swap bs=1M count=2048
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 31.5393 秒、 68.1 MB/秒

$ ll /swap

そして、

作成したファイルをスワップファイルシステムとして割り当てます。

$ sudo mkswap /swap
スワップ空間バージョン1を設定します、サイズ = 2097148 KiB
ラベルはありません, UUID=XXXXXXXXXXXXXXXXXXXXXXX

スワップ領域を有効にします。

$ sudo swapon /swap
swapon: /swap: 安全でない権限 0644 を持ちます。 0600 がお勧めです。
$ sudo chmod 600 /swap

実際にスワップファイルが有効になっているか確認します。

$ cat /proc/swaps
Filename               Type       Size   Used   Priority
/swap                                   file      2097148 0   -2

無効化されていると、行が表示されないので、 これで問題ありません。

そして、スワップ領域を有効にしたところで、

再度、$ bundle install。

Bundle complete! 29 Gemfile dependencies, 105 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

上手くインストールできました!