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++: コマンドが見つかりませんでした
とあります。
そこで、以下のコマンドを実行。
そして、再度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をインストールするために、
を実行。
すると、、
[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 (税込)
上記のようにビューで記述すれば、 商品の名前、値段を表示することができます。
それでは、この辺で!