Could9からHerokuにデプロイした際に発生したエラー’’App crashed”の原因調査について


はじめに

  • Railsチュートリアル第4版の第2章の開発中にエラー発生。
  • エラー調査方法の備忘録として投稿。

開発環境

  • MacOS Catalina 10.15.7
  • Safari 13.1.3
  • AWS Cloud9
  • Rails 5.1.6
  • Ruby 2.6.3
  • Heroku 7.47.6

事象

HerokuにてApplicationErrorが発生。

調査方法と原因

1.「heroku logs --tail」にてHerokuのログを確認

エラーコード「H10」の「App crashed」が出力される。

heroku[router]: at=error code=H10 desc="App crashed"

Herokuで出力されるエラーコードとその内容は以下を参照。
https://sodocumentation.net/heroku/topic/8321/heroku-error-codes (2021/2/13)

ちなみにHerokuは標準で最新1500行のログを1週間保持しているらしい。
Herokuのログ内容の見方や出力方法については以下を参照。
https://devcenter.heroku.com/ja/articles/logging (2021/2/13)

2.「heroku run rails console」にてログ確認
当該コマンドにてHerokuにデプロイしたアプリケーションに対してRails Consoleを実行できる。Railsチュートリアルの場合であれば、Cloud9のコンソールにてより詳細なエラー内容を確認できる。
https://devcenter.heroku.com/ja/articles/getting-started-with-rails5#run-the-rails-console (2021/2/13)

コマンド実行結果として以下のログが出力される。
未定義のメソッド「protect_from_forger」が「/app/app/controllers/application_controller.rb」の「2行目」にあるいう旨のエラー。親切なことに「もしかして'protect_from_forgery'って言いたかったの?」とまで記載されている。

/app/app/controllers/application_controller.rb:2:in `<class:ApplicationController>': undefined method `protect_from_forger' for ApplicationController:Class (NoMethodError)
Did you mean?  protect_from_forgery

つまり原因はメソッド名称の記載間違いだった。(単純ミスにも程がある...)
コンソール上のコマンドを消そうとした際に、誤ってソースコードにカーソル当たっていたと思われる。(通信環境の悪い場所で作業していたため、Cloud9の動作が重くカーソル位置の反映が遅れていた?)

解決策

当該箇所のメソッド名称を修正。問題なく動作。

まとめ

Cloud9上でデバッグしたのちに当該バグを作り込んだため、Heroku上で発生したバグから調査する形となった。バグの原因自体はとても単純ではあるが、Herokuで発生したエラーメッセージから調査する方法を理解する良い機会となった。
また、普段はJava、C#といったコンパイラ型言語を用いることが多いため、スペルミスはコンパイル時にエラーとなっていたが、Rubyのようなインタープリタ型言語ではこういった単純なスペルミスに始まる構文エラーにも注意したい。(IDEによる検出表現も知っておく必要あり。Cloud9では定義済み関数は色が変化していた。)
どんなに簡単な原因だったとしても、事象からは簡単に原因特定できないのがアプリの難しさであり面白さだなと改めて感じた(もちろん最終的にちゃんと解決して初めて面白い)。