0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby on Railsで作ったアプリをAWS EC2で公開する

Posted at

#はじめに
まずこちらの記事で、AWSのCloud9にてRuby on Railsを使ったWEBアプリのデモ開発を行った。
Ruby on Railsでのアプリ開発(初心者)
※内容は備忘録代わりなので、煩雑です。
これらのアプリは全てgithubにpushしてあります。

今回はアプリをAWSのEC2で公開する手順について備忘録として残す。
参考にしたのは下記サイトとなる。
こちらはAmazon Linux AMIで実施しているので、今回の手順と一部異なります。
Ruby on Rails】AWS を利用したデプロイ(AWS & Nginx & Unicorn & Rails)How to deploy a Rails App to EC2(2020年版)
AWS & Nginx & Unicorn & Ruby on Rails

今回、VPCの設定やEC2の起動は省略する。
<EC2の環境>

  • AMI:Amazon Linux 2 AMI
  • インスタンスタイプ:2.micro
  • パブリックIP:EIPで固定

ruby on railsに関わるバージョンは以下とする。
開発環境ではrvmで実施したが、EC2に対して導入がうまくいかなかったので、rbenvとした。

<各バージョン>

  • rubyのバージョン切替ソフトウェア:rbenv
  • ruby:2.5.1 ※バージョンはシビア
  • gem:3.0.8
  • rails:5.2.1 ※バージョンはシビア
  • プロジェクトはqandaとした

#EC2へのSSHログイン
ダウンロードしたキーペアの権限変更をした後に、ログインが必要。
ここでキーペアはRails-web.pemとする。

mv Downloads/Rails-web.pem .ssh/
ssh -i .ssh/ec_site.pem ec2-user@xxx.xxx.xxx.xxx

ちなみに「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」といったエラーが出た場合はSSHコマンドにオプションをつけて実行する。

ssh -i .ssh/ec_site.pem ec2-user@xxx.xxx.xxx.xxx -o 'StrictHostKeyChecking no'

#EC2インスタンスの環境構築
##必要パッケージをインストール

sudo yum update
sudo yum -y 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 sqlite sqlite-devel

##rbenvのインストール

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ sudo ~/.rbenv/plugins/ruby-build/install.sh
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

##rubyのインストール(バージョンは2.5.1)
installには時間がかかります。

$ rbenv install 2.5.1
$ rbenv global 2.5.1
$ rbenv rehash

##node.jsのインストール

$ curl --silent --location https://rpm.nodesource.com/setup_12.x | sudo bash -
$ sudo yum install -y nodejs

##railsのインストール(バージョンは5.2.1)

gem install rails -v 5.2.1

##bundlerをインストール
cloud9のbundlerバージョンを確認したが、cloud9に導入されていなかったため、
とりあえずインストールをしておいた。
※必要はなかったかもしれない。

cloud9上でのコマンド
$ gem install bundler
$ bundler -v

cloud9にBundler version 1.17.3がインストールされたのでバージョンを併せてEC2にインストールする。

EC2上でのコマンド
gem install bundler -v 1.17.3

##gitとの連携、アプリのクローン
###鍵を作る
パスワードを求められるが、空白で全てEnter

$ cd ~/.ssh
$ ssh-keygen -t rsa
$ cat id_rsa.pub

最後のcatで表示されたキーを自分のgithubのsshKEY登録した後に、
こちらのコマンドでgitとの連携を確認する。

sh -T git@github.com

###クローン
アプリのためのディレクトリを作成する。

$ cd /
$ sudo chown ec2-user var
$ cd var
$ sudo mkdir www
$ sudo chown ec2-user www
$ cd www
$ sudo mkdir rails

クローンを進める。

$ cd rails
$ git clone git@github.com:<自分のリポジトリ> (SSHクローンのアドレス)
$ cd qanda
$ bundle

もし、bundle実行時に次のようなエラーが出た場合、
msgpackをアップデートしてあげる。

Your bundle is locked to msgpack (1.4.1)

bundle update msgpack

その後に、再度bundle実行する。

##マスターキーの登録
cloud9上でmaster.keyを確認してコピーする。
configフォルダに格納されている。

EC2上で、上記でコピーした値をmaster.keyに登録する。

vi config/master.key

credentials.ymlの設定をする。

EDITOR=vim bin/rails credentials:edit

以下の値を追加する。
パスワードはrootの条件を満たす必要がある。
「大文字、小文字、特殊文字(アスタリスク等)を含む」

db:
  database: qanda
  username: root
  password: xxxxxxxx
  socket: /var/lib/mysql/mysql.sock

##MySQLの設定
linux2だと既にインストール済みのmariadbが邪魔をして、うまくMySQLを起動できなかった。
そのため、こちらをまずは実行してから起動をかけるとうまくいった。

MySQLのリポジトリをインストール
sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm
sudo yum install -y mysql-community-server
起動
sudo service mysqld start
ステータス
sudo service mysqld status

##MySQLのパスワード設定
パスワードも勝手に初期設定されていたため、
下記でパスワードを確認して、パスワード再設定を行った。

パスワードの確認
$ sudo su -
$ cat /var/log/mysqld.log | grep password

こちらが表示され、語尾が初期rootパスワードになる。

[Server] A temporary password is generated for root@localhost: xxxxxx

その後、こちらのパスワードを使って、mysqlにログインする。
下記のコマンドを入力後に、先ほどのパスワードを入力する。

mysqlのログイン
mysql -u root -p

次に、設定したいパスワードを入力する。(credentials.ymlの値に合わせる)
ちなみにパスワード設定時に下記のエラーが出るとパスワード条件を満たしていない

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

mysql> ALTER USER 'root'@'localhost' identified BY 'xxxxx';

##database.ymlの編集

vi config/database.yml

下記のようにproductionを書き換える

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] %>

##nginxの設定
AMI linux2の環境に合わせたインストール方法となっている。

$ sudo amazon-linux-extras install nginx1 -y
$ sudo vi /etc/nginx/conf.d/qanda.conf

こちらのコードを記入して保存する。

error_log  /var/www/rails/qanda/log/nginx.error.log;
access_log /var/www/rails/qanda/log/nginx.access.log;

upstream unicorn_server {
    server unix:/var/www/rails/qanda/tmp/sockets/.unicorn.sock fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name 52.23.9.110;

    keepalive_timeout 5;

    # Location of our static files
    root /var/www/rails/qanda/public;

    location ~ ^/assets/ {
        root /var/www/rails/qanda/public;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://unicorn_server;
            break;
        }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /var/www/rails/qanda/public;
    }
}

###権限の変更

$ cd /etc
$ sudo chown -R ec2-user nginx
$ ls -la | grep nginx

##Unicornの設定
Gemfileに以下を記述。
※開発環境(Cloud9)で入れておいてよいかもしれない

group :production, :staging do
  gem 'unicorn'
end

インストール実行する。

bundle install

設定を変更する。unicorn.conf.rbを開いて、コードを追記する。

vi config/unicorn.conf.rb
$worker  = 2
$timeout = 30
$app_dir = "/var/www/rails/qanda"
$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

マイグレーションの実行

bundle exec rake db:migrate RAILS_ENV=production

##yarnのインストール
コンパイルの時にyarnが必要とエラーが出たので、インストールしておく。

$ sudo yum -y install wget
$ sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
$ sudo curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
$ sudo yum install yarn -y

##assetsコンパイル実行
production.rbを編集して、下記の箇所を変更する。

vi config/environments/production.rb
config.assets.js_compressor = Uglifier.new(harmony: true)

コンパイルを実施する。

bundle exec rake assets:precompile RAILS_ENV=production

#確認
AWSのコンソール上で、EC2の再起動する。

Nginxを起動する。

sudo service nginx start

Unicornの起動

$ cd /var/www/rails/qanda/
$ bundle exec unicorn_rails -c /var/www/rails/qanda/config/unicorn.conf.rb -D -E production

Unicornの起動の確認

ps -ef | grep unicorn | grep -v grep

EC2に設定されているパプリックIPかEIPでサイトアクセスすると、アプリの起動が確認できる。

#最後に
AMIをLinux2を使うことで、参考にした手順と異なる箇所がいくつかあり、
調べた手順を含めると、うまく進めることができた。
調べながら実施したので、再度再現して上手くいくかは確かめたい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?