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.

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

EC2インスタンスにrubyをインストール際のエラーの対象方法

 

今日は、個人アプリをデプロイしようと思いまして、 EC2インスタンスにまずはrubyをインストールしようと思ったのですが、

早速エラーが出たので忘備録として記録します。

EC2インスタンスにログイン後、

rbenv install 2.5.1

を入れるとエラーが起きました。

こちらがエラー文です。

 

[ec2-user@ip-172-31-XX-XXX ~]$ rbenv install 2.5.1

Downloading ruby-2.5.1.tar.bz2...

-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2

Installing ruby-2.5.1...

 

BUILD FAILED (Amazon Linux AMI 2018.03 using ruby-build 20190423-4-gac92ec0)

 

Inspect or clean up the working tree at /tmp/ruby-build.20190608070902.8678

Results logged to /tmp/ruby-build.20190608070902.8678.log

 

Last 10 log lines:

tool/config.sub already exists

checking build system type... x86_64-pc-linux-gnu

checking host system type... x86_64-pc-linux-gnu

checking target system type... x86_64-pc-linux-gnu

checking for gcc... no

checking for cc... no

checking for cl.exe... no

configure: error: in `/tmp/ruby-build.20190608070902.8678/ruby-2.5.1':

configure: error: no acceptable C compiler found in $PATH

See `config.log' for more details

checking for gcc... no

checking for cc... no

checking for cl.exe... no と記述があります。

そこで、 gccをインストールするために、

sudo yum -y install gcc

を実行。

すると、、

[ec2-user@ip-172-31-XX-XXX ~]$ rbenv install 2.5.1
Downloading ruby-2.5.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2
Installing ruby-2.5.1...

BUILD FAILED (Amazon Linux AMI 2018.03 using ruby-build 20190423-4-gac92ec0)

Inspect or clean up the working tree at /tmp/ruby-build.20190608073429.26235
Results logged to /tmp/ruby-build.20190608073429.26235.log

Last 10 log lines:
installing rdoc:                    /home/ec2-user/.rbenv/versions/2.5.1/share/ri/2.5.0/system
installing capi-docs:               /home/ec2-user/.rbenv/versions/2.5.1/share/doc/ruby
The Ruby readline extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Try running `yum install -y readline-devel` to fetch missing dependencies.

Configure options used:
  --prefix=/home/ec2-user/.rbenv/versions/2.5.1
  LDFLAGS=-L/home/ec2-user/.rbenv/versions/2.5.1/lib 
  CPPFLAGS=-I/home/ec2-user/.rbenv/versions/2.5.1/include 

さっきとは違うエラーが出ちゃいました。。

エラー文を読むと、

The Ruby readline extension was not compiled. ERROR: Ruby install aborted due to missing extensions Try running yum install -y readline-devel to fetch missing dependencies.

とあります。

そのため、

sudo yum install readline-develを実行し、

readline-develをインストール。

そして、インストール後に、 再度rbenv install 2.5.1を実行!

すると、、、

[ec2-user@ip-172-31-XX-XXX ~]$ rbenv install 2.5.1
Downloading ruby-2.5.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2
Installing ruby-2.5.1...
Installed ruby-2.5.1 to /home/ec2-user/.rbenv/versions/2.5.1


見事インストールできました!!

中間テーブルを介してデータを取得する方法(rails)

中間テーブルを介してデータを取得する方法について、 忘備録としてここに記しておきます。

例:

productsテーブル

product_categoriesテーブル(中間テーブル)

categoriesテーブル

があるとします。

一つの商品(product)はいくつかのカテゴリー(category)を持ち、

一つのカテゴリー(category)はいくつかの商品(product)を持つので、

多対多の関係が成り立ちます。

中間テーブルはproduct_categoriesテーブルです。

そして、中間テーブルに保存されているレコードの値でを引っ張り出したい時、

こんな風に記述します。

@product.product_categories

category = @product.product_categories.select(:category_id)

とい部分。

@product.product_categoriesというのは、 商品(product)から、 中間テーブルであるproduct_categoryテーブルにいき、

その後、

〜.select(:category_id)で、

@productに代入されている商品のカテゴリidのみを取得するという意味になります。

このselectというのは、 テーブルの中で指定したカラムのみを取得したいときに用います。

そして、次の行の、

product_category = category.last
category_id = product_category[:category_id]

という部分では、 複数あるカテゴリの中で最後にレコードに当たるカテゴリのみを、 product_categoryに代入するということになります。

そして、product_category[:category_id]により、

カテゴリidのみを、category_idに代入しています。

最後に、

@products = Category.find(category_id).products

とすることで、 関連するカテゴリの商品を取り出し、@productsに代入することができます。

あとは、ビューファイルにて、 @productsに代入された情報を表示します。

      - @products.each do |product|
          %h2
            = product.name
          .price-box
            ¥
            = product.price
          .price-box-tax (税込)

上記のようにビューで記述すれば、 商品の名前、値段を表示することができます。

それでは、この辺で!