AWS EC2インスタンスでrailsを動かす

EC2インスタンスgithubからコードをクローンする

1まずクローンするディレクトリと作る

#mkdirコマンドで新たにディレクトリを作成
[ec2-user@ip-172-31-23-189 ~]$ sudo mkdir /var/www/
#作成したwwwディレクトリの権限をec2-userに変更
[ec2-user@ip-172-31-23-189 ~]$ sudo chown ec2-user /var/www/

2次にgithubでclone or download押してリポジトリのurlをコピーしとく

 

3クローンする

ec2-user@ip-172-31-23-189 ~]$ cd /var/www/
[ec2-user@ip-172-31-23-189 www]$ git clone https://github.com/<ユーザー名>/<リポジトリ名>.git

 

 

EC2の能力拡張

無料枠で何もしないとパワー不足でエラーになる可能性がある。

容量を超えると普通エラーで処理が止まる。

swap領域があればメモリが足りなくなりそうな時に一時的にメモリの容量を増やせる。

デフォルトではswap領域は用意してないので以下の手順で用意する

#ホームディレクトリに移動
[ec2-user@ip-172-31-25-189 ~]$ cd
#処理に時間がかかる可能性があるコマンドです
[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/秒
[ec2-user@ip-172-31-25-189 ~]$ sudo chmod 600 /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo mkswap /swapfile1
# 以下のように表示されれば成功
スワップ空間バージョン1を設定します、サイズ = 524284 KiB
ラベルはありません, UUID=74a961ba-7a33-4c18-b1cd-9779bcda8ab1
[ec2-user@ip-172-31-25-189 ~]$ sudo swapon /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'

 

最初のコマンドはここ読む

https://www.atmarkit.co.jp/ait/articles/1711/30/news027.html

 

UUIDは重複する可能性がほぼないさくっと作れるID

 

最後のコマンドはこことか読む。まぁ正確にはまだよくわかってないが

https://qiita.com/ukinau/items/410f56b6d777ad1e4e90

 

 

bundlerのインストール

[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ gem install bundler -v 2.0.1
# ローカルで確認したbundlerのバージョンを導入する
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ bundle install
# 上記コマンドは、数分以上かかる場合もあります。

 

 

環境変数設定 

参考記事

https://techtechmedia.com/environment-variable-aws/

とりあえずconfig/のsecrets.ymlとdatabase.ymlでまとめとく。credentials.ymlはまた今度まとめる

データベースのパスワードなどのgithubにアップできない物は環境変数を利用する

ざっくり環境変数

https://qiita.com/yuichir43705457/items/7cfcae6546876086b849

 RailsからはENV['環境変数名']という記述で利用できる。

・ポイントとしては環境変数と一口に言うが、一つのOSはいくつも環境変数を持ってるもんであるってこと。DATABASE_PASSWORDやSECRET_KEY_BASEという名前の環境変数を自分で作って、値にデーターベースのパスワードやsecret_key_baseをいれるということ

secret_key_baseとはCookieの暗号化に用いられる文字列でralilsアプリケーションを動作させる際には必ず用意する必要があるもの。また外部に漏らしてはいけない値であるため、環境変数から参照する、ということ。

実際の設定方法

EC2サーバーのsecret_key_baseをまず作る

[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rake secret
69619d9a75b78f2e1c87ec5e07541b42f23efeb6a54e97da3723de06fe74af29d5718adff77d2b04b2805d3a1e143fa61baacfbf4ca2c6fcc608cff8d5a28e8d

EC2サーバーの環境変数を設定する。最初は何も書いてないはず。

[ec2-user@ip-172-31-23-189 ~]$ sudo vim /etc/environment

ファイルの保存場所は/etc/environmentだと覚えといた方がいい。それをvimエディタで開いて中にさっきの値を書く

/etc/environment

DATABASE_PASSWORD='MySQLのrootユーザーのパスワード'
SECRET_KEY_BASE='先程コピーしたsecret_key_base'

設定したら反映するために:wqで保存して一旦ログアウトする

[ec2-user@ip-172-31-23-189 ~]$ exit
logout
Connection to 52.xx.xx.xx closed.

 

exitするとローカル環境になるので再度SSH接続し直す

$ ssh -i [ダウンロードした鍵の名前].pem ec2-user@[作成したEC2インスタンスと紐付けたElastic IP]
(ダウンロードした鍵を用いて、ec2-userとしてログイン)

 

envコマンドとgrepコマンドを合わせてちゃんと設定されてるか確認

[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='MySQLのrootユーザーのパスワード'

 

ポートを開放する

セキュリティグループのリンクを踏み設定画面にとび、インバウンドタブの編集からルールの追加で開放する。今回は

タイプ「カスタムTCPルール」

プロトコルTCP

ポート範囲「3000」

送信元「カスタム」「0.0.0.0/0」

にする

デフォルトのSSHとこないだ開いたHTTPと違うのはタイプがカスタムTCPなことくらいか。タイプがカスタムTCPなことは覚えておいた方がいいだろう。

 

Railsを起動する

起動の前に、本番環境のmysqlの設定に合わせるために、ローカルのdatabase.ymlを編集する必要がある。

config/database.yml

production:
  <<: *default
  database: ~~~(それぞれのアプリケーション名によって異なっています。こちらは編集しないでください)
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

 

gitのmasterに上の変更を反映したらEC2サーバ側でpullする

[ec2-user@ip-172-31-23-189 <リポジトリ名>] git pull origin master
 DBを作成する
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'というエラーが起こった場合、mysqlが起動していない可能性があります。sudo service mysqld startというコマンドをターミナルから打ち込み、mysqlの起動を試してみましょう。

 

自分からしたらリモートやけど、当のEC2サーバーもmysqlにとっちゃlocalだから上みたいなエラー文なんやろうな。何かこういうエラー見たことある気がするけど、localって入ってたら間違えそうだから注意やな。

 

最後にrailsを起動させてみる

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

 

unicorn_rails で起動させてる

-c config/unicorn.rbで設定ファイルの指定

-E production は「本番モードとして動作させる」

-D はプログラムを起動させつつターミナルで別のコマンドを打てるようにするオプション

 

 

補足

当然起動させる時はアプリのあるリポジトリに移動して行う。今回で言えば

cd /var/www/[リポジトリ]で移動しておく

エラーがでたら

less log/unicorn.stderr.logなどでログを確認する

(エラーログをここに書き出す設定は前の部分でやってたと思う)

envコマンド

「env」は、環境変数の値を設定しつつ、同時に指定したコマンドを実行するコマンドです。https://www.atmarkit.co.jp/ait/articles/1801/18/news016.html