Herokuを用いたデプロイに関するDBのエラー

この記事では、Herokuでデプロイをする際に起きたエラーを解決するまでに至った経緯を、わかりやすく書いていきます。

##はじめに
・投稿者は初学者ですので誤った情報を投稿してしまうことがあります。その時はぜひ、遠慮会釈なしにご指摘いただけると幸いです。

##デプロイのために行った手順
1.Heroku CLIをインストール
　→ターミナルからHerokuへアクセスするため。下記のコマンドをターミナルで実行する。

```
brew tap heroku/brew && brew install heroku
```

2.Herokuにログインする下記のコマンドを使用することによってログインが可能。

```
heroku login --interactive
```

~~3.rails_12factor Gem をインストールする。~~
~~　→RailsアプリケーションをHeroku上で動かすことために必要なGemのこと。~~

<b>Rails 5以降では rails_12factor gem は不要になっている。</b>

詳細は[こちら](https://qiita.com/jnchito/items/54eb7b3df322fc86675e)のQiita記事をご覧ください。


4.Heroku上にアプリケーションを作成する。

```
heroku cretate アプリケーション名
```

5.Heroku上でMySQLを使えるようにする。
　→HerokuのデフォルトDBはPostgreSQLである。今回のRailsアプリケーションはMySQLでDBを構築したので、適用されるように設定しないといけない。

```
heroku addons:add cleardb
```


6.Heroku上でMySQLを使えるようになったが、Gemについても設定変更する必要がある。

```
heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
```

これでClearDBデータベースのURLをheroku_cleardｂという変数に代入ができた。

```
heroku config:set DATABASE_URL=mysql2${heroku_creardb:5}
```
DATABASE_URLがconfig:setによって再設定された。


7.環境変数を用いてmaster.keyの値を設置する。
　→master.keyはセキュリティの都合上、Gitで管理されないため、このままだとHeroku上でデプロイができない。環境変数としてmasteｒ.keyの値を設置することで、Heroku上でも使えるようにする。

```
heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```

8.アプリケーションをプッシュする。

```
git push heroku master
```

9.Heroku上でマイグレーションを実行する。
　→heroku runコマンドを用いることにより、Heroku上でもrailsのコマンドを使うことができる。

```
heroku run rails db:migrate
```

10.公開を確認する。

```
heroku apps:info
```

を実行して表示されたURLに遷移した。 


##発生したエラーと仮説立て

![error massage](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F270456%2F362496d9-176c-ba4f-50ff-9cb2802040b9.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=41d58db36bd60999685d41cb4f5345d1)

URLに遷移すると上記のエラー画面が現れた。

そのため一旦、ターミナルに戻りエラーログの確認作業を行なった。

```
heroku logs --tail
```

上記のコマンドでエラーログを表示させた。
まず目についたのが、

```
2020-11-11T22:07:09.588453+00:00 （中略） dyno=web.1 connect=14ms service=35ms status=500 bytes=1827 protocol=https
```

status=500 とあることからサーバー側の問題であることがわかる。

もう少し詳しく見ていくと、

```
 Mysql2::Error::ConnectionError (Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)):
```

とあったので、<b>MySQLがHeroku上で認識されていないのではないか？</b>と考えた。

##仮説をもとに解決

ターミナルのコードを遡ってみると、やはりMｙSQLの設定のところでおかしな点を見つけた。

```
nayuta@MacBookPro-Nayuta ajax_app % heroku_cleardb='heroku config:get CLEARDB_DATABASE_URL'
nayuta@MacBookPro-Nayuta ajax_app % heroku config:set DATABASE_URL=mysql2${heroku_creardb:5}
Setting DATABASE_URL and restarting ⬢ ajax-app-30306... done, v5
DATABASE_URL: mysql2
```

DATABASE_URLが正しく格納されていない。

```ruby:自分の結果
DATABASE_URL: mysql2
```

```ruby:正しい結果
DATABASE_URL: mysql2://000000000000:0aa0000@us-cdbr-east-02.cleardb.com/heroku_aaa00000000?reconnect=true
```

ここで間違いないと思ったが、手順６で行った作業を見返して見てもコマンドのスペルミスはなく、正しく入力されているように思えた。

```ruby:自分の入力
heroku_cleardb='heroku config:get CLEARDB_DATABASE_URL'
```

```ruby:正しい入力
heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
```

コードと睨めっこをして、調べて、ようやく判明。

本来ならば ``(バッククォーテーション)で囲わないといけないところを、''(シングルコーテーション)で囲っていました。

とても単純なミスでしたが、スペルミスばかりに気を取られて気が付くのが遅れました。

```
nayuta@MacBookPro-Nayuta ajax_app % heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
nayuta@MacBookPro-Nayuta ajax_app % heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
Setting DATABASE_URL and restarting ⬢ ajax-app-30306... done, v12
DATABASE_URL: mysql2://bf691ece578431:8ce97e09@us-cdbr-east-02.cleardb.com/heroku_b4193d2f6e19e50?reconnect=true
```

ちゃんと``で囲んであげると、URLの再設定が完了しました。

ただ、このままプッシュしても下記のようなエラーメッセージが出てきてしまうので、

```
Everything up-to-date
```

空のコミットを作成して、まとめてプッシュしてもらいました。

```
 git commit --allow-empty -m "空のcommit"
```
```
 git push heroku master 
```

正常にプッシュされたようなのでURLに遷移すると、作成したアプリケーションがデプロイされていました。

##まとめ

入力ミスでエラーが起きることはよくあることなので、スペルミスには気を付けていましたが、''と``の入力間違いが起きるとは想像していませんでした。
非常にしょうもないミスではありましたが、「こういうミスがあってエラーが起きた！」という経験値が増えたので幸運でした。