Rails4+Capistrano3+Nginx+Unicorn EC2へのデプロイ < 後編 >

  • 0
    いいね
  • 0
    コメント

    インフラ勉強中の者がAWSにrailsアプリをEC2にデプロイしたので備忘録として残します。
    < 後編 >です。

    【イメージ】
    スクリーンショット 2017-05-09 11.04.30.png

    < 前編 >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 の配下を確認します。

    EC2
    [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
    [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
    [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
    [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
    [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
    
    EC2
    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/ を叩いて確認してみます。

    EC2
    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
    [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を叩けば下記の画面が表示されると思います。
    スクリーンショット 2017-05-09 16.28.33.png

    大変参考にさせていただきました。
    capistranoを使ってrailsをnginx+unicorn+mysqlの環境にデプロイする
    ローカルで開発したRailsアプリをCapistrano3でEC2にデプロイする
    Capistrano3でUnicorn+Nginxな環境にRailsをデプロイする:初心者向け
    Railsプロダクション環境 Unicornでsecret_key_baseが設定されていないとエラーが出る