Herokuのエラーが良くわからない

heroku logs

にてエラーを確認しても、実際になんのエラーが発生しているのかがよくわからない。

どのエラーが発生しているのかを知る方法はないだろうか。

Herokuを使った時、どうしてもエラーの原因がわからないという経験は私もあります。

(余談で言えば、Herokuを諦めてVPSにデプロイしたらエラーが再現して原因を掴んだことも一度や二度ではありません)

一番はDBのmigration忘れ

自分の経験上はmigrateしてないなどのDB周りでエラーが出ること多いです。 というのは、プログラム的には手元で十分に確認していますが、DBはデプロイするときに環境が大きく変わります。

デプロイしたときに初めてデプロイ用のDB設定を読み込むからかな、と考えています。

環境変数でDEBUG=Trueにする

もし、そういったDjango側のエラーでしたら、DEBUG=Trueにするとエラー画面が表示されるのでわかりやすくなります。 いや、それだと本番環境なので困る、ということになると思いますが、環境変数でその辺を制御するとgit pushしなくても済むので楽です。

具体的に言うと、本講座でいうならばらheroku.py

import os
DEBUG = os.environ.get('DEBUG', False)

のような感じで、DEBUGの値を環境変数から読み込むようにします。

もし、エラーがどうしてもわからない場合は、環境変数DEBUGを定義して、True1を与えれば良いです。

環境変数を変更するたびに、Heroku内部では再起動するので原因追求が終わったら環境変数を削除すれば良いです。

そうすればHeorku上で再起動をし直すだけですので、余計なpushもしなくて済むし、原因もわかりやすくなります。

ステージング環境を構築する

更に言えば、本番環境で動作しているのにエラーになるかもしれないコードをいきなりpushすることは怖くてできないと思うので、ステージング環境を作ってあげて、そこで変更をテストすると良いと思います。

Herokuアプリを2つ作って、例えばstageというブランチを切ります。

そのブランチをステージング環境のmasterにpushすれば普通にデプロイできます。

不具合があったら修正して、masterにマージすれば本番環境でも問題なく動く「はず」です。

実際の環境ではないので、100%ではありませんが90%ではあると思います。

500エラーはInternal Server Errorですので、もしかしたらHeroku側でエラーが出ることもあるかもしれません。 ただ、その時はheroku logsで十分な情報が得られると思います。