RailsのアプリをEC2へデプロイしてみる-後編(デプロイ)-

#この記事について
前編の内容を前提として進めていきます。
予めGitHubのリポジトリを作成しておいてください。
今回はEC2を使ったRailsアプリのデプロイをします。

（前編）
https://qiita.com/kotobuki562/items/92827bcf99d89b350445
（後編-データベース構築-）
https://qiita.com/kotobuki562/items/92827bcf99d89b350445

#GitHubのSSH鍵を登録
まずはGitHubのリポジトリをEC2にクローンするために、SSH鍵を登録しましょう。SSH鍵を登録しないと、EC2がGitHubに接続することができません。

下記のコマンドをEC2内で実行してください。
実行すると色々入力を求められることがあります。
その際は全て「Enter」を押してください。
成功すると「RSA 4096」といった図形の様なものが出力されます。

```terminal
[ec2-user@ip-111-11-11-111 ~]$ ssh-keygen -t rsa -b 4096
```

それではcatコマンドでSSH鍵の中身を見ていきましょう。
下記のコマンドを実行してください。

```terminal
[ec2-user@ip-111-11-11-111 ~]$ cat ~/.ssh/id_rsa.pub
```

続いてGirHubに移動してSSH鍵の登録をしましょう
下記のURLからアクセスして、先ほどのcatコマンドで確認したSSH鍵をコピペしましょう。
GitHub側のSSH鍵のタイトルは好きな名前をつけてください。
https://github.com/settings/keys

鍵を登録できたら下記のコマンドを実行してください。
実行後、yes/no聞かれるのでyesを洗濯してください。
その後アクセスが完了します。

```terminal
[ec2-user@ip-111-11-11-111 ~]$ ssh -T git@github.com
```

#アプリケーションサーバー
今回は「unicorn」を使ってアプリケーションサーバーを作っていきます。
unicornのGemのインストールがまだの方は先にインストールをしましょう。

今回はproductionの環境で構築していきます。

```.Gemfile
group :production do
  gem unicorn
end
```

続いて、config内にunicorn.rbを作成し、下記の様に記述しましょう。
サンプルとして記述しておきますが、ご自身で設定されるのでもOKです。

```config/unicorn.rb

app_path = File.expand_path('../../', __FILE__)

worker_processes 1

working_directory app_path

pid "#{app_path}/tmp/pids/unicorn.pid"

listen 3000

stderr_path "#{app_path}/log/unicorn.stderr.log"

stdout_path "#{app_path}/log/unicorn.stdout.log"

timeout 60

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exist?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH => e
      logger.error e
    end
  end
end

after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end
```

#GitHubリポジトリをクローンする

続いてGitHubからクローンするためにディレクトリを作りましょう。
ディレクトリを作成したら権限をEC2ユーザーに渡すので、

```terminal
[ec2-user@ip-111-11-11-111 ~]$ sudo mkdir /var/www/
[ec2-user@ip-111-11-11-111 ~]$ sudo chown ec2-user /var/www/
```

作成したディレクトリにGitHubをクローンします。
ディレクトリに移動してgit cloneコマンドを実行してください。
最後にbundle installでGemを適用しましょう。

```
[ec2-user@ip-111-11-11-111 ~]$ cd /var/www/
[ec2-user@ip-111-11-11-111 www ~]$ git clone コピーしたURLを貼り付ける
[ec2-user@ip-111-11-11-111 app ~]$ bundle install
```

続いて環境変数を設定していきます。
下記のコマンドを実行してください。
出てきたらそれをコピーしておきましょう。

```terminal
[ec2-user@ip-111-11-11-111 <リポジトリ名> ~]$ rake secret
```

続いて実際に環境変数を記述していきます。
下記コマンドを実行して記述していきましょう。

```terminal
[ec2-user@ip-111-11-11-111 ~]$ sudo vim /etc/environment
```

前章で設定したデータベースの環境変数を設定していきます。
下記2点を記述していきましょう

```terminal
DATABASE_PASSWORD='データベースのrootユーザーのパスワード'
SECRET_KEY_BASE='さきほど作成したsecret_key_base'
```

これでひとまず準備完了。

#EC2のポート解放
webのEC2に戻り、ポートを解放しましょう。
先ほど記述したunicorn.rbのポート番号3000を解放します。
設定の仕方は前編で述べているので、そこを確認してください。
下記の画像の様に設定してください。

![スクリーンショット 2020-11-11 12.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/4e74aa39-66d5-5d41-844d-ccdcef3177be.png)

#デプロイ
まずはローカルのdatabase.ymlを編集します。
下記の様に編集してください。
databaseは編集しないでください。

```config/database.yml
production:
  <<: *default
  database: app_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```
ターミナルのEC2に戻り、git pullしましょう。

```terminal
[ec2-user@ip-111-11-11-111 <リポジトリ名>] git pull origin master
```

EC2内でデータベースをcreateしてmigrateしましょう。
これで準備完了です。

```terminal
[ec2-user@ip-111-11-11-111 <リポジトリ名>]$ rails db:create RAILS_ENV=production
[ec2-user@ip-111-11-11-111 <リポジトリ名>]$ rails db:migrate RAILS_ENV=production
```

それではassets:orecompileでassetsディレクトリを反映させます。
最後にbundle exec unicorn_railsでサーバー立ち上げてください。

```terminal
[ec2-user@ip-111-11-11-111 <リポジトリ名>]$ rails assets:precompile RAILS_ENV=production
[ec2-user@ip-111-11-11-111 <リポジトリ名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```

立ち上げが確認できているか確認するため下記のコマンドを実行してください。

```terminal
[ec2-user@ip-111-11-11-111 <リポジトリ名>]$ ps aux | grep unicorn

#下記の様なプロセスが出力されます。

ec2-user  5879  0.0 13.0 515244 131640 ?       Sl   11月09   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user  5887  0.0 12.6 525216 127600 ?       Sl   11月09   0:02 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 15917  0.0  0.0 119436   976 pts/0    S+   03:26   0:00 grep --color=auto unicorn
```

停止させる場合は下記のコマンドを記述してください。

```terminal
[ec2-user@ip-111-11-11-111 <リポジトリ名>]$ kill 5879 #プロセスIDを停止
```

プロセスをkillした後下記コマンドを実行して実際にブラウザに反映されているか確認しましょう。
http://＜Elastic IP＞:3000/でアクセスすることができます。

```terminal
[ec2-user@ip-111-11-11-111 <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
```

#エラーログ
最後にもしデプロイ後、エラーが起きた際は下記のコマンドを実行して、エラーログを見てみましょう。
先ほどunicorn.rbに記述したエラーログの格納先にアクセスしてみてみましょう。

```terminal
[ec2-user@ip-111-11-11-111 <リポジトリ名>]$ less log/unicorn.stderr.log
```