独学ではじめてAWSのEC2にデプロイする方法⑨（Railsの起動）

## ポートの解放
config/unicorn.rb に listen 3000 と記述しましたが、これはRailsのサーバを3000番ポートで起動するということを意味するのでした。
HTTPがつながるように「ポート」を開放する必要があります。

### 手順
1.[EC2を開く](https://ap-northeast-1.console.aws.amazon.com/ec2/)
![スクリーンショット 2020-01-14 19.47.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/f2014e64-5bd6-c3da-12f2-7e6ffac76602.png)
2. 『実行中のインスタンス』を開く
3. インスタンスを選択
![スクリーンショット 2020-01-10 16.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/3806916f-bac9-11d0-043a-e9862ca06ac8.png)
4. セキュリティグループの『launch-wizard-3』をクリック
![スクリーンショット 2020-01-10 16.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/f94927db-4bdb-3f1e-be62-1ae81efea8e1.png)
5. 下記の画面が表示される
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3435353430332f37323334663664362d323935342d626334662d643634662d3466633236353061303066312e706e67 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/9037da6e-f2cf-8938-de7b-47e5e706b43d.png)
6.『　インバウンド　』を選択
 ![スクリーンショット 2020-01-10 20.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/31401bed-7cd8-ab95-e088-bebc7c4c08c7.png)
7. 『　編集　』をクリック
![スクリーンショット 2020-01-10 20.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/1c404b3d-050c-8804-6090-b085c9b7f3bd.png)
8. 左下の『ルールの追加』をクリック
[![Image from Gyazo](https://i.gyazo.com/ed94c2e156f5789d50be78bdb7ca24a6.gif)](https://gyazo.com/ed94c2e156f5789d50be78bdb7ca24a6)
9. タイプ：「カスタムTCPルール」、プロトコルを「TCP」、ポート範囲を「3000」、送信元を「カスタム」「0.0.0.0/0」に設定
![スクリーンショット 2020-01-14 19.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/42ff0462-7e2b-07fd-970f-fada9a89eb37.png)
10. 画面左下の『　保存　』をクリック

## Railsの起動



# Rails 5.1以前の場合

database.ymlに下記を追加します

```ruby:config/database.yml（ローカル）
production:
  <<: *default
  database: アプリ名
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

```

追記が完了したら、EC2でも反映させます。
EC2とGithubは接続できているため、git pullコマンドを利用します。

```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>] git pull origin master
```
データベースの作成をする

```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'
```
この際に下記の表示が出た場合、、、うまくいっていません。
![スクリーンショット 2020-01-18 22.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/28e12ae1-de63-c975-83fb-4f9bb6bb59c2.png)

アプリのディレクトリを開いてからコマンドを実行しましょう

```
#うまくいかない　＝ アプリ名を指定していない
[ec2-user@ip-172-31-23-189 ~( ここが指定されていない )]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'

#アプリ名（リポジトリ）を指定しているのでちゃんと処理がされる
[ec2-user@ip-172-31-23-189 <アプリ名>]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'


```

rails db:migrateを実行して、migrationを完了させる。

```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>]$ rails db:migrate RAILS_ENV=production
```
### エラーが出る場合
Mysql2::Error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'というエラーが起こった場合、mysqlが起動していない可能性があります。

```:ターミナル(EC2)
sudo service mysqld start

#再起動をさせたい場合は、
sudo service mysqld restart
```
というコマンドをターミナルから打ち込み、mysqlの起動を試してみましょう。



参考記事
[Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)](https://qiita.com/carotene4035/items/e00076fe3990b9178cc0)

### ユニコーンを起動

```
[ec2-user@ip-172-31-23-189 ~]$ cd /var/www/[リポジトリ]
[ec2-user@ip-172-31-23-189 <app名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```



# Rails5.2以降の場合

### credentials.ymlの設定


```:ターミナル（ローカル）
アプリ名 $ EDITOR=vim bin/rails credentials:edit
```

すると編集画面が表示されます。
しかし文字入力ができないので、
『　i　』を押して、----INSERT----モードに変更します

下記を入力します。

```ruby:credentials.yml
db:
  database: アプリ名
  username: root
  password: 設定したPW
  socket: /var/lib/mysql/mysql.sock
```
passwordは[はじめてAWSでデプロイする方法⑤（EC2の環境構築、Ruby, MySQL）](https://qiita.com/nousi/private/f4e44f5f88cca6fdbcff)の『MySQLのrootパスワードの設定』で設定しています。

次に、database.ymlにcredential.ymlで設定した環境変数を記述します

```ruby:config/database.yml
production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
```

### 本番環境のshared/configにmaster.keyを作成
[手順](https://qiita.com/nousi/items/4653f625ffabc7318a8a)


#### ローカル環境にある,master.keyの中身を確認する

rails newで作成された、ローカルのmaster.keyを確認する。

```
$ vi config/master.key
```
すると下記のようにmaster.keyの中身が表示されます。

```
fadfdfdgaf44623535y....
```
この表示された、master.keyの値をコピーしましょう

![スクリーンショット 2020-01-18 18.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/363d699e-b403-55ff-01f0-f137ea1d3914.png)
表示されたmaster.keyをコピーします。
これを本番環境で貼り付けていきます。


#### 本番環境でmaster.keyを作成
EC2のアプリのconfigを開きましょう

```
#本番環境
[ec2-user@ip-172-31-23-189 ~]$ cd /var/ここはそれぞれ違います/[アプリ名]
[ec2-user@ip-172-31-23-189 <アプリ名>]$ cd shared/config
```
そうしたら、本番環境上でmaster.keyを作成します

```
[ec2-user@ip-172-31-23-189 config]$ vi master.key
# ローカル環境のmaster.keyの値を入力
fsdgagaf08deg424~~~~~
````
画像だと下記のような画面になります。


![スクリーンショット 2020-01-18 18.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/363d699e-b403-55ff-01f0-f137ea1d3914.png)
『　i　』を押すと----INSERT-----と表示がされて、文字入力ができます。 
ここにコピーしたローカルのmaster.keyの値を貼り付けします。


『　esc　』ボタンを押した入力モードを終了
『　:wq　』入力して保存します

これで本番環境でもmaster.keyが設定されています。





### ユニコーンを起動

```
[ec2-user@ip-172-31-23-189 ~]$ cd /var/www/[リポジトリ]
[ec2-user@ip-172-31-23-189 <app名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```

## エラーが発生した場合

### can't find gem bundler (>= 0.a) with executable bundle
[can't find gem bundler (>= 0.a) with executable bundle 対応](https://qiita.com/sshuuu/items/213b4e82167317e1ebb3)

原因：bundlerのバージョンが、gitcloneしたAppとEC2で異なるため失敗している。
解決策

```:ローカルのbundlerを確認
$ bundle -v
Bundler version 2.0.2
```
これで2.0.2のバージョンを利用しているとわかる。

```:EC2
[ec2-user@ip-172-31-23-189 <app名>]$ gem install bundler -v 2.0.2
```
これで最後にbundle installをして完了

```:EC2
[ec2-user@ip-172-31-23-189 <app名>]$ bundle install
```



### Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Mysql2::Error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'というエラーが起こった場合、mysqlが起動していない可能性があります。

```:ターミナル(EC2)
sudo service mysqld start

#再起動をさせたい場合は、
sudo service mysqld restart
```

### Can't connect to local MySQL server through socket '/tmp/mysql.sock' (13)
database.ymlとcredentials.ymlの中身に漏れがないか確認をしてください

```ruby:credentials.yml
db:
  database: アプリ名
  username: root
  password: 設定したPW
  socket: /var/lib/mysql/mysql.sock
```


```ruby:config/database.yml
production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
　#ここのsocketが抜けていないか？？？
```



## サイトにアクセスしてみる
ブラウザで http://＜サーバに紐付けたElastic IP＞:3000/ にアクセスしてみましょう
ブラウザにCSSの反映されていない（ビューが崩れている）画面が表示されていれば成功です。

### アセットコンパイルする
レイアウトが崩れてしまっているでしょう。

開発中には正常に表示されていたのに、本番ではうまく表示されないのはなぜでしょうか？

これは、開発中はアクセス毎にアセットファイル（画像・CSS・JSファイルの総称）を自動的にコンパイル(圧縮)する仕組みが備わっていますが、本番モードのときにはパフォーマンスのためアクセス毎には実行されないようになっているためです。



```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>]$ rails assets:precompile RAILS_ENV=production
```

```:成功した場合
Yarn executable was not detected in the system.
Download Yarn at https://yarnpkg.com/en/docs/install
I, [2020-01-18T12:51:01.4345644 #1265]  INFO -- : Writing /var/app/web-share/public/assets/member_photo_noimage_thumb-224a733c50d48aba6d9fdaded809788bbeb5ea5f6d6b8368adaebb95e58bcf53.png
I, [2020-01-18T12:51:02.2615123#1265]  INFO -- : Writing /var/app/appname/public/assets/application-bc071e28a78e2b63c9313afed5ad3476e00e3f0e5b12445c37214d1f1317be48.js
I, [2020-01-18T12:51:02.2626434 #1265]  INFO -- : Writing /var/app/appname/public/assets/application-bc071e28a78e2b63c9313afed5ad3476e00e3f0e5b12445c37214d1f1317be48.js.gz
I, [2020-01-18T12:51:08.484546 #1265]  INFO -- : Writing /var/app/appname/public/assets/application-8549fb9a804686e593d5c0f90a2412a39de85908e5fb58fdf6681d4b0073d891.css
I, [2020-01-18T12:51:08.485454 #1265]  INFO -- : Writing /var/app/appname/public/assets/application-8549fb9a804686e593d5c0f90a2412a39de85908e5fb58fdf6681d4b0073d891.css.gz
```

#### エラーが出る場合

```
ActiveRecord::AdapterNotSpecified: 'production' database is not configured. Available: ["default", "development", "test", "database", "username", "password", "socket"]
```

下記を修正してください

```ruby:config/database.yml
production:
  <<: *default　# ここが抜けているはず
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
```
追記したら

```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>] git pull origin master
```
再度

```:ターミナル（EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>]$ rails assets:precompile RAILS_ENV=production
```

今度は成功するはずです

```:成功した場合
Yarn executable was not detected in the system.
Download Yarn at https://yarnpkg.com/en/docs/install
I, [2020-01-18T12:51:01.4345644 #1265]  INFO -- : Writing /var/app/web-share/public/assets/member_photo_noimage_thumb-224a733c50d48aba6d9fdaded809788bbeb5ea5f6d6b8368adaebb95e58bcf53.png
I, [2020-01-18T12:51:02.2615123#1265]  INFO -- : Writing /var/app/appname/public/assets/application-bc071e28a78e2b63c9313afed5ad3476e00e3f0e5b12445c37214d1f1317be48.js
I, [2020-01-18T12:51:02.2626434 #1265]  INFO -- : Writing /var/app/appname/public/assets/application-bc071e28a78e2b63c9313afed5ad3476e00e3f0e5b12445c37214d1f1317be48.js.gz
I, [2020-01-18T12:51:08.484546 #1265]  INFO -- : Writing /var/app/appname/public/assets/application-8549fb9a804686e593d5c0f90a2412a39de85908e5fb58fdf6681d4b0073d891.css
I, [2020-01-18T12:51:08.485454 #1265]  INFO -- : Writing /var/app/appname/public/assets/application-8549fb9a804686e593d5c0f90a2412a39de85908e5fb58fdf6681d4b0073d891.css.gz
```

### Railsの再起動
コンパイルが成功したら反映を確認するため、Railsを再起動します。しかし、まずは今動いているUnicornをストップします。


EC2のターミナルから以下のように入力します。「aux」と打っているのは、psコマンドのオプションです。表示結果を見やすくしてくれます。また、| grep unicornとしているのはpsコマンドの結果からunicorn関連のプロセスのみを抽出するためです。

```
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn

ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn
```


大事なのは左から2番目の列です。ここに表示されるのがプロセスのid、つまりPIDになります。
「unicorn_rails master」と表示されているプロセスがUnicornのプロセス本体です。この時のPIDは、17877となっています。

```
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill <確認したunicorn rails masterのPID>
```
killコマンド：現在動いているプロセスを停止させるためのコマンドです

再度、プロセスを表示させ終了できていることを確認しましょう。

```
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn
...
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn
```
３つあった項目が一つになっています

では、Railsを起動させましょう！

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

もう一度、ブラウザで http://＜Elastic IP＞:3000/ にアクセスしてみましょう。今度はレイアウト崩れも無くサイトが正常に表示されていることでしょう。


#### 参考
[【Rails5.2】credentials.yml.encとmaster.keyでのデプロイによる今までとの変更点](https://qiita.com/katsu105/items/88675da5119762d73d92)
[【備忘録】credentials.yml.encにdatabase設定を保存する](https://qiita.com/NaokiIshimura/items/e5db6ca7d56f2cb1f1fb)


# 次回
[独学ではじめてAWS(EC2)にデプロイする方法⑩（macでNginxのインストールと設定）](https://qiita.com/mylevel/items/2db244dc5aa042dd983c)