背景
やりたいこと:
・Goで立てたサーバーをLINEmessagingAPIに結びつけてBOTを作ろうとしている
・LINEmessagingAPIのWebhookに貼るためにherokuでサーバーをデプロイする
現状:
・localhostでは問題なく画面表示できている(エラーの出力等はなし)
・デプロイの方法はherokuの公式ドキュメントを参照してください
エラー:Application error
$ git push heroku master
上記コードでデプロイしようとしたところ
デプロイ先のURLに飛ぶとこのような画面が表示されました。
エラーがログに残っているはずなので、画面に表示されている通り下記のコマンドをターミナルに打ってログを表示してみます。
$ heroku logs --tail
すると、以下のようなログが残っていました。
heroku[web.1]: State changed from starting to crashed
heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=fathomless-depths-28419.herokuapp.com request_id=c14072ee-8bea-471c-b1ae-79561e840c35 fwd="180.198.134.55" dyno= connect= service= status=503 bytes= protocol=https
このログをもとに、しばらく"heroku H10"
"app crashed"
のような単語で調べてみたのですが、
・webdynoの再起動
・アプリ自体の再起動
・再デプロイ
など、コードそのものに問題がなく解決するパターンもあるようです。
参考:
・Herokuでクラッシュしたアプリの原因究明と再起動する方法 | SERVERSUS
・HerokuでApplicationErrorが発生したときの対処法 - Qiita
しかし、私の場合、上記の方法を試しても解決しませんでした。
解決策
"go heroku H10"
のようにネットで色々検索していたところ、こちらの記事 を発見しました
表示されているエラー文は同じで、回答の方を翻訳してみると、
herokuでアプリをデプロイする場合、ポート番号を指定することはできません。
webサービスのポート番号を8000などと指定することはできず、herokuがランタイムにポート番号を決定します。
どうやら、localhostのポート番号を自分で指定していると、herokuからアクセスできないらしい。
herokuが決定するポート番号に対応できるよう変更
変更前のコード
func main() {
http.HandleFunc("/", helloHandler)
http.HandleFunc("/callback", lineHandler)
fmt.Println("http://localhost:5000 で起動中")
//サーバ起動
log.Fatal(http.ListenAndServe(":5000", nil))
}
http.ListenAndServe(":5000", nil)の部分を、以下のように変更
log.Fatal(http.ListenAndServe(":"+os.Getenv("PORT"), nil))
これで、herokuによって決定されたポート番号に対応できるようになりました。
今回はH10という同じエラーコードでも言語ごとにエラーの原因が違い、解決に時間がかかりました💧