AWS Ruby on Rails プログラミング

RailsをEC2にデプロイする方法 その4

RailsをEC2にデプロイする方法の解説の続きです。
前回は下の記事でRDSインスタンスの設定まで行いました。

RailsをEC2にデプロイする方法 その3

RailsをEC2にデプロイする方法の解説の続きです。 前回は下の記事でEC2インスタンスの設定まで行いました。 今回はDBを運用するサービスであるRDSを設定する手順について解説します。 全体の手順 ...

続きを見る

ここまでの記事で土台であるEC2とRDSの設定が完了しました。

今回は実際にRailsをデプロイして、NginxとUnicornを連携してアクセスできるところまで解説します。

全体の手順

  1. EC2インスタンスに操作用ユーザー追加
  2. EC2環境構築
  3. git連携
  4. Unicorn設定
  5. Nginx設定
  6. MySQL設定
  7. scaffold作成

EC2インスタンスに操作用ユーザー追加

EC2インスタンスにNginxや必要なツールを入れて行きます。
EC2インスタンスデフォルトユーザー(ec2-user)ではなく、操作する専用ユーザーを追加して操作します。

 

 command
// EC2に接続
ssh -i [pemファイルパス] ec2-user@[publicIPアドレス]
 
// ユーザー追加
sudo adduser test-user
sudo passwd test-user
// ユーザーtest-user のパスワードを変更。
新しいパスワード:
passwd:
すべての認証トークンが正しく更新できました
 
// sudoコマンド設定ファイル開く
sudo visudo
 
// ユーザーにマスター権限を与えるために、下のように書き込む(test-user行追加)
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
test-user ALL=(ALL) ALL
 
// ユーザー切り替えできることを確認
sudo su - test-user
 
// ローカルに戻る
cd ~/.ssh
 
// 公開鍵作成
ssh-keygen -t rsa
 
// 公開鍵を作るときに下のように名前をつけるか聞かれるので、名前をつける(他は全部Enter)
Enter file in which to save the key ():aws_key_rsa
 
// configファイルに接続先の情報等を入力
vi config
===========================
Host aws_key_rsa
HostName [publicIP]
Port 22
User test-user
IdentityFile ~/.ssh/aws_key_rsa
===========================
 
// 公開鍵の中身コピー
pbcopy < aws_key_rsa.pb
 
// ec2インスタンスにアクセス
// ユーザー切り替え
sudo su - test-user
// 公開鍵ファイル作成&アクセス権限許可
cd ~
mkdir .ssh
chmod 700 .ssh
cd ~/.ssh
vim authorized_keys
chmod 600 authorized_keys
 
// authorized_keysに上でコピーした公開鍵を貼り付け
vim authorized_keys
 
// ローカルに戻ってssh接続できることを確認
ssh aws_key_rsa

 

これで新しく追加したtest-userでEC2にアクセスして操作できるようになりました。

 

EC2環境構築

EC2をwebサーバとして使うのに必要なライブラリ等をインストールしていきます。

 

 command
// yumでライブラリをインストール
sudo yum install git make gcc-c++ patch openssl-devel libyaml-devel libffi-devel libicu-devel libxml2 libxslt libxml2-devel libxslt-devel zlib-devel readline-devel mysql mysql-server mysql-devel ImageMagick ImageMagick-devel epel-release
===============================================================================
// インストールするファイル一覧
git make gcc-c++ patch // #cとc++のコンパイラ、gitの差分をpatchファイルに変更
openssl-devel
libyaml-devel libffi-devel libicu-devel
libxml2 libxslt libxml2-devel libxslt-devel
zlib-devel readline-devel
mysql mysql-server mysql-devel
ImageMagick ImageMagick-devel
epel-release
===============================================================================
 
// epelリポジトリをインストール
sudo amazon-linux-extras install epel
 
// Nodejsインストール
sudo yum install nodejs npm --enablerepo=epel
 
// rbenvインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
 
// パス通す
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
 
// .bash_profileの読み込み
source .bash_profile
 
// ruby-buildのインストール
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
 
// rehash
rbenv rehash
 
// インストールできるrubyのバージョン確認
rbenv install --list
 
// rubyインストール
rbenv install 2.7.1

 

必要な基本的なものはインストールすることができました。

 

git連携

Githubで管理しているRailsアプリをデプロイするために、
Githubとの連携をできるようにします。

 command
// .gitconfig設定
cd ~/
vim .gitconfig
======================================
[user]
name = [githubのユーザーネーム]
email = [githubの登録メールアドレス]
[alias]
br = branch
ch = checkout
st = status [color] (#色付け)
ui = true
# githubの場合
[url "github:"]
InsteadOf = https://github.com/
InsteadOf = git@github.com:
======================================
 
// railsアプリを配置するディレクトリ作成
cd /
sudo chown test-user var
sudo mkdir www
sudo chown test-user www
cd www
sudo mkdir rails
sudo chown test-user rails
 
// リモートリポジトリからRailsプロジェクトをclone
cd rails
git clone [railsアプリのリモートリポジトリ]
※この記事でのリモートリポジトリでcloneしたrailsのプロジェクト名は「rails_prj」となります。
 
// Gemインストール
cd rails_prj
bundle install
 
// シークレットキー作成
rake secret
 
// 上で生成したシークレットキーを設定
vim config/secret.yml
============================================================================
production:
secret_key_base: [上で作成したシークレットキー]
============================================================================

 

これでRailsアプリをデプロイすることができました。
ただ、これだけではまだ動きません。
動かすためにはUnicornとNginxの設定が必要になります。

Unicorn設定

Railsを動かすためにはアプリサーバとして設定が必要になります。
今回はUnicornを使います。

 command
cd /var/www/rails/rails_prj
vim Gemfile
===============================
// 下を記述
gem 'mysql2'
group :production, :staging do
gem 'unicorn'
end
===============================
// Unicornとmysql2をインストール
bundle install
 
// Unicornの設定
vim config/unicorn.conf.rb
===============================
// 下を記述
# set lets
$worker = 2
$timeout = 30
$app_dir = "/var/www/rails/rails_prj" #自分のアプリケーション名
$listen = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir
$pid = File.expand_path 'tmp/pids/unicorn.pid', $app_dir
$std_log = File.expand_path 'log/unicorn.log', $app_dir
# set config
worker_processes $worker
working_directory $app_dir
stderr_path $std_log
stdout_path $std_log
timeout $timeout
listen $listen
pid $pid
# loading booster
preload_app true
# before starting processes
before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
old_pid = "#{server.config[:pid]}.oldbin"
if old_pid != server.pid
begin
Process.kill "QUIT", File.read(old_pid).to_i
rescue Errno::ENOENT, Errno::ESRCH
end
end
end
# after finishing processes
after_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
===============================

 

これでUnicornを起動する準備ができました。

Nginxの設定

Webサーバとして必要なNginxの設定をします。

 command
// nginxインストール
sudo yum install nginx
 
// nginxの設定ファイル作成
cd /etc/nginx/conf.d/
sudo vim rails_prj.conf
============================================================================================
// 以下を記述
# log directory
error_log /var/www/rails/rails_prj/log/nginx.error.log;
access_log /var/www/rails/rails_prj/log/nginx.access.log;
# max body size
client_max_body_size 2G;
upstream app_server {
# for UNIX domain socket setups
server unix:/var/www/rails/rails_prj/tmp/sockets/.unicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name [publicIPアドレス];
# nginx so increasing this is generally safe...
keepalive_timeout 5;
# path for static files
root /var/www/rails/rails_prj/public;
# page cache loading
try_files $uri/index.html $uri.html $uri @app;
location @app {
# HTTP headers
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
# Rails error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/rails/rails_prj/public;
}
}
============================================================================================
// postメソッドでもエラーが出ないようにする
cd /var/lib
sudo chmod -R 775 nginx

 

MySQLの設定

RailsアプリからDBに接続するためにRails側の設定を行います。

 command
// database.ymlにDB接続情報を記載
cd /var/www/rails/rails_prj
vim config/database.yml
==========================================
// 以下を記述
production:
adapter: mysql2
database: rails_prj_production
username: root
password: password
host: [RDSエンドポイント]
socket: /var/lib/mysql/mysql.sock
==========================================
// mariadbが入っていると以降の操作でエラーが起きるため、mariadbを削除します
// mariadbが入っているか確認
yum list installed | grep mariadb
 
// MariaDBを削除
sudo yum remove mariadb-libs
 
// mysqlも一応削除
sudo yum remove mysql*
yum list installed | grep mariadb
 
// mysqlインストール
sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum-config-manager --disable mysql57-community
sudo yum-config-manager --enable mysql80-community
sudo yum install -y mysql
mysql --version
sudo yum -y install mysql-server
sudo yum install mysql-devel
 
// mysqldを起動
sudo service mysqld start
 
// シンボリックリンク作成
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
 
// DB作成
rake db:create RAILS_ENV=production
 
// Nginx起動
sudo service nginx start
 
// unicorn起動
unicorn_rails -c /var/www/rails/rails_prj/config/unicorn.conf.rb -D -E production

 

これでNginxとUnicornが連携できDBも接続することができました。

 

scaffold作成

最後にRailsのscaffoldを作成して、正しくRailsアプリが使用できるようになったかを確認します。

 command
// Node.jsのバージョン管理ツールnvmをclone
git clone git://github.com/creationix/nvm.git ~/.nvm
 
// パスを通す
echo . ~/.nvm/nvm.sh >> ~/.bashrc
 
// 安定版をインストール
nvm install 14.17.0
 
// 最新版にアップデートされたか確認
node -v
 
// node-sassがnodeに対応するバージョンにレビルドされる
rm -rf node_modules/
rm -rf yarn.lock
yarn install
yarn upgrade
rails webpacker:install
 
// scaffold作成
rails generate scaffold user name:string age:integer 

 

これでRailsアプリ上にscaffoldが作成されました。
それでは実際にアクセスして正しく動かくか確認します。

  1. 設定したpublicIPアドレスをブラウザのURLに入力
    ※Railsのエラーが表示されますが、トップページのルーティングに何も設定されていないだけですので問題ありません。
  2. publicIPアドレスのあとに「/users」を入力
  3. scaffoldの画面が表示
  4. New Userをクリック
  5. NameとAgeを入力して、Create Userをクリック
    「User was successfully created.」と表示される
  6. 「/users」のページに作成したユーザーが表示されている

6までできていたら正しく動いています。

 

AWSの基本サービスとしてEC2やRDSを使ってRailsアプリをデプロイする方法について解説しました。

これがマスターできれば、
他のデプロイ方法も簡単に応用できると思います。

 

前の記事

-AWS, Ruby on Rails, プログラミング

© 2021 TatsuoBlog Powered by AFFINGER5