はじめに
AWSアカウントが作成されているのを前提で進めてください。
ここでは主に画像で説明しておりますので、順に進めていただければ手動デプロイ完了までできるようになっております。
ます、AWSトップページ右上の「コンソールにサインイン」してください。
リージョンを選択
EC2インスタンスの作成
「仮想マシン」のことをAWSでは「EC2インスタンス」と呼ばれています。
Elastic IPの作成と紐付け
Elastic IPとはAWSから割り振られた固定のパブリックIPアドレスです。
ポートを開く
WEBサーバとして利用するEC2インスタンスは事前にHTTPがつながるように「ポート」を開放する必要があります。
EC2インスタンスへログインする
EC2インスタンスを作成すると、ec2-userというユーザーと対応するSSH秘密鍵が生成されました。
$ cd ~
$ mv Downloads/ダウンロードした鍵の名前.pem .ssh/
# ここで No such file or directoryのエラーが出た場合は、mkdirコマンドで~/.ssh/ディレクトリを作成してから、上記を実行してください。
$ cd .ssh/
$ chmod 600 キーペアの名前.pem
$ ssh -i キーペアの名前.pem ec2-user@Elastic IP
※鍵の生成時にデスクトップや他の場所に保存してしまった場合は、鍵の場所を確認してください。
Elastic IPは、AWSで先ほど作成したものになります。確認方法は以下です。
$ ssh -i キーペアの名前.pem ec2-user@Elastic IP
The authenticity of host '' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
[ec2-user@ip-000-00-00-00 ~]$
だいたいこんな感じになっていれば、ログイン成功です。
以上で、AWSの設定とEC2インスタンスの生成が完了です。
これで、コンピュータとEC2インスタンスとの間でSSH接続をして、EC2インスタンスにログインすることが出来るようになりました。
ツールのインストール
EC2インスタンスの中でアプリケーションを起動するための環境構築をしていきます。
yum
yumコマンドを利用することで、yumの管理下にあるプログラムのバージョンを管理したり、一括でアップデートしたりできます。
パッケージ
LinuxOS下における、ある役割/機能をもったプログラムの集合です。ソフトウェアとも、ライブラリです。
パッケージをアップデートする
EC2にログインしていない場合は、下記のコマンドを実行してください。
$ cd .ssh/
$ ssh -i キーペアの名前.pem ec2-user@Elastic IP
これでログインできている状態になりました。
[ec2-user@ip-000-00-00-00 ~]$ sudo yum update
その他環境構築に必要なパッケージをインストールする
[ec2-user@ip-000-00-00-00 ~]$ sudo yum install \
git make gcc-c++ patch \
libyaml-devel libffi-devel libicu-devel \
zlib-devel readline-devel libxml2-devel libxslt-devel \
ImageMagick ImageMagick-devel \
一行ずつ入力してリターンキーを押すとバックスラッシュによって改行されるので、最後まで打ち切ってください。
Is this ok [y/d/N]:
このように聞かれますのでyesという意味の y キーを打ち進めてください。
openssl-develをインストールする
sudo yum install -y openssl-devel
こちらはRubyのインストールに必要なパッケージになります。
Node.jsをインストールする
ECS上でJavaScriptを動かすためにインストールします。
Node.js
サーバーサイドで動くJavaScriptのパッケージです。今後のデプロイに向けた作業の中で、CSSや画像を圧縮する際に活用されるようになります。
コマンドを実行する
[ec2-user@ip-000-00-00-00 ~]$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
[ec2-user@ip-000-00-00-00 ~]$ sudo yum install nodejs
[y/d/N]: がでてくれば y です。
これでNode.jsのインストールは完了しました。
rbenvとruby-buildをインストールする
Rubyのバージョンを管理する際に組み合わせて使うツールになります。これらはRubyをインストールする前に、インストールする必要があります。
rbenvを使用することでrubyのバージョンを切り替えることできます。
コマンドを実行する
#rbenvのインストール
[ec2-user@ip-000-00-00-00 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
#パスを通す
[ec2-user@ip-000-00-00-00 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
#rbenvを呼び出すための記述
[ec2-user@ip-000-00-00-00 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
#.bash_profileの読み込み
[ec2-user@ip-000-00-00-00 ~]$ source .bash_profile
#ruby-buildのインストール
[ec2-user@ip-000-00-00-00 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
#rehashを行う
[ec2-user@ip-000-00-00-00 ~]$ rbenv rehash
Rubyをインストールする
ここで注意点ですが、ローカル環境と同じバージョンをインストールしましょう。まず、ローカル環境でアプリのディレクトリに移動して以下のコマンドでRubyのバージョンを確認しましょう。
$ ruby -v
確認ができたら、本番環境にRubyをインストールしていきましょう。
[ec2-user@ip-000-00-00-00 ~]$ rbenv install 2.5.1
[ec2-user@ip-000-00-00-00 ~]$ rbenv global 2.5.1
[ec2-user@ip-000-00-00-00 ~]$ rbenv rehash
[ec2-user@ip-000-00-00-00 ~]$ ruby -v
上記では、2.5.1 をインストールしていますが、ここはご自身のローカル環境と同じバージョンでコマンドを実行してください。
以上で、EC2インスタンス内の環境構築が完了です。
本番環境でのデータベースを作成をおこなう
今回は、sqlでも代表的な「MySQL」を使って進めていきます。
MySQLをインストールする
それではまた、EC2にログインできていない場合はログインします。
$ cd .ssh/
$ ssh -i キーペアの名前.pem ec2-user@Elastic IP
[ec2-user@ip-000-00-00-00 ~]$ sudo yum install mysql56-server mysql56-devel mysql56
今回は、バージョン5.6をインストールしました。環境に合わせて変更してください。
MySQLを起動する
それでは、インストールしたMySQLを起動しましょう。
[ec2-user@ip-000-00-00-00 ~]$ sudo service mysqld start
起動できたか確認しましょう
[ec2-user@ip-000-00-00-00 ~]$ sudo service mysqld status
以下のようになれば起動しています
mysqld (pid 8675) is running...
MySQLのrootパスワードの設定をする
[ec2-user@ip-000-00-00-00 ~]$ sudo /usr/libexec/mysql56/mysqladmin -u root password '設定するpassword'
上記のシングルクオーテーションの中に設定したいパスワードを入力しましょう。忘れないようにメモを残して置くことをおすすめします。
[ec2-user@ip-000-00-00-00 ~]$ mysql -u root -p
パスワードを聞かれますので入力しましょう。
これで問題なければ、以下のようになっているはずです。
mysql>
これで、データベースの設定は完了です。
それでは、次の章からアプリを本番環境で動かすことをしていきます。
GithubにSSH鍵を登録
本番環境にアプリのコード(github)をクローンする準備をおこないましょう
EC2インスタンスからGithubにアクセスするためには、作成したEC2インスタンスのSSH公開鍵をGithubに登録する必要があります。
以下のコマンドを実行してgithubに登録するためのEC2サーバのSSH鍵ペアを作成します。
[ec2-user@ip-000-00-00-00 ~]$ ssh-keygen -t rsa -b 4096
リターンキーで進めていくと下記のような表示になります。
The key's randomart image is:
+---[RSA 4096]----+
| . ....|
| . . ...++|
| . + .++*|
| * o **.|
| So X + E+|
| ..+ O B.=|
| . .o X o.|
| . ..o = |
| . o+o . |
+----[SHA256]-----+
これでSSH公開鍵が生成されましたので下記のコマンドで、表示してコピーします。
[ec2-user@ip-000-00-00-00 ~]$ cat ~/.ssh/id_rsa.pub
ssh-rsa から始まる英数の公開鍵が表示されていると思いますのでこちらをコピーします。
コピーした公開鍵を下記のGithubにアクセスして登録していきましょう。
>> github SSH <<
アクセスしたら「new SSH key」をクリックしてSSHの登録をおこないます。
最後に登録ができているかコマンドで確認します。
[ec2-user@ip-000-00-00-00 ~]$ ssh -T git@github.com
Are you sure you want to continue connecting (yes/no)? yes
Hi ユーザー名 You've successfully authenticated, but GitHub does not provide shell access.
上記のようになっていればSSH公開鍵の登録は完了です。
Permission denied (publickey). と表示された場合は、SSH鍵の設定が間違っているので、見直しましょう。
本番環境サーバーの設定
本番環境でもローカル環境と同じようにサーバーを動かさなければ、公開することはできません。それでは、EC2サーバ上でもサーバーを動かしていきましょう。
Unicorn(ユニコーン)
全世界に公開されるサーバ上で多く利用されるアプリケーションサーバです。
ローカル環境では、 rails s コマンドでサーバーを起動していたのと同じように unicorn_rails コマンドを使うことで本番環境でのサーバー起動ができるようになるのです。
プロセス
PC(サーバ)上で動く全てのプログラムの実行時の単位です。
プロセスを確認する
それでは、macで「アクティビティモニタ」を開いてください。
左上の「プロセス名」と「PID」に注目してください。
これはプロセスを識別するための一意の数字になります。PIDがあることで、あるプログラムから別のプロセスを指定して操作したり、プロセスからプログラムを停止したりできます。
それでは、プロセスが何か理解できたところで、Unicornを使う準備をしていきます。
Unicornをインストールする
それでは、アプリのエディタのgemfileを開いて最後に以下を追加します。
group :production do
gem 'unicorn', '5.4.1'
end
production doとは本番環境でのみ読み込まれるという意味になります。
$ bundle install
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
Githubからコードをクローンする
1.ディレクトリを作成
[ec2-user@ip-000-00-00-00 ~]$ sudo mkdir /var/www/
2.作成したwwwディレクトリの権限をec2-userに変更
[ec2-user@ip-000-00-00-00 ~]$ sudo chown ec2-user /var/www/
3.作成したwwwディレクトリに移動
[ec2-user@ip-000-00-00-00 ~]$ cd /var/www/
4.githubのリポジトリをクローンする
[ec2-user@ip-000-00-00-00 ~]$ git clone あなたのアプリのURL
[ec2-user@ip-000-00-00-00 www]$ ls
成功していればここにアプリのディレクトリがクローンされています
本番環境でgemをインストールする
まず、本番環境でアプリのあるディレクトリに移動しましょう。
[ec2-user@ip-000-00-00-00 ~]$ /var/www/アプリ名
[ec2-user@ip-000-00-00-00 アプリ名]$ ruby -v
ローカルとバージョンが同じであれば問題なし
それでは本番環境でgemを管理するためのbundlerをインストールしていきます。
まず、ローカル環境でbundlerのバージョンを確認します。
こちらはローカル環境です
$ bundler -v
Bundler version 2.0.1
それでは、ローカル環境のbundlerのバージョンがわかったので、同じバージョンを本番環境にも導入していきます。
ローカル環境のbundlerと同じバージョンをインストールしてください。ここでは2.0.1
[ec2-user@ip-000-00-00-00 アプリ名]$ gem install bundler -v 2.0.1
[ec2-user@ip-000-00-00-00 アプリ名]$ bundle install
環境変数の設定をする
環境変数とは?
データベースのパスワードなどセキュリティのためにGithubにアップロードすることができない情報は別のファイルに記述してしようします。
secret_key_base
Cookieの暗号化に用いられる文字列です。Railsアプリケーションを動作させる際は必ず用意する必要があります。
下記のコマンドを実行することで生成することができます
[ec2-user@ip-000-00-00-00 アプリ名]$ rake secret
環境変数を設定する
[ec2-user@ip-000-00-00-00 ~]$ sudo vim /etc/environment
コマンドを実行するとvimが開きます
vimが開いたら i キーを押して入力可能の状態にして下記のコードを入力します。
DATABASE_PASSWORD='mysqlパスワード'
SECRET_KEY_BASE='secret_key_baseをコピペする'
入力が終わったら左上の esc(エスケープキー) を押して :wq と入力してリターンキーを押すと内容が保存されます。その後一旦ログアウトします。
[ec2-user@ip-000-00-00-00 ~]$ exit
ログアウトしたら再度ログインして、環境変数が設定できているか確認します。
[ec2-user@ip-000-00-00-00 ~]$ env | grep SECRET_KEY_BASE
[ec2-user@ip-000-00-00-00 ~]$ env | grep DATABASE_PASSWORD
先程、vimで入力した内容が表示できていれば正しく設定できています。
ポートを解放する
先程、 config/unicorn.rb に listen 3000 と記述しました。これはRailsのサーバを3000番ポートで起動するということを意味します。
以上で、ポートの開放ができました。
本番環境でデータベースを作成する
ローカル環境で、サーバーを起動する際を思い出してください。 rake db:create でデータベースを作成しなければサーバー起動できなかったはずです。本番環境も同じように作成しなければ起動できないようになっています。
それでは、ローカル環境のファイルを修正していきましょう。
production:
<<: *default
database: ~~~(ここは編集しない)
username: root
password: <%= ENV['DATABASE_PASSWORD'] %> #環境変数を呼んでいる
socket: /var/lib/mysql/mysql.sock
編集できたら、githubのmasterにプッシュします。プッシュできたら本番環境のアプリにも変更を適用するために下記のコマンドを実行しましょう。
[ec2-user@ip-000-00-00-00 アプリ名]$ git pull origin master
これで本番環境のアプリケーションにも変更が反映できました。それでは、データベースを作成するコマンドを実行していきましょう。
[ec2-user@ip-000-00-00-00 アプリ名]$ rails db:create RAILS_ENV=production
[ec2-user@ip-000-00-00-00 アプリ名]$ rails db:migrate RAILS_ENV=production
Created databaseとなっていれば無事にデータベースが作成されました。
assetsファイルをコンパイルする
本番環境でcssやjavascriptを反映させるには、事前にアセットをコンパイルする必要があります。
参考 Rails初学者がつまずきやすい「アセットパイプライン」
[ec2-user@ip-000-00-00-00 アプリ名]$ rails assets:precompile
コンパイルが成功したらRailsを再起動しますのでプロセスを確認していきます。
psコマンドを入力してUnicornのプロセスを確認
[ec2-user@ip-000-00-00-00 アプリ名]$ ps aux | grep unicorn
ec2-user 7878 0.0 11.2 43648 11608 ? Sl 13:27 0:01 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 7879 0.0 14.6 47698 14116 ? Sl 13:27 0:01 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 7890 0.0 0.2 11032 276 pts/0 S+ 14:17 0:00 grep --color=auto unicorn
左から2番目の列に注目してください。こちらがPIDになり、「unicorn_rails master」というプロセスをkillコマンドで消していきましょう。
[ec2-user@ip-000-00-00-00 アプリ名]$ kill -9 7878
今回は7878にしていますが、皆さんは違うと思います
再度 ps aux | grep unicorn コマンドを実行するとプロセスが消えていると思います。
unicornを起動する
[ec2-user@ip-000-00-00-00 アプリ名]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
これで一旦デプロイは完了したので、ブラウザでアクセスして確認してみましょう。
http://Elastic IP:3000/
うまくデプロイできなかった場合
本番環境でログにエラーがないか確認する
[ec2-user@ip-000-00-00-00 ~]$ cd /var/www/アプリ名/log
cat unicorn.stderr.log
or
less unicorn.stderr.log
mysqlの起動は正しく行えているか確認する
EC2インスタンスの再起動してみる
SECRET_KEY_BASE等は正しく設定できている確認する
以上で手動デプロイは完了です。
credentials.yml.enc
今回は、Rails5.2を使っているので、credentials.yml.encを使っていきます。
参考 Rails5.2から追加された credentials.yml.enc のキホン
参考 Rails5.2から導入されたcredentials.yml.encを極める
参考 Railsのcredentials.yml.encは、どういった運用ができるか?
こちらの記事を参考にして環境変数を設定していきます。
よく使うコマンド集
EC2ログイン
$ cd .ssh/
$ ssh -i キーペアの名前.pem ec2-user@Elastic IP
mysqlログイン
$ mysql -u root -p
本番環境でアプリのあるディレクトリに移動する
$ cd /var/www/
グローバルリポジトリの内容を反映させる
$ git pull origin master
バージョン確認
$ ruby -v
$ bundler -v
ユニコーンサーバーを起動させる
unicorn_rails -c config/unicorn.rb -E production -D
http://3.113.211.76:3000/
$ sudo service nginx reload
$ sudo service nginx restart
$ sudo service mysqld restart
$ bundle exec cap production deploy