EC2にRailsアプリをデプロイ⑤ ~本番環境の設定~

##はじめに
前回の続きです。
EC2内でgemをインストールしたり、環境変数を設定したりしていきます。

##Swapファイルでメモリの増強
現状で動かしているEC2インスタンスでは、無料クオリティなので、pcの能力が足りずにGemをインストールするときにメモリが足りずにエラーが発生する可能性があります。

そのためにSwapファイルというメモリの増強をする処理を行います。

まずはEC2にログインしている状態でホームディレクトリに移動します。

```terminal:ターミナル
# ホームディレクトリに移動
[ec2-user@ip-172-31-25-189 ~]$ cd
```

移動できたら下記のコマンドを実行します。

```terminal:ターミナル
# 処理に時間がかかる可能性があるコマンドです

[ec2-user@ip-172-31-25-189 ~]$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512

# しばらく待って、以下のように表示されれば成功です
512+0 レコード入力
512+0 レコード出力
536870912 バイト (537 MB) コピーされました、 7.35077 秒、 73.0 MB/秒
```

さらに続けて下記のコマンドを入力していきます。

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo chmod 600 /swapfile1
```

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo mkswap /swapfile1

# 以下のように表示されれば成功
スワップ空間バージョン1を設定します、サイズ = 524284 KiB
ラベルはありません, UUID=74a961ba-7a33-4c18-b1cd-9779bcda8ab1
```

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo swapon /swapfile1
```

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'
```

##必要なgemをインストール
下記のコマンドで必要なGemをインストールします。

```terminal:ターミナル
# クローンしたディレクトリに移動
[ec2-user@ip-172-31-23-189 www]$ cd  /var/www/開発中のアプリケーション

# rubyのバージョンを確認
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
```

続いて本番環境でbundlerをインストールします。

ローカル環境でのbundlerを確認して、本番環境でも同じバージョンを導入するようにします。

下記はローカル環境で実行して確認します。

```terminal:ターミナル(ローカル)
# 開発中のアプリケーションのディレクトリで実行

% bundler -v
Bundler version 2.1.4
```

上記の例ではbundler 2.1.4がインストールしています。
同じバージョンを導入します。

EC2内で下記のコマンドを実行します。

```terminal:ターミナル
# 「2.1.4」の箇所は、ローカルで確認したbundlerのバージョンを導入します
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ gem install bundler -v 2.1.4

# 以下のコマンドは、処理に数分以上かかる場合があります
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ bundle install
```

##環境変数を設定する
Railsアプリを動作させるために、secret_key_baseというCookieの暗号化に用いられる文字列を用意します。この値は漏らしてはいけないので、環境変数に設定します。

まずは下記のコマンドでsecret_key_baseを作成します。
実行した後に表示される英数の羅列はメモアプリなどに控えておきます。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rake secret
69619d9a75b78f2e1c87ec5e07541b42f23efeb6a54e97da3723de06fe74af29d5718adff77d2b04b2805d3a1e143fa61baacfbf4ca2c6fcc608cff8d5a28e8d
```

続いてEC2の中に環境変数を設定します。

下記のコマンドを実行します。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 ~]$ sudo vim /etc/environment
```

「~」がたくさん出てきたら「iキー」を押して入力可能にします。
そして、下記を入力します。値は指示通りの値を入力します。
PAYJPやBasic認証は必要があればここに環境変数として設定しておきます。

```:/etc/environment
#前章で設定したデータベースのrootユーザーのパスワードを入力
DATABASE_PASSWORD='データベースのrootユーザーのパスワード'
SECRET_KEY_BASE='さきほど作成したsecret_key_base'

# AWSでIAMユーザーを作成した際にダウンロードしたCSVファイルを参考に値を入力
AWS_ACCESS_KEY_ID='ここにCSVファイルのAccess key IDの値をコピー'
AWS_SECRET_ACCESS_KEY='ここにCSVファイルのSecret access keyの値をコピー'

# Basic認証で設定したユーザー名とパスワードを入力
BASIC_AUTH_USER='設定したユーザー名'
BASIC_AUTH_PASSWORD='設定したパスワード'

# PAY.JPで設定した公開鍵と秘密鍵を入力
PAYJP_SECRET_KEY='sk_test_*************'

```


入力が終わったら、「escキー」→「:wq」の順で実行し、保存します。

一度EC2からログアウトし環境変数を反映させましょう。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 ~]$ exit
logout
Connection to 52.xx.xx.xx closed.
```

exitを実行すればログアウト完了です。
下記のコマンドで再度ログインします。

```terminal:ターミナル
$ ssh -i [ダウンロードした鍵の名前].pem ec2-user@[作成したEC2インスタンスと紐付けたElastic IP]
```

それぞれの環境変数の確認は下記のコマンドでしっかり設定されているか確認できます。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 ~]$ env | grep SECRET_KEY_BASE
SECRET_KEY_BASE='secret_key_base'

[ec2-user@ip-172-31-23-189 ~]$ env | grep DATABASE_PASSWORD
DATABASE_PASSWORD='データベースのrootユーザーのパスワード'

[ec2-user@ip-172-31-23-189 ~]$ env | grep AWS_SECRET_ACCESS_KEY
AWS_SECRET_ACCESS_KEY='Secret access key'

[ec2-user@ip-172-31-23-189 ~]$ env | grep AWS_ACCESS_KEY_ID
AWS_ACCESS_KEY_ID='Access key ID'

[ec2-user@ip-172-31-23-189 ~]$ env | grep BASIC_AUTH_USER
BASIC_AUTH_USER='設定したユーザー名'

[ec2-user@ip-172-31-23-189 ~]$ env | grep BASIC_AUTH_PASSWORD
BASIC_AUTH_PASSWORD='設定したパスワード'

[ec2-user@ip-172-31-23-189 ~]$ env | grep PAYJP_SECRET_KEY
PAYJP_SECRET_KEY='sk_test_*************'

[ec2-user@ip-172-31-23-189 ~]$ env | grep PAYJP_PUBLIC_KEY
PAYJP_PUBLIC_KEY='pk_test_*************'
```

##ポートの開放

①で行ったのと同じようにポートの開放を行います。今回はRailsサーバを3000番ポートで起動するように解放します。

AWSのページからこのEC2インスタンスを選択しセキュリティのタブを開きます。
そして「インバウンドルールを編集」をクリックします。

ページが遷移したら「ルールを追加」をクリックし、設定します。
タイプ：　「カスタム TCP」
ポート範囲：　「3000」
カスタム：　「0.0.0.0/0」
というように設定します。↓の画像のように追加できればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/1256a6f8-a7a7-5ded-0449-7b575bed037c.png)

できたらオレンジ色の「ルールを保存」をクリックしてポートの開放完了です。

##本番環境でRailsを起動させる
まず、アプリのdatabase.ymlファイルを編集します。
config/database.ymlファイルの「production:」の下を下記のように編集します。

```yml:config/database.yml
production:
  <<: *default
  database:（※こちらは編集しないでください）
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```

編集できたらリモートリポジトリにコミット、プッシュしておきます。
下記のコマンドでEC2にも反映させます。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>] git pull origin master
```

続いてEC2内にデータベースを作成します。
作成とマイグレートは下記のコマンドを実行します。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'
[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'」というエラーが起こったら、mariadbが起動していない可能性があるので```「sudo systemctl start mariadb」```というコマンドをターミナルに打ち込みmysqlの起動を試してみます。


ここまで完了できたらRailsを起動させてみます。↓

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

##アセットファイルをコンパイル
アセットファイルは画像やCSS, JSなどを管理しているファイルで、それらを圧縮してデータを転送する処理（コンパイル）を行います。

これをしないとビューが崩れる原因になります。

下記のコマンドでアセットファイルをコンパイルします。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails assets:precompile RAILS_ENV=production
```

##本番環境でRailsを再起動

次はRailsを再起動します。

普段、ローカルでは、ターミナルで「Ctrl」 + 「c」でサーバを止めて、「rails s」を実行している作業を、本番環境ではどのように行うのか、ということです。

まずは、下記のコマンドで、Unicornのプロセスを確認。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn
```

すると下記のように表示されます。

```terminal:ターミナル
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
```

左から二番目の五桁の数字がプロセスのid(PID)です。
一番上の「unicorn_rails master」と書かれている行のPIDがUnicornのプロセス本体のidkです。


killコマンドを使って停止させます。↓

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill <確認したunicorn rails masterのプロセスid>
```

もう一度プロセスを表示させ終了できているか確認します。

```terminal:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn
...
ec2-user 17918  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn
```

このように一つだけ残っていればOKです。

最後に「RAILS_SERVE_STATIC_FILES=1」コマンドを実行し、Railsがコンパイルされたアセットを見つけられるように指定します。

```terminal:ターミナル
[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/　にアクセスして、サイトが正常に表示されているか確認します。


ここまでできたら後一息
次回、webサーバーの設定をして完了です。