Railsアプリのeb deployでrake asset:precompileが失敗する場合の確認と対処方法

2015.08.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

丹内です。 EBを使ったRailsアプリの開発中、あるgemをインストールしたらエラーが発生しデプロイできなくなったので、対処しました。

前提

  • ruby 2.2
  • Rails 4.2
  • Amazon Linux 2015.03 v1.4.1
  • Passenger Standalone

原因の確認

rails向けのlodash gem lodash-rails を追加したコミットをデプロイしたところ、以下のエラーが出てデプロイが失敗するようになりました。

INFO: Environment update is starting.                               
INFO: Deploying new version to instance(s).                         
ERROR: [Instance: aabbcc] Command failed on instance. Return code: 1 Output: (TRUNCATED)...41d233.png
rake aborted!
Errno::EACCES: Permission denied @ rb_sysopen - /opt/rubies/ruby-2.2.2/lib/ruby/gems/2.2.0/gems/lodash-rails-3.10.0/vendor/assets/javascripts/lodash.js

まずはログを確認してみます。

スクリーンショット_2015-08-05_0_04_27

このうち②は、直前のデプロイログを見るだけだったらLast 100 Linesのほうが楽でよいです。(Full Logsだと、ディレクトリに各種ログが入ったzipファイルをダウンロードしてくることになります。)

以下のように、失敗したログが確認できます。

+ su -s /bin/bash -c 'bundle exec rake assets:precompile' webapp
  I, [2015-08-04T11:21:43.276969 #638]  INFO -- : Writing /var/app/ondeck/public/assets/logo-1a57039fecdbc2b09741630666e3c9e2cb076820e8e871a7b0fb08ae2841d233.png
  rake aborted!
  Errno::EACCES: Permission denied @ rb_sysopen - /opt/rubies/ruby-2.2.2/lib/ruby/gems/2.2.0/gems/lodash-rails-3.10.0/vendor/assets/javascripts/lodash.js

  Tasks: TOP => assets:precompile
  (See full trace by running task with --trace) (Executor::NonZeroExitStatus)

他に原因のようなものは確認できなかったので、rake assets:precompileが原因であるとあたりをつけました。

対処方法

それっぽいキーワードで調べていると、以下のページがヒットしました。

Asset compilation failing on AWS Beanstalk. - AWS Developer Folums

As a work-around you could disable running assets compilation on your environment and add a container commands in your .ebextensions file as follow:

container_commands:
  01_compile-assets:
    command: bundle exec rake assets:precompile

どうやら

  1. EBからrake asset:precompile実行の設定を切る
  2. container commandsに追加する

という手順で行けるようです。 ただ、この設定はRails3.x系のみに有効とドキュメントには書いてありました。

コンテナでユーザーのアプリケーションの代わりに `rake assets:precompile` を実行するか、スキップするかを指定します。これも、Rails 3.x アプリケーションにのみ適用されます。

しかし、4系で有効というエントリも見られます。

結論ですが、この設定は4系でも有効でした。 そして、2つの設定を実施したら、無事にエラーが出なくなりました。

以下が.ebextensions/02_option_settings.config

option_settings:
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: RAILS_SKIP_ASSET_COMPILATION
    value: "true"

以下が.ebextensions/01_container_commands.config

container_commands:
  01_compile-assets:
    command: bundle exec rake assets:precompile

まとめ

「まずログを見る」ということの重要性を改めて感じました。 また、EBの設定を活用すると簡単・便利なものが見つかったりするので、普段からドキュメントに目を通しておきたいです。