Railsアプリのeb deployでrake asset:precompileが失敗する場合の確認と対処方法
丹内です。 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
まずはログを確認してみます。
このうち②は、直前のデプロイログを見るだけだったら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
どうやら
- EBから
rake asset:precompile
実行の設定を切る - 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の設定を活用すると簡単・便利なものが見つかったりするので、普段からドキュメントに目を通しておきたいです。