【Rails/Heroku】H10 - App crashedエラーの対処法

こんにちは。
まだ駆け出していない修行僧です。

Herokuへデプロイする際、アプリケーションエラーによりブラウザで表示されない事象が発生したので、ここに解決した手順を記したいと思います。

尚、指摘箇所がございましたら
愛あるご教授を頂けますと幸いです。

#結論
先に結論だけお伝えし、詳細は以降で述べていきます。
Gemfileに下記コードを入力することで、無事解決しました。

```
gem 'net-imap'
gem 'net-pop'
gem 'net-smtp'
```

#環境
MacBook Air(M1,2020) Monterey 12.0.1
Ruby 3.1.0
Rails 6.1.4.6
Heroku 7.59.2

#エラーコード
まずはどんなエラーが発生したのか見ていきます。
HerokuにRailsアプリを以下のコマンドでデプロイを実施しました。

```ターミナル
$ git push heroku HEAD
```
そして以下のコマンドを入力してブラウザで確認をします。

```ターミナル
$ heroku open
```

するとアプリケーションエラーの表示がされてログを確認してくださいとのこと。
記載されている通りコマンドを実行してみる。

```ターミナル
$ heroku logs --tail
[省略]
2022-02-12T05:58:37.275755+00:00 heroku[web.1]: Process exited with status 1
2022-02-12T05:58:37.405956+00:00 heroku[web.1]: State changed from starting to crashed
2022-02-12T06:01:54.201915+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=crud1app1tutorial.herokuapp.com request_id=7fc1a149-09b6-4ef5-a176-4f798c1cc221 fwd="106.168.77.57" dyno= connect= service= status=503 bytes= protocol=https
2022-02-12T06:01:54.635036+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=crud1app1tutorial.herokuapp.com request_id=ec7dc379-2b49-4d4e-989e-2f15a717bd6c fwd="106.168.77.57" dyno= connect= service= status=503 bytes= protocol=https
2022-02-12T06:07:39.652948+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=crud1app1tutorial.herokuapp.com request_id=4c741d91-847c-4e6f-b015-11ef54b2d4c1 fwd="3.94.6.43" dyno= connect= service= status=503 bytes= protocol=https
```
上記のようなメッセージが...
[Heroku](https://devcenter.heroku.com/ja/articles/error-codes#h10-app-crashed)の公式サイトで確認をしてみると以下の記述がされていました。

> Web dyno のクラッシュや Web dyno でのブートタイムアウトにより、このエラーが表示されます。

しかし完全には理解できず...
そもそもdynoとはなんや！？
[詳細](https://jp.heroku.com/dynos)は割愛させていただきますが、簡単に言うとHerokuで使われるコンテナのことです。
#考察と検証
そもそもこのログってどうやって見るの？っているところからスタートの私。

>`timestamp source[dyno]: message`
>timestamp:ログの出力時刻
>source:ログの発生源
>dyno:sourceより細かなログの発生源
>(引用先：https://qiita.com/koao123/items/fd7abb39a3710b0a3577)

詳しくは上記の記事を読んでいただきたいのですが、こちらをもとに再度ログと向き合ってみました。

```
2022-02-12T06:07:39.652948+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=crud1app1tutorial.herokuapp.com request_id=4c741d91-847c-4e6f-b015-11ef54b2d4c1 fwd="3.94.6.43" dyno= connect= service= status=503 bytes= protocol=https
```

どうやら、ルータに関する問題でエラーが引き起こされているのか？
この時点ではまだ何も掴めていませんでした。
再度ログを観察してみることにしました。するとある一文が目に入ります。

```ターミナル
2022-02-12T05:58:37.100598+00:00 app[web.1]: /app/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:27:in `require': cannot load such file -- net/smtp (LoadError)
```

これめちゃくちゃ怪しいな、ということでこれが原因なのではと仮説を立てました。
どうやらファイルを読み込むことができていないようですね。
そして[こちら](https://stackoverflow.com/questions/70500220/rails-7-ruby-3-1-loaderror-cannot-load-such-file-net-smtp)の記事を参考にして(英語のため半分程度の理解でしたが)`gem 'net-smtp', require: false`をGemfileに追加して`$ bundle install`を実行後、再度デプロイの流れを実施しました。しかし、エラーは解決せず...

こちらの記事で他の方法でログを確認する方法があることを見つけ`$ heroku run rails console`を実施しました。

```
/app/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:27:in `require': cannot load such file -- net/pop (LoadError)
```

今度は別のファイルが読み込めていないようだ。
しかし、解決の道は必ず開く。

>Ruby3.1で標準ライブラリからいくつかのライブラリが除外されていたことが原因
>引用先：https://qiita.com/li2003038/items/2d93b693fa5885c45276

上記の記事でこのようなヒントを得ることができました。(というか答え)
公式リファレンスを確認してみてこれだ、と確信しました。

>標準添付ライブラリのアップデート
>Bundler から利用する場合は Gemfile に明示的に指定してください。
>引用先：https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/

Gemfileに下記コードを入力することで、無事解決しました。

```
gem 'net-imap'
gem 'net-pop'
gem 'net-smtp'
```

#まとめ
今回Herokuへデプロイをするのにかなり手こずりました。
しかし、今回のエラーを乗り越えたことで自信にもつながりました。
改めて、基本中の基本ではございますが、

**エラーログをしっかりと確認をして仮説を立てる。**
**公式のサイトを確認すること。**

以上2点を習慣づけることの大切さを肌で学び取りました。
こちらの記事で少しでも、お役に立てたら幸いです。
引き続き精進してまいります。

初投稿ということで、稚拙な文章が続いたかと思いますが、
最後までお読みいただきありがとうございます。

#参考文献
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
https://help.qiita.com/ja/articles/qiita-article-guideline
https://devcenter.heroku.com/ja/articles/error-codes#h10-app-crashed
https://jp.heroku.com/dynos