⚡️令和最新版⚡️ EC2 インスタンスに Ruby on Rails の環境をセットアップする。

2021/06/16に公開

● EC2 インスタンスに SSH で接続する。

  1. 初回 ログイン時のみ $ chmod 600 ~/.ssh/'キーペアのファイル名'.pem を実行して、キーペア(秘密鍵)の権限を変更しておく。
  1. 以下のコマンドを実行し、接続する。
    $ ssh -i ~/.ssh/'秘密鍵のファイル名'.pem ec2-user@'IPアドレス'

● EC2 インスタンスに Ruby をインストールする。

  1. $ sudo yum -y update を実行して、既存のパッケージをアップデートする。
  2. Node.js のパッケージをダウンロードする。
    Enterprise Linux based distributions | GitHub から、ご希望のバージョンの Node.js をダウンロードしてください。
  1. $ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo を実行して、Yarn のパッケージをダウンロードする。

  2. $ sudo yum -y install git gcc clang openssl-devel zlib-devel mysql-devel nodejs yarn を実行して、必要なパッケージをインストールする。

  1. rbenv installer | GitHub を使用して、rbenv と ruby-build をインストールする。
  1. 以下のコマンドを実行して、rbenv のパスを通し、初期設定をする。
  1. $ rbenv --version を実行して、 rbenv のバージョンが表示されたら、OK です。
  2. $ rbenv install 'バージョン番号' を実行して、Ruby をインストールする。
  1. インストールが完了したら、 $ rbenv global 'バージョン番号' を実行する。
  2. $ rbenv rehash を実行する。
  3. $ ruby --version を実行して、 Ruby のバージョンが表示されたら完了です。

● MySQL のコマンドだけ、インストールする。

  1. MySQL Community Downloads からパッケージをダウンロードします。
    Amazon Linux 2 インスタンスは、Red Hat Enterprise Linux 7 / Oracle Linux 7 です。
  1. $ mysql コマンドは、MySQL Community Client に含まれているため、$ sudo yum install -y mysql-community-client.x86_64 を実行します。
● 参考資料

https://qiita.com/ponsuke0531/items/3ae69a9d477809c00917


● Nginx をインストールする。

  1. $ which amazon-linux-extras を実行して、Extras Library がインストールされているか確認します。
  2. $ sudo amazon-linux-extras enable nginx1 を実行して、Nginx のトピックを有効化します。
  3. 以下のコマンドを実行して、Nginx をインストールします。
  • $ yum clean metadata
  • $ sudo yum install -y nginx
● 参考資料

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-install-extras-library-software


● EC2 インスタンスから GitHub に接続する。

  1. $ ssh-keygen -t rsa -b 4096 を実行して、GitHub に接続するための鍵を新規作成する。
    途中 聞かれる質問はすべて空欄のままで実行して大丈夫です。

  2. $ cat ~/.ssh/id_rsa.pub を実行して、鍵の中身を表示する。

  3. GitHub から、「Settings」>「SSH and GPG keys」>「New SSH key」と遷移し、Key 欄に先ほど確認した鍵を入力する。

  4. $ ssh -T git@github.com を実行して、GitHub に接続できるか確認する。
    Hi 'ユーザー名'! You've successfully authenticated, but GitHub does not provide shell access. となれば成功です。


● アプリケーションサーバー(Unicorn)をインストールする。

  1. Gemfile に以下の内容を記述して、$ bundle install します。
Gemfile
group :production do
  gem 'unicorn', '~> 6.0'
    # https://rubygems.org/gems/unicorn | RubyGems
    # 低遅延・高帯域の接続で高速なクライアントにサービスを提供できる UNIX ライクな HTTP サーバ
end
  1. config ディレクトリ配下に unicorn.rb を新規作成して、以下の内容を記述する。
/config/unicorn.rb
app_path = File.expand_path('../../', __FILE__)

#アプリケーションサーバの性能を決定する
worker_processes 1

#アプリケーションの設置されているディレクトリを指定
working_directory app_path

#Unicornの起動に必要なファイルの設置場所を指定
pid "#{app_path}/tmp/pids/unicorn.pid"

#ポート番号を指定
listen 3000

#エラーのログを記録するファイルを指定
stderr_path "#{app_path}/log/unicorn.stderr.log"

#通常のログを記録するファイルを指定
stdout_path "#{app_path}/log/unicorn.stdout.log"

#Railsアプリケーションの応答を待つ上限時間を設定
timeout 60

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false # prevent from firing again
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exist?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH => e
      logger.error e
    end
  end
end

after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end
  1. EC2 インスタンス内にて、アプリケーションディレクトリを新規作成し、GitHub リポジトリからアプリケーションをクローンする。
Bash
$ sudo mkdir /var/www
  # アプリケーションディレクトリを新規作成する。

$ sudo chown ec2-user /var/www
  # アプリケーションディレクトリの権限を変更する。

$ cd /var/www
$ git clone 'リポジトリ URL'

● アプリケーションの Ruby Gems をインストールする。

  1. 事前に EC2 インスタンスの Swap 領域を設定しておく。
Bash
$ cd ~
  # ホームディレクトリに移動しておく。

$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
$ sudo chmod 600 /swapfile1
$ sudo mkswap /swapfile1
$ sudo swapon /swapfile1
$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'
  1. EC2 インスタンス内のアプリケーションディレクトリに移動して、Ruby のバージョンが開発環境のものと同じかどうかを確認しておいてください。
Bash
$ cd  /var/www/'アプリケーション名'
$ ruby --version
  1. Bundler をインストールする。
Bash
$ gem install bundler -v 'バージョン番号'

$ bundle install
  # Bundler がインストールできたら、Ruby Gems(Gemfile)を導入する。

● ここまでできたらもう一息 💪 。アプリケーションの設定をおこなう。

  1. $ rake secret を実行して、secret_key_base を取得し、環境変数を設定する。
  2. 環境変数 または Credentials.yml を設定してください。
● 参考資料

https://qiita.com/gyu_outputs/items/92c4a2a2f96edb10e298

ここまでできたらもう完成したようなものです。
あとは、データベース・テーブルの作成,アセットコンパイル、Unicorn の再起動をしたら表示できるはず!


● データベースとのやりとりをおこなう場合は…

  • 本番環境で、$ rails db: コマンドを実行する際は、RAILS_ENV=production を追記して、本番環境用のデータベース設定が適用されるように実行する。

● アプリケーションサーバ(Unicorn)の再起動

サイトを更新する際 等、$ git pull origin master でコードを更新した際は Unicorn を再起動して反映する必要があります。
その際のコマンドです。

Bash
$ rails assets:precompile RAILS_ENV=production
  # スタイルシートや JavaScript 等を更新したときにアセットコンパイルする。

$ ps aux | grep unicorn
  # Unicorn が使用しているプロセスを確認する。
$ kill "'unicorn_rails master' のプロセスID"
  # 'unicorn_rails master' が使用しているプロセスを終了する。
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
  # Unicorn を起動する。

● Special Thanks(参考資料)

https://qiita.com/gyu_outputs/items/b123ef229842d857ff39

Discussion