ELBのConnection Drainingを使ってみる


ELBのConnection Drainingがサポートされたので試してみた。
今までApacheのgraceful-stopでELBからインスタンス外してたりしてたけどこれで安全、簡単に取り外しができそう。

使ってみた環境

ELB <=> EC2(<=> sinatra)な構成を構築
sinatraは以下のようなコード

require 'sinatra'

get '/' do
  sleep 30
  'test'
end

get '/status' do
  'ok'
end

management consoleから使ってみる

  • オフの確認
    1. ELBのConnection Drainingオフ
    2. ブラウザやcurlでELBドメインの/にアクセス
    3. ELBからEC2をRemove
    4. /からレスポンスが返らないことを確認(curlではEmpty reply from serverでエラー)
  • オンの確認
    1. ELBのConnection Drainingオン
    2. ブラウザやcurlでELBドメインの/にアクセス
    3. ELBからEC2をRemove
    4. /から"test"が返ることを確認

API(rubyのaws-sdk)から使ってみる

  • ELBのConnection Drainingオン
  • ブラウザやcurlでELBドメインの/にアクセス
  • 以下のスクリプトを実行
require 'aws-sdk'

REGION = "ap-northeast-1"
ELB_NAME = "test"

elb = AWS::ELB.new(:proxy_uri => ENV['HTTP_PROXY'] || ENV['http_proxy'], 
                   :region => REGION).load_balancers[ELB_NAME]

deregister_instances = []
elb.instances.each do |instance|
  elb.instances.deregister(instance)
  deregister_instances << instance
  puts "#{instance.instance_id} #{instance.tags["Name"]}"                                                             
end

while true
  sleep 3
  deregister_instances.each do |instance|
    p instance.elb_health
  end 
end
  • 結果確認(レスポンス返す間はInService)
$ bundle exec ruby elb_ec2_deregister.rb
i-12345678 test
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance is not currently registered with the LoadBalancer.", :state=>"OutOfService", :reason_code=>"Instance"}