CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
こんにちはー。野田貴子です。
今月も海外のRailsコラムを意訳してご紹介します。ご参考になれば幸いです。
###
みなさんは、プログラムの大部分がエラー処理のコードで占められていることをご存知でしょうか。普通にアプリケーションを利用している分にはほとんど使用されないコードであるにも関わらず、それらのコードがない場合はアプリケーションが壊れたり、悪用されたりする可能性が非常に高くなります。
Railsフレームワークも例にもれず非常に多くのエラー処理があり、アプリケーションの実装が不十分であるとそれらのエラーが発生します。Railsを使用した1000以上の製品版のアプリケーションを調査し、どのエラーが頻繁に発生しているのか(と、その解決方法)をまとめた記事がありましたので、ご紹介します。
https://rollbar.com/blog/top-10-ruby-on-rails-errors/
開発者コミュニティに還元するために数千のプロジェクトのデータベースを調査したところ、Ruby on Railsでよくあるエラー10個を導き出すことができました。それらの原因と回避策について紹介したいと思います。これらのエラーに対処できるようになれば、さらによい開発者になれることでしょう。
「データは王様」という言葉があるように、我々はRuby on Railsアプリケーションで発生したエラーを収集、解析し、上位10個をランク付け(*1)しました。Rollbar(*2)で各プロジェクトのエラーをすべて集め、それぞれのエラーの発生回数をまとめました。このグルーピングはfingerprinting(*3)に従って行いました。基本的に、2つ目のエラーが1つ目のエラーの単なる繰り返しだった場合はその2つをグループ化しました。それにより、ユーザーはログファイルのような圧倒的な量の記録ではなく、適切な要約を見ることができるようになりました。
我々はみなさんやみなさんのユーザーに影響を与える可能性が高いエラーにフォーカスしました。そのために様々な企業で各エラーを発生させたプロジェクトの数を用いて、エラーをランキングしました。大勢のカスタマーがデータセットをほとんどの読者には関係のないエラーで充満させないために、意図的にプロジェクトの数を見るようにしました。
こちらがRailsエラーのトップ10になります。
この中にすでに見覚えのあるエラーがある方もいらっしゃるでしょう。みなさんの製品アプリケーションで何がこれらのエラーを引き起こすのかについてもう少しだけ詳細を見てみましょう。
解決策のサンプルはRails 5を元にしていますが、Rails 4の場合でも基本的な考え方は同じです。
まずはどんなWebアプリケーションにも昔からある、404エラーのRails版です。ActionController::RoutingErrorはユーザーからアプリケーション内に存在しないURLをリクエストされたことを意味します。Railsはこれを記録しエラーのように見えますが、大抵の場合はアプリケーションが原因ではありません。
続き
https://rollbar.com/blog/top-10-ruby-on-rails-errors/#1-actioncontrollerroutingerror
このエラーの意味は、オブジェクトのプロパティを読むために角カッコを使用しているものの、オブジェクトが見つからないかnilであるために、この角カッコのメソッドがサポートされていないということです。角カッコを記述し、プロパティにアクセスするためにハッシュや配列を掘り下げていく途中で、途中が欠けている可能性があります。これは、JSON APIやCSVファイルからデータをパースして取得した場合や、コントローラークションでネストされたパラメータからデータを取得した場合に発生することがあります。
このエラーはアプリケーションのセキュリティに関係するため、注意深く考慮する必要があります。ActionController::InvalidAuthenticityTokenはPOST、PUT、PATCH、またはDELETEリクエストが存在しないか、不適切なCSRF(クロス・サイト・リクエスト・フォージェリー)トークンがある場合に起こります。
続き
https://rollbar.com/blog/top-10-ruby-on-rails-errors/#3-actioncontrollerinvalidauthenticitytoken
Net::ReadTimeout はRubyがソケットからデータを取得する際にread_timeout値よりも長い時間がかかった場合に発生します。デフォルト値は60秒です。HTTPリクエストを作成するためにNet::HTTP、open-uri、あるいはHTTPartyを使用している場合に発生やすくなります。
続き
https://rollbar.com/blog/top-10-ruby-on-rails-errors/#4-netreadtimeout
このエラーメッセージはPostgreSQLデータベース専用ですが、MySQLとSQLite用のActiveRecordアダプタでも同様のエラーが発生します。ここでの問題は、ユニークインデックスを持つフィールドがアプリケーションのデータベースに存在し、そのインデックスに違反するトランザクションがデータベースに送信されたことです。これは完全に解決するのは難しい問題ですが、まずは対処しやすいところから見てみましょう。
2つ目のNoMethodErrorですが、こちらは別の説明メッセージが表示されます。このエラーは通常、リレーションがあるオブジェクトの作成アクション関連で発生します。普通はオブジェクトが正常に作成されますが、検証が失敗するとこのエラーが出現します。
このエラーはRailsの強力なパラメータ(*4)実装の一部です。500エラーにはならずに、ActionController::Base に引っかかり400 Bad Requestを返します。
続き
https://rollbar.com/blog/top-10-ruby-on-rails-errors/#7-actioncontrollerparametermissing
これがトップ10エラーのうち唯一のActionViewエラーだということは良い兆候です。テンプレートをレンダーする際のビューの作業が少ないことは良いことです。やることが少ないということはエラーも少なくなるということです。このエラーはまだ残っていますが、その意味は、存在すると思って書かれた変数あるいはメソッドが単に存在しなかったということです。
このエラーは3番目のActionController::InvalidAuthenticityTokenのように、アプリケーションそのものよりも、注意不足なユーザーや悪意のあるユーザーによって引き起こされがちです。アプリケーションにHTMLページを返すアクションを構築し、誰かがそのページのJSON版をリクエストした場合に、ログにこのエラーが書かれます。
続き
https://rollbar.com/blog/top-10-ruby-on-rails-errors/#9-actioncontrollerunknownformat
トップ10最後のエラーには少し失望しました。StandardErrorは他のすべてのエラーから継承される必要があるベースのエラークラスであり、実際にはデータベースマイグレーションで発生するエラーであるため、他の場所でこのエラー発生させるのは汎用的すぎます。このエラーがActiveRecord::MigrationErrorの子孫であればよかったのですが。少し脱線しました。
続き
実際にはデータベースマイグレーションの間に起こるエラーなのに
一般的なRailsエラーの数々は、アプリケーション内のどこからでも発生する可能性があります。この記事では、モデル、ビュー、コントローラーでよく見られるエラーを見てきました。必ずしも心配する必要はなく、アプリケーションを保護しているだけのエラーもありますが、それ以外のエラーはできるだけ早く捕まえて根絶しなければならないものです。
それでもなお、これらのエラーがどれだけ頻繁に発生するのかを追跡するのは良いことです。これにより、みなさんのユーザーやアプリケーションのセキュリティに影響を与える問題を分かりやすくし、それらのエラーを迅速に修正することができるようになります。修正できない場合はこれらのエラーメッセージがユーザーに表示されてしまいますが、開発者や製品管理チームはユーザーがサポートに連絡をしてくれるまでそれらのエラーに気づくことができません。
私たちはみなさんがこの記事で新しいことを学び。今後これらのエラーを避ける体勢が整うことを願っています。しかし、ベストプラクティスを使用しても製品には予期しないエラーが発生するものです。ユーザーに大きな影響を与えるエラーを可視化し、それらを迅速に解決するために優れたツールを用意しておくことが重要です。
*1 https://rollbar.com/error-tracking/ruby/
*2 https://rollbar.com/
*3 https://docs.rollbar.com/docs/grouping-algorithm/
*4 http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes