掲題の通りの事やりたいと思います。
今回使うec2-capは、tagでデプロイ対象と成るサーバーを識別します。
ELBからサーバーIPを引っ張らずtagを採用したのは、外部に公開しないjobのみが動くサーバーも対象に含めるためです。
なお、jobはrails側のビジネスロジックを再利用しているため、同じリポジトリに含まれているイメージです。
require
- ruby2.1.2
- rails4.1.1
- capistrano gem (3.2.1)
- ec2-cap gem
- dotenv
- localからデプロイするために入れています
EC2にデプロイ用ユーザーの作成
Groupを作成
# group名
Deploy
# policy
Deploy-20140907
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1410068314000",
"Effect": "Allow",
"Action": [ "ec2:Describe*" ],
"Resource": [ "*" ]
}
]
}
User作成
- deploy
- group : Deploy
対象と成るEC2インスタンスにタグを追加
- Project : hoge
- Roles : app
- Stage : production
各々のタグにおいて、複数付与する必要が有る場合はカンマ区切り
cap-ec2設定
capの基本的な設定は省きます。
Install gems
$ vi Gemfile
group :development do
gem 'capistrano', '~> 3.0'
gem 'capistrano-rails', '~> 1.1'
gem 'cap-ec2'
end
$ bundle
Envirnoments
$ vi .env
AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY
Configure capisitrano
$ vi Capfile
require "dotenv"
Dotenv.load('.env')
require 'cap-ec2/capistrano'
$ vi config/deploy
set :ec2_region, %w{ ap-northeast-1 }
$ vi config/production.rb
set :stage, :production
set :branch, ENV['BRANCH'] || 'master'
set :ssh_options, {
user: 'hogehoge',
keys: %w(~/.ssh/id_rsa)
}
set :rails_env, :production
# cap-ec2
ec2_role :app, ssh_options: fetch(:ssh_options)
deploy
$ bundle exec cap production deploy