AWSにrailsアプリをEC2にデプロイしたので備忘録として残します。
< 後編 >です。
< 前編 > で Unicorn
の設定までを実施しました。
##デプロイチェック
$ bundle exec cap production deploy:check
デプロイチェックをすると下記のようなエラーが出るはずです。
~ 省略 ~
00:02 deploy:check:linked_files
ERROR linked file /var/www/deployApp/shared/config/database.yml does not exist on YOUR_IP_ADDRESS
/var/www/deployApp/shared/config/
に database.yml
が存在しないためのエラーです。
shared
ディレクトリは、Capistranoが自動生成するディレクトリです。
EC2の qiitaApp
の配下を確認します。
[myname@ip-10-0-1-86 qiitaApp]$ ls -la
drwxrwxr-x 4 ec2-user ec2-user 4096 5月 9 04:08 .
drwxrwxrwx 3 root root 4096 5月 9 04:06 ..
-rw-rw-r-- 1 ec2-user ec2-user 6 5月 9 03:33 .ruby-version
drwxrwxr-x 2 ec2-user ec2-user 4096 5月 9 04:08 releases ← 自動生成
drwxrwxr-x 7 ec2-user ec2-user 4096 5月 9 04:08 shared ← 自動生成
config
配下に database.yml
を生成すればエラーは出なくなるのですが、次に同じようにsecrets.yml
が存在しないというエラーが出ますので、共に生成して変更します。
EC2上にdatabase.ymlの生成の前にローカルの database.yml
を変更します。
$ vi config/database.yml
======================= database.yml ================================
~ 省略 ~
#production:
# <<: *default
# database: db/production.sqlite3
↓↓↓
production:
<<: *default
adapter: mysql2
database: qiita_db
host: qiita_db.xxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
username: qiita_user
password: YOUR_DB_PASS
encoding: utf8
====================================================================
変更したら database.yml
全体をコピーして保存します。
[ec2-user@ip-10-0-1-86 qiitaApp]$ cd shared/config/
[ec2-user@ip-10-0-1-86 config]$ touch database.yml
[ec2-user@ip-10-0-1-86 config]$ vi database.yml
======================= database.yml ===============================
ローカルでコピーしたdatabase.ymlを貼り付けます。
====================================================================
同様に secrets.yml
もローカルの中身をコピーして(変更はなし)、configの配下に secrets.yml
を生成して貼り付けます。
[ec2-user@ip-10-0-1-86 config]$ touch secrets.yml
[ec2-user@ip-10-0-1-86 config]$ vi secrets.yml
再度、デプロイチェックを実施します。
$ bundle exec cap production deploy:check
エラーが出なければdeploy:check
は完了です。
##デプロイ
$ bundle exec cap production deploy --trace #traceをつけることでバグの箇所を発見しやすくします
エラーが出なければデプロイ完了です。
今回は、scaffoldで簡単なUserアプリを生成しているので、 直接、http://IP_ADDRESS/users/
を叩いて確認してみます。
...おそらく500エラーが返ってきてしまって確認できないと思います。
Unicornの状態とエラーログを確認します。
[ec2-user@ip-10-0-1-86 config]$ ps ax | grep unicorn
30256 ? Sl 0:01 unicorn master -c /var/www/qiitaApp/current/config/unicorn.rb -E deployment -D
30311 ? Sl 0:00 unicorn worker[0] -c /var/www/qiitaApp/current/config/unicorn.rb -E deployment -D
30313 ? Sl 0:00 unicorn worker[1] -c /var/www/qiitaApp/current/config/unicorn.rb -E deployment -D
30316 ? Sl 0:00 unicorn worker[2] -c /var/www/qiitaApp/current/config/unicorn.rb -E deployment -D
30334 pts/1 S+ 0:00 grep --color=auto unicorn
Unicornは稼働していることが確認できます。
次はエラーログです。
[ec2-user@ip-10-0-1-86 config]$ cd ../..
[ec2-user@ip-10-0-1-86 qiitaApp]$ tail -f current/log/unicorn_error.log
この状態で再度ローカルからデプロイします。
[ec2-user@ip-10-0-1-86 qiitaApp]$ bundle exec cap production deploy
I, [2017-05-09T06:57:08.516736 #30256] INFO -- : executing ["/var/www/qiitaApp/shared/bundle/ruby/2.3.0/bin/unicorn", "-c", "/var/www/qiitaApp/current/config/unicorn.rb", "-E", "deployment", "-D", {8=>#<Kgio::UNIXServer:fd 8>}] (in /var/www/qiitaApp/releases/20170509065649)
I, [2017-05-09T06:57:08.735844 #30256] INFO -- : inherited addr=/tmp/unicorn.sock fd=8
I, [2017-05-09T06:57:08.736108 #30256] INFO -- : Refreshing Gem list
I, [2017-05-09T06:57:09.978667 #30311] INFO -- : worker=0 ready
I, [2017-05-09T06:57:09.981219 #30256] INFO -- : master process ready
I, [2017-05-09T06:57:09.982336 #30313] INFO -- : worker=1 ready
I, [2017-05-09T06:57:09.985331 #30316] INFO -- : worker=2 ready
I, [2017-05-09T06:57:10.155786 #29111] INFO -- : reaped #<Process::Status: pid 29166 exit 0> worker=0
I, [2017-05-09T06:57:10.155874 #29111] INFO -- : reaped #<Process::Status: pid 29168 exit 0> worker=1
I, [2017-05-09T06:57:10.155945 #29111] INFO -- : reaped #<Process::Status: pid 29171 exit 0> worker=2
I, [2017-05-09T06:57:10.155973 #29111] INFO -- : master complete
この時点ではエラーらしきものが出ていません。
再度 http://IP_ADDRESS/users/
を叩いて確認してみます。
E, [2017-05-09T06:59:27.508190 #30316] ERROR -- : app error: Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml` (RuntimeError)
Missing secret_token and secret_key_base
とあります。
EC2上の qiitaApp/current/config/secrets.yml
の secret_key_base:の環境変数(SECRET_KEY_BASE)が設定されていないことが原因です。
[ec2-user@ip-10-0-1-86 qiitaApp]$ cd current
[ec2-user@ip-10-0-1-86 current]$ bundle exec rake secret
1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz ←コピーする
[ec2-user@ip-10-0-1-86 current]$ vi config/secrets.yml
============================== secrets.yml ==================================
~ 省略 ~
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
↓↓↓
secret_key_base: 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz
=============================================================================
本来であれば、直接入力するのではなく、
SECRET_KEY_BASE=1234567890abcd...
export SECRET_KEY_BASE
とかで環境変数のまま使用すべきです。
が、何回実施してもググってもうまくいかなかったので、取り急ぎ直接入力で対応します。
dotenvというgemがあるようなので、それで対応してもいいと思います。
再度、ローカルからデプロイして、urlを叩けば下記の画面が表示されると思います。
大変参考にさせていただきました。
capistranoを使ってrailsをnginx+unicorn+mysqlの環境にデプロイする
ローカルで開発したRailsアプリをCapistrano3でEC2にデプロイする
Capistrano3でUnicorn+Nginxな環境にRailsをデプロイする:初心者向け
Railsプロダクション環境 Unicornでsecret_key_baseが設定されていないとエラーが出る