エンジニア志望のブログ

AWSにアプリをデプロイする

はじめに
AWSでサーバーを構築してアプリを動かすまでをまとめてみます。
AWSのEC2の作成などはご自身でお願いします。
また、この記事は初心者が備忘録として書いた記事なので参考にする際はお気をつけください。

Ruby : 2.7.3
Rails : 6.1.4
DB : MySQL
WEBサーバー : nginx
Applicationサーバー : puma

EC2インスタンスの作成は省略

この記事ではEC2インスタンス作成後の内容となっています。
EC2はAmazon Linux 2 AMI (HVM) イメージを使用。
EC2インスタンスの作成は他の記事を参照するようお願いします。

Railsアプリ

Railsアプリは作成しGitにプッシュしておいてください。

構築するサーバー

この記事で構築するサーバーは以下のようなイメージです。
 クライアント → nginx → rails(puma) → mysql
nginxはリバースプロキシとして動かします。

サーバーに環境を用意

まずEC2インスタンスSSHで接続してください。

パッケージのインストール

使用していくパッケージのインストールを行います。

$ sudo yum -y install git gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel libcurl-devel mysql mysql-devel

Nodeのインストール

$ curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
$ sudo yum -y install nodejs

yarnのインストール

$ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ sudo yum -y install yarn

MySQLのインストール

今回RDSを使わずにMySQLをインストールして使用していきます。
データベースはprivateなネットワークに作成してください。

#mariaDBの削除
$ sudo yum remove mariadb-libs

MySQLリポジトリの追加

$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

MySQL Serverのインストール

$ sudo yum install mysql-server
$ mysqld --version

MySQL Serverの起動

# サーバーの起動
$ sudo systemctl start mysqld.service
# サーバーの状態の確認
$ sudo systemctl status mysqld.service

サーバーを起動しようとしたらエラーが出た...以下の記事を参考に解決
Centos7でMysqlの起動にハマった話 | Tips of Rubbish


MySQLにログイン

#rootパスワードを確認
$ sudo cat /var/log/mysqld.log | grep password
#mysqlにログイン 確認したパスワードを入力  exitで終了
$ mysql -u root -p
#初期設定
$ sudo mysql_secure_installation
#新しいパスワードでmysqlにログインできるか確認
$ mysql -u root -p

データベースとユーザーの作成

#ログイン後
#ユーザーの作成
mysql > create user 'ユーザー名(test_user)'@'ホスト名(localhost)' identified by 'パスワード(メモしておく)';
#データベースの作成
mysql > create database データベース名(test_app);
#権限の付与
mysql > grant all on *.* to 'ユーザー名(test_user)'@'ホスト名(localhost)';
#権限の変更をデータベースに反映
mysql > flush privileges;
mysql > exit;

Railsアプリのdatabase.ymlのproductionグループのデータベース名とユーザー名を対応しておく

nginxのインストール

ngiinxのインストール

$ sudo amazon-linux-extras install -y nginx1

nginxの起動

$ sudo systemctl start nginx

状態確認

$ systemctl status nginx

nginxの設定ファイル

nginxの設定ファイルは /etc/nginx に置いてある

nginxの設定ファルは以下の順で読み込まれる

 /etc/nginx/nginx.conf
 /etc/nginx/conf.d/*.conf

Nginxとは?インストールや設定ファイルの仕組みを解説【CentOS】 | キツネの惑星

nginxの設定

nginxのインストールが終わったら
nginxとRuby on Railsが連携できるように/etc/nginc/conf.dフォルダ配下に設定ファイルを作成していきます。
今回はrails.confというファイルを作成してその中に設定を記述します。
vimで作業する場合は sudo vim /etc/nginx/conf.d/rails.conf

#リバースプロキシとして扱うための設定
#ここでバックエンドのサーバーを指定する
upstream puma{
        #tmp/sockets/puma.sockでpumaのsocketファイルを指定
        server unix:///var/www/アプリ名/tmp/sockets/puma.sock;
}

server {
        #接続を待ち受けたいポートを指定
        listen 80;
        listen [::]:80;
        server_name puma;

        #assetsファイルにアクセスされたときの設定
        location ~^ /assets/ {
                root /var/www/Test/public;
        }


        location / {
                proxy_read_timeout 300;
                proxy_connect_timeout 300;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-Proto $http_x_forwarded_protp;
                proxy_set_header X-Forwarded=for $proxy_add_x_forwarded_for;
                proxy_pass http://puma;
        }
}
pumaの設定

NginxとRailsを連携させるための設定をする。
Railsアプリ/config/puma.rb
puma.sockはNginxとソケット通信をする際に必要になるファイル

# port        ENV.fetch("PORT") { 3000 }
bind "unix://#{Rails.root}/tmp/sockets/puma.sock"

UNIXドメインソケット??
「UNIX ドメインソケット」と「ソケット」について比較する - Qiita

ユーザーの作成、アプリを動作させるディレクトリを作成

$ sudo adduser deploy
$ sudo mkdir -p /var/www
$ sudo chown deploy:deploy /var/www

Railsの環境構築

ここからのデプロイ作業はデプロイユーザーに切り替えて行います。
ルートユーザーからユーザーを切り替えるのは権限の関係で

Rbenvのインストール

# インストール
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# パスを通す
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
#プラグインのインストール
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
#.bash_profileの反映
$ source ~/.bash_profile
# セットアップ
$ ~/.rbenv/bin/rbenv init
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash

Rubyのインストール

$ rbenv install 2.7.3
$ rbenv global 2.7.3

Railsのインストール

$ gem install rails -v 6.1.4

アプリのダウンロード

GitHubからクローン

$ cd /var/www
$ git clone ご自身のアプリ

※database.ymlのproductionのdatabaseとusernameはMySQLで設定したものを指定

ライブラリを導入

$ cd アプリ名
$ bundle install

MySQLインストール時にエラーが出た
Ruby - bundle install 時に出るエラー Gem::Ext::BuildError: ERROR: Failed to build gem native extension.|teratail
上記記事を参考に解決
シークレットキーの作成

# メモしておく
$ rails secret

アプリの設定

.bash_profileに環境変数を設定していきます。
ここではRailsのシークレットキー、MySQLのパスワードなどを適宜設定します。

$ vim ~/.bash_profile

export SECRET_KEY_BASE=rails secretで作成したシークレットキー
export TEST_DATABASE_PASSWORD=MySQLのユーザー登録で設定したパスワード

#.bash_profileの反映
$ source ~/.bash_profile

テーブルの作成

$ rails db:migrate RAILS_ENV=production

MySQLサーバーに接続できないとエラーが出た
以下の記事を参考に解決
Rails アプリ起動時のMysqlエラー を解消 (Mysql2::Error::ConnectionError ・ Can't connect to local MySQL server through socket '/tmp/mysql.sock') - Qiita

アプリの起動

ルートユーザーで作業

nginxの再起動
$ sudo systemctl restart nginx.service
アプリを起動

deployユーザー

$ cd /var/www/アプリ名
$ rails assets:precompile RAILS_ENV=production
$ rails server -e production

参考にした書籍

www.amazon.co.jp

おわりに

RailsとNginxの連携にかなり手こずってしまいました、、
Nginxの設定など詳しく分からないところが多いので今後触る機会に理解していければと思います。
次回はもっとスムーズにアプリをデプロイできるようになりたいです。