xxxcaqui.log

ツッコミお待ちしています

RailsアプリをEC2にデプロイしてみる。

タイトルの通り、RailsアプリをAWSのEC2で動かしてみます。

前提

環境

  • Amazon Linux AMI 2013.03.1

想定

  • デプロイするアプリケーションの名前は「pic_share」。
  • DBはEC2上にインストールしたPostgreSQLを使う。

EC2側の設定

ユーザ周りの設定

EC2インスタンスを立ちあげ、ローカルマシンから

$ scp -i ~/.ssh/hogehoge.pem ~/.ssh/id_rsa.pub ec2-user@ec2_server:~

EC2インスタンスにログイン後、

$ sudo passwd
$ sudo su
# useradd rails
# visudo
# passwd rails
# mkdir --mode 700 /home/rails/.ssh
# mv id_rsa.pub /home/rails/.ssh/authorized_keys
# chmod 600 /home/rails/.ssh/authorized_keys
# chown -R rails:rails /home/rails/.ssh

これで、ssh rails@ec2_serverできますよっと。

Ruby周りの設定

Amazon Linuxでrbenvを使ってRuby2.0を入れてみた。」のように、rbenvを使ってRubyを入れます。
ここでは、とりあえずRuby1.9.3とBundlerを入れておきます。

$ rbenv install 1.9.3-p429
$ rbenv global 1.9.3-p429
$ gem install bundler

Web/Appサーバ周りの設定

WebサーバとAppサーバをインストールしておきます。

$ sudo yum install -y gcc-c++ libcurl-devel httpd-devel
$ gem install passenger
$ source ~/.bash_profile
$ passenger-install-apache2-module

passenger-install-apache2-moduleの指示に従って、Apacheの設定ファイルに以下の内容を追記します。

#/etc/httpd/conf/httpd.conf
LoadModule passenger_module /home/rails/.rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/passenger-4.0.5/libout/apache2/mod_passenger.so
PassengerRoot /home/rails/.rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/passenger-4.0.5
PassengerDefaultRuby /home/rails/.rbenv/versions/1.9.3-p429/bin/ruby

また、apacheの実行ユーザを変更します。

#/etc/httpd/conf/httpd.conf
user rails
group rails

そして、自動起動設定。

$ sudo /sbin/chkconfig httpd on

まだ、アプリケーションが置かれているディレクトリが存在しないため、DocumentRoot等の設定はデプロイ後に行うことにします。

DB周りの設定

今回はPostgreSQLを使用します。

$ sudo yum install -y postgresql postgresql-devel postgresql-server postgresql-libs
$ sudo service postgresql initdb
$ sudo /sbin/chkconfig postgresql on
$ sudo service postgresql start

PostgreSQLのユーザとテーブルを作り、パスワードを設定します。

$ sudo su - postgres
$ createuser -a pic_share
$ createdb -E UTF8 -O pic_share pic_share_production
$ psql -c "alter user pic_share with password 'hogehoge'"
$ exit

PostgreSQLの設定ファイルを編集します。

#/var/lib/pgsql9/data/pg_hba.conf
local  all  all  md5
$ sudo sudo service postgresql reload

ローカル側でデプロイの準備

Capistrano設定

$ gem install capistrano capistrano_colors
$ capify .
#config/deploy.rb
require "bundler/capistrano"
load "deploy/assets"

# Git repository                                                                                                                            
set :scm,         "git"
set :repository,  "git@github.com:user_name/repo_name.git"
set :branch,      "master"

ssh_options[:forward_agent] = true
default_run_options[:pty]   = true

# Server setting
ec2 = "ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com"
role :web, ec2
role :app, ec2
role :db,  ec2, :primary => true

set :application, "pic_share"
set :user, "rails"
set :use_sudo, false
set :deploy_to, "/home/#{user}/#{application}"
set :rails_env, "production"
default_run_options[:shell] = '/bin/bash --login'
#Gemfile
gem 'sqlite3', group: [:development, :test]
gem 'pg', group: :production
gem 'therubyracer', :platforms => :ruby
#config/database.yml
production:
  adapter: postgresql
  database: pic_share_production
  username: pic_share
  password: hogehoge
  encoding: utf8
$ cap deploy:setup
$ cap deploy
$ cap deploy:migrate

EC2側の設定

最後にApacheのDocumentRootを先ほどデプロイしたディレクトリに設定します。

<VirtualHost *:80>
  ServerName ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com
  DocumentRoot /home/rails/pic_share/current/public
</VirtualHost>
$ sudo service httpd restart

さいごに

以上、EC2でRailsを走らせるための一部始終でした。
特別なことは何もしていませんが、最初から最後まで通してやると地味にいろいろ引っかかって疲れるため、まとめてみました。

つかれた。