Help us understand the problem. What is going on with this article?

本番環境に自動デプロイしたらwe're sorry, but something went wrong.エラーでアプリが使えない

恐怖のwe're sorry, but something went wrong.

個人アプリを開発したぞ!
そして、追加実装したから設定済みの自動デプロイで本番環境のアプリを更新!
さぁ、本番環境への反映をチェックと......。

we're sorry, but something went wrong.
error.png

何.....だと....! ?´д` ;
本番環境でアプリが開かない!? :(;゙゚'ω゚'):

そのエラーに見事にハマった。
という事で、エラー解決に至るまでの死闘を描く。

herokuへデプロイした際の同じエラー解決記事は結構見つかったものの、意外にMySQLでの解決策は見つからなかった。

今回はMySQLでの対処法だが、we're sorry, but something went wrong.エラーの全てが今回の内容で解決する訳ではないので、あくまで参考に留めて欲しい。

特に追加実装などでGemを増やした人は特に注意して欲しい

開発環境

  • Ruby on Rails6
  • DBはMySQL
  • AWSにEC2インスタンスを使用してデプロイ済み
  • Capistranoで自動デプロイ設定済み

というのが前提です。

事件の始まり(自動デプロイ直後)

ふと思い立って追加実装する為にGemを追加した。
記述を終えてローカル環境での動作を確認したので、私はコミットしてマージを終えた.....。

本番環境へ反映させる為に、以下のコマンドをターミナルのローカルディレクトリで入力。

$ bundle exec cap production deploy

無事にデプロイが完了したメッセージがターミナルに表示されたので、本番環境でのチェックをしたところ、上記画像のようにアプリが開かなくなってしまった.....。

何故だ!?((((;゚Д゚)))))))

ローカルでは問題なくても、いざ本番環境となるとエラーが起きてしまうパターンはある。
エラー文はググれば何となく分かっても、肝心の解決策が浮かばない。

となると、エラーが起きている箇所のログをチェックする必要がある。

容疑者Logの捜査(本番環境のlogを追え!)

ローカル環境でLogをチェックする場合は、log/development.rbをチェックする。
ここで自身のLogが追えるので、ファイルを下にスクロールしていけば最新のLogへとたどり着ける。

しかし今回の問題は本番環境なので、本番環境のログをチェックしないといけない。
その為にはEC2へログインする事になる。

しかし、久しぶりでコマンドがうろ覚え.....。

以下を順にローカルのターミナルに入力していく。

①mkdir ~/.ssh

②cd .ssh/

③lsコマンドで、EC2で作成済みの<鍵名>.pemが表示される。

④chmod 600 <鍵名>.pem

⑤ssh -i <鍵名>.pem ec2-user@<EC2で発行したElastic IP>

すると、

  __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

と、上記の表示が出てEC2へのログインが完了。
次がいよいよ本番環境のlogのチェック

①$ cd  /var/www/<リポジトリ名>
アプリのディレクトリへ移動

②ls
再びlsコマンドを入力。

③cd current
複数のファイルの中にcurrentがあるので移動。

④cd log
⑤ls
laコマンドを入力すると、production.log  unicorn.stderr.log  unicorn.stdout.log
これらのlogファイルが表示される。

⑥[ec2-user@****** log]$ cat 'production.log'

今回は本番環境のエラー内容を知りたいので、上記を入力する事で本番環境のlogが追える。
その中で表示されるエラー内容をチェックしましょう!

終わらぬ事件(失敗する自動デプロイ)

エラー内容を見つけ、修正したら改めてmasterへコミット。
そして自動デプロイ!

これがそのまま成功すればエラー解決となるが、そうは問屋がおろさなかった。
困ったことに自動デプロイが失敗するようになってしまった。

何故だ!?((((;゚Д゚)))))))

ふと、ここで思った。
事件(エラー)が発生するようになったのは、Gemを増やしてから。

ならば、bundle installしてみよう。
ただし、ローカルと本番環境の両方で。

その結果、

本番環境
Bundle complete! 34 Gemfile dependencies, 115 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

ローカル
Bundle complete! 36 Gemfile dependencies, 126 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

ローカル環境でのGemが36個に対し、本番環境は34個と反映されていなかった。
bundle installしても更新されない。

どうすればいい?((((;゚Д゚)))))))
そこで参考になったのがこの記事

平和な日常(EC2インスタンスやデータベースの再起動)

つまりは自動デプロイも繰り返すと本番環境に反映しなくなってしまうという事が分かった。

【対処法】
①AWSのマネージメントコンソールにログイン

EC2 → インスタンス → 該当のインスタンスをクリック → アクションのインスタンスの状態 → 再起動 を行います。

②ターミナルからEC2にログイン後、以下のコマンドを実行してnginxとMySQLを再起動しよう。

EC2サーバーで入力
$ sudo service nginx start 
$ sudo service mysqld start

もしも、MySQLではなく、mariaDBを使っていたら下記でデータベースを再起動しよう。

EC2サーバーで入力
$ sudo systemctl restart mariadb 

これらのコマンドで、データベースやAWSインスタンスを再起動すれば自動デプロイが成功し、Gemのbundle installも反映されました。

今回はGemを起因としたエラーだったので、同じエラーでも全く解決策が違う可能性もあり得ます。

あくまで一つの手段として、インスタンスやデータベースの再起動をした上で、再度デプロイする事でサーバーが開かないエラーからは逃れることが出来る事もあるでしょう。

以上です。

athlaliel
30代からIT業界へ異業種転職を目指してプログラミング学習中です。 アウトプットを備忘録を兼ねて発信をしています。 誤り等ありましたらご指摘頂けると幸いです。
https://twitter.com/athlaliel2020
tensyoku_quest
未経験からエンジニア転職する人に対し「地図」「情報」「仲間」「メンター」「戦略」を共有するコミュニティです。
https://engineer-sokutsu.com/salon/lp/announce4/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした