takecian

Diary

30 Dec 2013

Heroku から AWS に移行する(Nginx + Unicorn で Rails アプリ開発)

年末休みになって少し時間ができたので今作ってるアプリ(Snandy) の Heroku から AWS に移行作業を進めてる。

移行する理由としては Native に依存しているとその gem が Heroku 上だと使えなかったり、
#調べた限り。recommendify という gem を使おうと思ったらエラーが出て怒られた

Heroku がいろんなところをよろしくやってくれるのでスキルアップのためにはもっと下のレイヤーも触らないといかんなと思ったから。

それで今日からAWS(EC2 + RDS)に環境作業を始めたんだけど、今時手作業で環境構築するのは時代遅れもいいところ、ということなので chef を使うことにした。

設定を Ruby でかけるのがすごくいい感じ。Rails でアプリを作ってたことでスッと頭に入ってくるようになった(気がする)。

EC2上では Nginx と unicorn を使って Rails を動かして、DB は RDS。なので chef で Nginx と MySQL、rvm をインストールする。

MySQL と rvm は opscode や github からもってきた cookbook を使用。

Berkfile はこんな感じ。
[code lang="ruby"]
site : opscode

metadata
cookbook 'mysql'
cookbook 'rvm', github: 'fnichol/chef-rvm'
[/code]

Nginx の recipe は

[code lang="ruby"]
package "nginx" do
action :install
end

service "nginx" do
supports status: true, restart: true, reload: true
action [:enable, :start]
end

template "nginx.conf" do
path "/etc/nginx/nginx.conf"
source "nginx.conf.erb"
owner "root"
group "root"
mode 0644

notifies :reload, "service[nginx]"
end
[/code]

中身は完全に naoya さんの「入門ChefSolo」と同じ。

conf の方が自分用に変わっていて、

[code lang="javascript"]
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
upstream snandy.me {
server unix:/var/www/snandy/tmp/unicorn.sock;
}

server {
listen <%= node["nginx"]["port"] %> default_server;
server_name _;
root /var/www/snandy/public;
location / {
proxy_pass 'http://snandy_upstream';
}
}
}
[/code]

これで Unix のソケットを unicorn 側(unicorn.rb)にも設定する。

[code lang="ruby"]
APP_PATH = "/var/www/snandy"
working_directory APP_PATH

stderr_path APP_PATH + "/log/unicorn.stderr.log"
stdout_path APP_PATH + "/log/unicorn.stderr.log"
pid APP_PATH + "/tmp/unicorn.pid"
listen APP_PATH + "/tmp/unicorn.sock"
[/code]

これで移行自体はなんとかできた。

あとは Rails アプリのデプロイも Capistrano でできるようにならねば。

それにしても Heroku でやってたら Nginx なにそれ、unicorn なにそれ、Capistrano なにそれ、という感じでここまできてた。知らないところでいろいろやってくれてたんですな。AWS に知らないところでいろいろやってもらえるのは変わらないんだろうけど。