AWS

Rails + Nginx + Unicorn + postgreSQL を使ったAWS(EC2)の環境構築 -Rails起動してHello Worldを表示させる-

2+

かなり長文になりますが、Rails + Nginx + Unicorn + postgreSQL を使ったAWS(EC2)の環境構築にかなり苦戦したので、備忘録としてメモしておきました。
今回はHello Worldを表示させるだけなので、DBは導入しますが、アプリケーションとDBのやりとりはないものとしています。DBとのやりとりが発生する場合については、
次回のNginx/Unicorn導入編でまとめます。

【前提】

<ローカル環境>
・仮想サーバー:vagrant
・アプリケーションサーバー:puma
・Ruby 2.3.1
・Rails 5.2.2
・DBサーバー:postgreSQL1.9.6
<本番環境>
・AWS(EC2)
・Webサーバー:Nginx
・アプリケーションサーバー:Unicorn
・Ruby 2.3.1
・Rails 5.2.2
・DBサーバー:postgreSQL1.9.6
<補足>
・AWSアカウントの作成やVPCの作成、インスタンスの生成、ポート開放などは完了
・MacOSで公開鍵と秘密鍵は作成し、AWS上に公開鍵は登録済。
⇒今回使うAWSのインスタンスは自身で作成したものではなく、第三者が作成したAWSのインスタンスを使用する前提にしています。その場合は予め自身のMacOSで公開鍵を作成し、AWSのインスタンスの保有者に登録してもらう必要があります。

【環境構築のイメージ図】

【手順】

①MacOSのシェルからEC2を操作するために、SSH接続でセキュアな通信でEC2インスタンスにログインする

■MacOSのconfigファイルで、どのIPアドレスとの通信の認証時に、秘密鍵を使って公開鍵認証を行うのかを設定する

 

■SSH通信でEC2インスタンスにログインする(passphraseを入力するので、公開鍵・秘密鍵を作った時に設定したpassphraseは忘れないこと)

②現状中身が空っぽのEC2インスタンスを、VirtualBoxと同じ開発環境に構築していく。

■yumを使ってパッケージをインストールしていく。
yum:LinuxのRedHat系ディストリビューション(CentOSやFedora等)で利用されるパッケージ管理ツール
リポジトリ(パッケージ置き場)からパッケージをダウンロードし、インストール、アンインストール、更新をする事ができる。その際、各パッケージの依存関係を自動的に解決し、関連するパッケージがどれなのか教えてくれたり、必要な場合は、関連パッケージをダウンロードしてそのまま更新してくれたりする。また、システム全体を更新する事も可能という優れもの。

インストールするパッケージは下記3つのサイトから抽出して、それぞれのパッケージについて調べて、あくまで主観だが必要そうだと思ったものをインストールした。

※他に必要なものがあれば、後ほどインストールするようにする。
■rbenvのインストール
rbenv:複数バージョンのRubyを切り替えて使うための環境を提供してくれる便利ツール
■PATHを通すことで、rbenvコマンドを使えるようにする
PATHを通す:特定のプログラムを「プログラム名だけで実行できるようにする」こと。例えば、UNIXで「ls」と打てば、ディレクトリ内のファイル一覧を見ることができるが、
この「ls」はデフォルトでPATHが通っているから「ls」というプログラム名だけで実行することができる。

https://qiita.com/nbkn/items/01a11392921119fa0153
PATHを通すための環境変数の設定について(https://qiita.com/soarflat/items/d5015bec37f8a8254380

・.bash_profileに環境変数を設定
bash:シェルの一種(https://www.sejuku.net/blog/54333#bash
.bash_profile:環境変数を設定する場所(https://qiita.com/takutoki/items/021b804b9957fe65e093

・shimsを有効化する

shims(rbenv rehash)
⇒rubyやgemをインストールして使えるコマンド(irb gem rake rails ruby等)をバージョンごとに振り分けるフォルダ。
こういったコマンドをバージョンごとに参照先を切り替えてくれるディレクトリがshims(rbenv rehash)。

 

・.bash_profileに設定された環境変数を読み込む。これでrbenvコマンドが使えるようになる。
■ruby-buildをインストール(rbenv install コマンドが使えるようになるrbenvのプラグイン)
・rbenv rehashでこれまでの処理を有効化
■rubyをインストール
・システム全体で使用するrubyバージョンを指定する
・rbenv rehashでこれまでの処理を有効化
・最後にruby -vでバージョン確認して表示されたらOK
■次にrailsをインストール
・まずは、bundlerをインストール
bundler:gem同士の互換性を保ちながら、パッケージの種類やバージョンを管理してくれる仕組み。
基本的に、gemコマンドでインストールするのはBundlerのみで、その他のgemパッケージはBundler経由でインストールする
Bundler概要
Bundlerとは?
・railsをインストール
■postgresqlをインストール
・postgresqlが起動しているか確認。(下記の状態は、まだ起動していない。起動していれば、3つ以上のプロセスが表示されるはず。)
ps/grepなどのLinuxコマンドについてはこちらを参照
 ・起動していなければ、起動させる。

 

■ Gemfileに「gem ‘therubyracer’」を追記
railsではCoffeScripitをJavaScriptにコンパイルする際に、JavaScript runtime が必要になってくる。
MacやWindow PCでは、標準でインストールされているが、それが認識されない場合に下記のようなエラーが出るので、エラーが出たら次に紹介する2つの方法のいずれかで解決する。
このエラーを解消する方法は2つ。
①node.jsをインストールする
②gemをインストールする
今回のアプリケーション開発ではnode.jsは使わない想定なので、②の方法を採用しています。
node.jsを使う想定の方は①の方法をした方が良いと思われる。

③MacOS(VirtualBox)で開発したアプリケーションをGitHubからEC2でgit cloneする。

※このフェーズでは、EC2がクライアントで、GitHubがサーバーというクライアント/ サーバーの関係になっている。
※Gitの仕組みについてはこちら
■gitに関する設定ファイル(.gitconfig)を生成
→.gitconfigはホーム直下(~/)にあり、対象範囲は該当ユーザーの全リポジトリという設定にする
gitconfigについて(https://note.nkmk.me/git-config-setting/
■git cloneするアプリケーションを配置するディレクトリを作成する
/var:ログやキャッシュなど、可変的システムデータ(動的ファイル)。一時的なデータとしては/tmpと同じだが、再起動しても消去されずに残る
参照:Linuxの基本的なディレクトリ構成(https://oxynotes.com/?p=5987#32
この段階でvarとwwwとrailsディレクトリの所有者をrootから自分に変えておくと
後でパーミッションを触る必要がないので、かなり楽になる。
パーミッションについては、こちらを参照
■EC2のシェルからGitHubを操作するために、SSH接続でセキュアな通信を確保する
SSH接続=公開鍵認証方式を利用する=公開鍵と秘密鍵を作成する必要がある。
公開鍵認証について
 
・EC2のLinuxで公開鍵と秘密鍵を作る
ちなみにSSH Keyは解読されないようにするならば4096bitで生成するのが、おすすめです。
・2つの鍵が格納されているファイルができているか確認
・EC2 Linuxのconfigファイルで、どのIPアドレスとの通信の認証時に、秘密鍵を使って公開鍵認証を行うのかを設定する
・今度はサーバー(GitHub)に認証用の公開鍵を登録する。
まずは、ここにログイン(https://github.com/settings/keys
右上の「New SSH key」ボタンから公開鍵名と公開鍵を登録する。
・SSHはパーミッションのセキュリティが甘いと接続する際にエラーで弾かれることもあるので、
パーミッションを厳しく設定しておく。ちなみに権限は「ls -l」コマンドで見ることができる。
■GitHubからEC2でgit cloneアプリケーションを配置する

④Railsサーバーを起動してみる

 ・ここで一度、bundle install

もし、ここで下記のようなエラーが起こったら、postgresql-develをインストールすれば解消するはず。https://qiita.com/pugiemonn/items/197301776b68d0445eb7

■postgreSQLにログインし、ユーザー名とデータベースがvagranrt環境と同じかどうか確認する
postgreSQLにはログインの際の認証方法がいくつかあるが、
今回はIdent方式(シェルのユーザーとpostgresqlのユーザーが一致しているかどうかで認証する)を採用しています。
ログインの際に、認証に失敗したら、下記のようなエラーが出る。

・まずは正常に動作しているVagrant環境のpostgreSQLにログイン

DB所有者とOSユーザー名を見てみると
DBの所有者とシェルを実行しているOSユーザー名がvagrantで一致している。
・EC2でもpostgresqlにログインしてみる。

もし、このエラーが出た場合はpostgresqlのインストール時にデフォルトで作成される「postgres」にユーザーをスイッチさせて、ログインする。
気になるユーザーは・・・本来であれば「ec2-user」にならないといけないのにバラバラ。
vagrantと同じ環境にするために、ロール属性を付加したユーザー(ec2-user)を作成する。
まずは、ユーザー名をec2-userに変える。そして、変更したユーザーにスーパーユーザーの属性を付加して、ユーザー名等は違ってもvagrantと同じ状態にする。
今回はpostgresqlというデータベースをSQLで操作するので、文の最後に「;」を忘れないように注意すること。
ここで再度、ec2-userでpostgresqlにログインできるか試すと。
今度はデータベースが存在しないというエラーが出る可能性がある。
念のためにデータベースも見てみると・・・Vagrantと比較して不足が多いことがある。
【Vagrant】
【ec2-user】

そこで、不足分を追加していく。

<その他参照ページ>
userとパスワードを設定
→設定内容によっては、database.ymlに変更を追記しておくこと。
【user名の変更】
【ロールの変更】
【ロールの属性】
【ロール確認】

 

これで、rails serverを立ち上げると上手く起動するはず。
※ここでは、「sample_app」というアプリケーションをgit cloneしてきたと仮定。
かなり長文になりましたが、次回は、Nginx/Unicorn導入編です。

 

2+