目的
awsのautoscalingに対応したデプロイ環境の実現。
awsでのwebアプリデプロイはここ参照
http://www.slideshare.net/AmazonWebServicesJapan/20130506-23096544
この資料のAuto Scalingでデプロイ
の項目。
実現出来そうではあるがハードコーディング感が否めない、
コマンド一発で実行出来る環境を構築して変更に強くしておきたい
(例えばcapistranoで自分自身にデプロイ出来るようにしておくとか、そうすればデプロイ手順が変更されてもcapistranoでデプロイに統一されていれば自ずと同じデプロイが実行される)
ElasticBeantalkは外部にあんまりソースコード置きたくないかな。。でも便利そう、超便利そう
課題
- 自分自身にデプロイする
- リモート環境にデプロイする時と同じ処理
てのが出来れば良い
capistrano-extインストール
環境毎に分けたデプロイ方法が実現できるプラグインの導入
gem install capistrano-ext
mkdir config/deploy
touch config/deploy/local.rb
touch config/deploy/remote.rb
vi config/deploy.rb
# デプロイ環境が複数ある場合
set :stages, ["remote", "local"]
set :default_stage, "remote"
以下のように切り替えて実行する事が出来る
# config/deploy/remote.rbの記述が読み込まれる
cap deploy
cap remote deploy
# config/deploy/local.rbの記述が読み込まれる
cap local deploy
roleの記述を読み替える
実行を切り替えた時にrole
の設定を切り替える
set(:domain) { "#{domain}" }
role(:app) { domain }
remoteはELB配下のサーバーにデプロイ出来るようにawsのapi叩いてipの取得、vpc使ってip割り振っているので/etc/hosts
で設定してあればその名前取得、なければipまま
(autoscalingやるとなるとip割り振りする必要無くなりそうですね)
require 'aws-sdk'
require 'resolv'
AWS.config({
:access_key_id => 'access_key_id',
:secret_access_key => 'secret_access_key',
:ec2_endpoint => 'ec2.ap-northeast-1.amazonaws.com',
:elb_endpoint => 'elasticloadbalancing.ap-northeast-1.amazonaws.com'
})
elb = AWS::ELB.new.load_balancers['elb-name']
instances = elb.instances.select {|i| i.exists? && i.status == :running }.map(&:private_ip_address)
# /etc/hosts を参照してhostnameに変換、hostsファイルに記述無いとip表示
hostnames = []
hosts = Resolv::Hosts.new
instances.each {|ip|
begin
hostnames.push(hosts.getname(ip))
rescue
hostnames.push(ip)
end
}
set :domain, hostnames
set :domain, ['localhost']
これで下記コマンドでリモートとローカルでのデプロイを切り分ける事が出来た。
cap deploy
cap local deploy
os立ち上がった時にバージョン管理から最新になるパス作ってそこにcapistrano設置、autoscalingから起動したらそのパスのデプロイコマンド叩くとローカルにデプロイされるという環境が出来上がるであろう。
実際にautoscalingは実現出来てはいないが問題の一つは解消出来たと思われる。
後は毎回サーバーの変更あるたびにAMI作り直すの面倒なんでchef実行される環境作ったりとかですかね。
以上