herokuデプロイする際のエラー

Ruby on Rails で作ったアプリをherokuを使ってデプロイしようとしたらできなかった。
<h1>問題点</h1>

```
remote:  !     The Ruby version you are trying to install does not exist on this stack.
remote:  !     
remote:  !     You are trying to install ruby-2.6.5 on heroku-20.
remote:  !     
remote:  !     Ruby ruby-2.6.5 is present on the following stacks:
remote:  !     
remote:  !     - heroku-18
remote:  !     
remote:  !     Heroku recommends you use the latest supported Ruby version listed here:
remote:  !     https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
remote:  !     
remote:  !     For more information on syntax for declaring a Ruby version see:
remote:  !     https://devcenter.heroku.com/articles/ruby-versions
remote:  !

```

調べてみたところrubyのバージョンとherokuのバージョンがあってないっぽい

<h1>解決策</h1>

```
heroku stack:set heroku-18 
```
このコマンドでheroku18に落とす。
その後再度pushしてみる

```
git push heroku master
```


エラーが変わったのでherokuのバージョンに関してはいいみたい
次はbundlerが原因かな？

<h1>再度問題発生</h1>

```
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote:  !
```

<h1>解決策Part2</h1>
最初はbundlerのバージョンかなとも思って、

```
bundler -v
```
を実行してもログに流れていたherokuで使うbundlerとバージョンが同じなので違う

エラーログをもうちょっと読んでみたら

```
remote:        --add-platform x86_64-linux` and try again.
remote:        Bundler Output: Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
remote: 
```

```
bundle lock --add-platform x86_64-linux
```
このコマンドがあることに気づきました。
しかもand try againまで笑

これ打ち込んでもう一回やってみろ！とのことなので

上記コマンド実行した後に、

```
 git add
 git commit -m "コミットメッセージ"
 git push -u origin master
 git push heroku master
```
さあこれで解決するか？？




......と思いきや

<h1>またまた問題発生</h1>

はい。途中まで結構いい感じにログも進んでいたんですけど、

```
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
```

コンパイルで問題発生。
前にデプロイした時にこんな感じのエラーが出たことがありその時は
config/enviromentの以下のコードをコメントアウトした気がします
config.assets.js_compressor = :uglifier

でも今回はそれっぽいログがないので違うみたいです。
ログを読んでみると、、、
ありました

```
remote:        Running: rake assets:precompile
remote:        rake aborted!
remote:        ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
```

`aws_access_key_id,`  `aws_secret_access_key`
この二つがないというエラーみたいです

argumenterrorは引数がないときに出たりするエラーです！

この二つはawsのs3を使う時に設定したのになんで設定されていないんだ？と思いました

<h1>解決策</h1>

__結論__からいうと`.env`ファイルに環境変数として設定したものはlocalの中でしか指定されていないのでheroku側で引用することができないみたいです。
当たり前ですね笑
なのでherokuでも指定してあげないといけません

いろいろ記事を調べてみたのですが
ターミナルから設定する方法とherokuのブラウザで設定する方法があります

ターミナルではこんな感じで

```
heroku config:set AWS_ACCESS_KEY_ID='AWSで作成したAccess key ID'
heroku config:set AWS_SECRET_ACCESS_KEY='AWSで作成したSecret access key'
heroku config:set AWS_DEFAULT_REGION='ap-northeast-1'
```

*__注意点としては__*
左辺と右辺の間に半角スペースを入れないことです。

例1)heroku config:set AWS_ACCESS_KEY_ID = xxxxxxxxxxxxx
これで実行するとターミナルで下のログがでます
__初見でこれみた時はエラーじゃなくて普通に上手く行っていると思いましたがそうではありません__

```
"入力したアクセスキー"  is invalid. Must be in the format FOO=bar.
```

`Foo=bar`とあるようにこの形式じゃないといけないみたいですね
例1で書いた式は左辺と右辺の間に半角スペースが入っているのでこれを無くします
`heroku config:set AWS_ACCESS_KEY_ID=xxxxxxxxxxxxx`
こうですね！
多分`""ダブルクォーテーション`もいらないと思います
`heroku config:set AWS_ACCESS_KEY=xxxxxxxxxxxxx`
`heroku config:set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxx`
この二つを実行したらデプロイできるようになっていると思います！

ターミナルで打つのが面倒なら
herokuのブラウザ　→ dashboard → 設定したいアプリ →　　Setting → Reveal Config Vars

と実行することで環境変数を設定することができます！

僕の場合は
`aws_access_key_id`と`aws_secret_access_key`の二つを直接設定して
実行したところ無事にpushできました！

```
git push heroku master
↓
heroku run rails db:migrate
```

これで完全にデプロイ完了です！
あーつかれた