LoginSignup
10
12

More than 3 years have passed since last update.

AWS デプロイ 手動 画像で解説

Last updated at Posted at 2019-08-05

はじめに

AWSアカウントが作成されているのを前提で進めてください。
ここでは主に画像で説明しておりますので、順に進めていただければ手動デプロイ完了までできるようになっております。
ます、AWSトップページ右上の「コンソールにサインイン」してください。

リージョンを選択

faf23c7487d254ef380fdd4580362724.png

EC2インスタンスの作成

「仮想マシン」のことをAWSでは「EC2インスタンス」と呼ばれています。
6956d1736868b1cca80245484635da47.png
7783e4a55e2d6b9e72bd544a75ab318c.png
f3d5fbc0e467157b9ec959c4f0955e88.png
a7d8e1f46d0a3fb5caa35b15a2f788ed.png
b8843caebe5270b6f095f77e8f6d587c.png
5d2a7120e1baab39aabb48c15955f4bd.png
ca9d66e8b37050d5a3330bad605cb6d2.png

Elastic IPの作成と紐付け

Elastic IPとはAWSから割り振られた固定のパブリックIPアドレスです。
8996410994412bbe8bb2a206fbc09488.png
e3d6c534f9717778b39054086a129b9c.png
e5188cd776f565981011be9230766488.png
00ab38a6b754ebb43e226d8a2efced24.png

ポートを開く

WEBサーバとして利用するEC2インスタンスは事前にHTTPがつながるように「ポート」を開放する必要があります。
0b7ce1ca5ce682c08d9f7e09437a2c75.png
bbb5d3a654ae858661026d1e4e6829d9.png
c0974a4d79b789e8de049dbc8691f3c6.png

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で先ほど作成したものになります。確認方法は以下です。
b1fe4f2cba688278b3d1c38d66995336.png

$ 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の登録をおこないます。
fb528668062ce467f263dc9f66940acc.jpg
最後に登録ができているかコマンドで確認します。

[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 コマンドを使うことで本番環境でのサーバー起動ができるようになるのです。
238665045a83e58cb58ea059d1558aa3.png

プロセス

PC(サーバ)上で動く全てのプログラムの実行時の単位です。

プロセスを確認する

それでは、macで「アクティビティモニタ」を開いてください。
e626bddb165744b6715f1d256d064fe3.png
左上の「プロセス名」と「PID」に注目してください。
これはプロセスを識別するための一意の数字になります。PIDがあることで、あるプログラムから別のプロセスを指定して操作したり、プロセスからプログラムを停止したりできます。
それでは、プロセスが何か理解できたところで、Unicornを使う準備をしていきます。

Unicornをインストールする

それでは、アプリのエディタのgemfileを開いて最後に以下を追加します。

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

production doとは本番環境でのみ読み込まれるという意味になります。

$ bundle install

unicorn.rbファイルを作成する

config/unicorn.rbを作成します。次に下記のコードを入力してください。

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

あなたのアプリのURLの部分は下記を参考にしてください。
e5163d180a6607ede9bcc85bd035843c.png

[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番ポートで起動するということを意味します。
4d558430c60e41907a1be421537f6585.png
bbb5d3a654ae858661026d1e4e6829d9.png
ec5a3ab111c7a0aea6360be27116573a.png
以上で、ポートの開放ができました。

本番環境でデータベースを作成する

ローカル環境で、サーバーを起動する際を思い出してください。 rake db:create でデータベースを作成しなければサーバー起動できなかったはずです。本番環境も同じように作成しなければ起動できないようになっています。
それでは、ローカル環境のファイルを修正していきましょう。

config/database.yml

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
10
12
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
10
12