ファイル保存先をS3に設定後、RailsアプリをHerokuにpushすると失敗するエラーについて

## エラー発生の経緯

本番環境でファイルを投稿後、1日程経つとファイルが表示されなくなる問題が発生していたため、HerokuへデプロイしていたRailsアプリを更新し、ファイルアップロード先をAWS S3に変更しました。

ローカル環境では適用に成功しましたが、`git push heroku master`コマンドで本番環境に適用しようとするとエラーが発生しました。

エラー内容

```zsh:ターミナル
Caused by:
ArgumentError: key must be 16 bytes
```


## 結論

以下のコマンドで環境変数を設定するとエラーが解消されました。
`` heroku config:set RAILS_MASTER_KEY=`cat config/master.key` ``


## 原因
元々下記のようなエラーが出ており、解消のために
`` heroku config:set RAILS_MASTER_KEY=`rake secret` ``
と言うコマンドで環境変数を設定していました。

```zsh:ターミナル

-----> Preparing app for Rails asset pipeline
       Running: rake assets:precompile
       Missing encryption key to decrypt file with. Ask your team for your master key and write it to /tmp/build_6edee55a_/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].
 !
 !     Precompiling assets failed.
 !
 !     Push rejected, failed to compile Ruby app.
 !     Push failed
```

`` `rake secret` ``は secret.yml を使っている場合のコマンドであり、credentials.yml.enc (Rails5.2以降) を使っている場合は`RAILS_MASTER_KEY` には`` `cat config/master.key` ``と設定する必要がありました。

参考：[Ask your team for your master key and put it in ENV[“RAILS_MASTER_KEY”] on heroku deploy](https://stackoverflow.com/questions/44298334/ask-your-team-for-your-master-key-and-put-it-in-envrails-master-key-on-herok)


## 解決までに行ったこと

エラー解消方法に気づく直前まで、最後の方で出力されていた以下のようなエラーに注目していました。
出力されている通り`Precompiling assets failed`、`Push rejected`、`failed to compile Ruby`、`Push rejected`といったワードで検索してエラー解消に奮闘していましたが、解決しませんでした。

```zsh:ターミナル
remote:        /tmp/build_0a1646cf/vendor/bundle/ruby/2.5.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:62:in `block (2 levels) in define'
remote:        Tasks: TOP => environment
remote:        (See full trace by running task with --trace)
remote: 
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !       Push rejected to (アプリ名).
remote: 
To https://git.heroku.com/(アプリ名).git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/(アプリ名).git'
```


#### エラー解消に繋がらなかった作業

<details><summary>1. **heroku git push先を再設定**</summary>
herokuのリモートリポジトリをセット
　`git remote set-url heroku https://git.heroku.com/(アプリ名).git`
heroku git push先確認
　`git remote -v`
</details>

<details><summary>2. **config/application.rbの設定変更**</summary>
config/application.rb の `config.assets.initialize_on_precompile = true` を `config.assets.initialize_on_precompile = false` に変更
参考　[RailsでアプリをHerokuにあげる時のエラー各種](https://qiita.com/pokohide/items/017afa5be3b7dc200a8d)
　　　[Herokuにpushしたらprecompile assets faild.が。pushできたと思ったらApplication Errorが。解決するまで。](https://qiita.com/hellojtokyo/items/ef1d4a390f8cbb06f6b7)
</details>

<details><summary>3. **assets:precompileの設定変更**</summary>
`RAILS_ENV=production bundle exec rake assets:precompile`
参考　[Herokuにデプロイしたときの「Precompiling assets failed.」エラーについて](https://tkoyama1988.hatenablog.com/entry/2017/01/23/010255)</details>

<details><summary>4. **buildpackを手動設定してデプロイ**</summary>
`heroku buildpacks:set heroku/ruby`
参考　[Heroku へのデプロイに参った！](https://i-heikichi.com/lightningchild/2019/02/06/cloud9-%E3%81%AE-ruby-on-rails-%E3%82%92-heroku-%E3%81%B8%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4/)</details>

<details><summary>5. **Herokuを消して、作り直し**</summary>
Herokuのアプリ管理画面の Settings → Delete app からアプリを削除
`git remote rm heroku` でremoteにあるherokuを削除
`heroku create (アプリ名)` でアプリを作り直す ※アプリ名は元と同じ
`git push heroku master`でデプロイ
参考　[herokuにデプロイできない](https://nomikura.hatenablog.com/entry/2019/12/15/heroku%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)
</details>

<details><summary>6. **通常にデプロイできていた部分までrevertして再デプロイ**</summary>
GitHub Desktop の History でコミットを1つずつ右クリックして Revert this Commit
</details>

<details><summary>7. **強制プッシュでデプロイ**</summary>
`git push heroku --force master`</details>


## 学んだこと

・ログは上の方もしっかり読む(最後の方のログに惑わされない)
・エラー発生直前に行った作業から原因を推測する(関係の薄いファイルはいじり過ぎない)
・`credentials.yml.enc`、`config/master.key`、 環境変数の仕組みを理解することが重要
・herokuはアプリを消すと再度同じURLでアプリ作成、デプロイできる
・Git で管理されないファイルを変更したりして環境変数が関わるエラーが発生した際は revert や 再デプロイしても本番環境のエラーは直らない

特に`Precompiling assets failed`といったエラーに関する情報は沢山ありますが、原因は様々なため、エラー内容をしっかり見ることが非常に大切だと実感しました。

※最後の方のエラーばかり見て解決に何時間もかかっていましたが
「ArgumentError: key must be 16 bytes」がエラーの本体だと気づいた後、30分もかからずに解決しました！