okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

ELBのConnection Drainingの動作をテストする

こんにちは@oko_changです。
先日、ELBののConnection Draining機能がリリースされました。
Connection Drainingの機能については、こちらのブログに参考にして、動作テストはこちらのブログに記載されているように大きなダミーファイルを使えば良さそうです。

環境

リリースノートを見るとAWS CLIはConnection Drainingに対応しているようです。
1.3.2より前のバージョンをご使用の方はsudo pip install --upgrade awscliをして下さい。

テスト環境の作成

まず最初にテスト用のELBを作成します。

$ aws elb create-load-balancer \
--load-balancer-name okochang-elb \
--listeners Protocol=http,LoadBalancerPort=80,InstanceProtocol=http,InstancePort=80 \
--subnets subnet-28f4fd4a \
--security-groups sg-d1e3fcbd \
--region ap-northeast-1

$ aws elb configure-health-check \
--load-balancer-name okochang-elb \
--health-check Target="HTTP:80/index.html",Interval=30,Timeout=15,UnhealthyThreshold=5,HealthyThreshold=5 \
--region ap-northeast-1

次にテスト用EC2インスタンスを作成し、ELBの分散対象に加えます。

$ aws ec2 run-instances \
--image-id ami-b5c0b1b4 \
--security-group-ids sg-b72d31db \
--instance-type t1.micro \
--subnet-id subnet-28f4fd4a \
--private-ip-address 10.0.10.10 \
--key-name okochang-key \
--associate-public-ip-addres \
--region ap-northeast-1

$ aws elb register-instances-with-load-balancer \
--load-balancer-name okochang-elb \
--instances i-3a1f443d \
--region ap-northeast-1

テスト用EC2インスタンスにはWebサーバを構築して、ダミーファイルを作成しておきます。

# dd if=/dev/zero of=tempfile bs=10M count=50

動作確認

Connection Draining有効時

ELBは現在、作成するとデフォルトでConnection Drainingが有効になっています。
先ほどのリリースノートにあるとおりConnection Drainingには対応されているはずですが、describe-load-balancer-attributesを実行してもレスポンスは返ってきませんでした。

$ aws elb describe-load-balancer-attributes --load-balancer-name okochang-elb --region ap-northeast-1
{
    "LoadBalancerAttributes": {
        "CrossZoneLoadBalancing": {
            "Enabled": false
        }, 
        "AccessLog": {
            "Enabled": false
        }
    }
}

というわけで以下はElastic Load Balancing API Toolsを使って動作確認をしています。
先ほど作成したELBのConnection Drainingが有効になっている事が確認出来ます。

$ elb-describe-lb-attributes okochang-elb --region ap-northeast-1 --headers
CROSS_ZONE_LOADBALANCING  CROSSZONE_LOADBALANCING_ENABLED
CROSS_ZONE_LOADBALANCING  false
ACCESS_LOG  ACCESSLOG_ENABLED
ACCESS_LOG  false            
CONNECTION_DRAINING  CONNECTION_DRAINING_ENABLED  CONNECTION_DRAINING_TIMEOUT
CONNECTION_DRAINING  false                        300

以下のようにすると秒数を変更したりできます。

$ elb-modify-lb-attributes okochang-elb --connection-draining "enabled=true, timeout=1800" --region ap-northeast-1 --headers
CONNECTION_DRAINING  CONNECTION_DRAINING_ENABLED  CONNECTION_DRAINING_TIMEOUT
CONNECTION_DRAINING  true                         1800

それではテスト用のダミーファイルをダウンロードします。

$ curl -OL http://okochang-elb-625610288.ap-northeast-1.elb.amazonaws.com/tempfile

ダウンロード途中に以下のようにELBからインスタンスを外してみます。

$ elb-deregister-instances-from-lb okochang-elb --instances i-3a1f443d --region ap-northeast-1 --headers

elb-describe-instance-healthを実行してみると、STATEがInServiceで、DESCRIPTIONがInstance deregistration currently in progress.となっており、ELBから指定された秒数外れるのを待っている状態である事が分かります。

$ elb-describe-instance-health okochang-elb
INSTANCE_ID  INSTANCE_ID  STATE      DESCRIPTION                                     REASON-CODE
INSTANCE_ID  i-3a1f443d   InService  Instance deregistration currently in progress.  N/A

その後、きちんとダウンロードも無事に完了しました。

$ curl -OL http://okochang-elb-625610288.ap-northeast-1.elb.amazonaws.com/tempfile
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  500M  100  500M    0     0  2640k      0  0:03:13  0:03:13 --:--:-- 2974k

Connection Draining無効時

次はConnection Drainingを無効にしてテストします。

$ elb-modify-lb-attributes okochang-elb --connection-draining "enabled=false" --region ap-northeast-1 --headers
CONNECTION_DRAINING  CONNECTION_DRAINING_ENABLED  CONNECTION_DRAINING_TIMEOUT
CONNECTION_DRAINING  false                        300

以下のようにしっかりと無効になってる事を確認しておきます。

$ elb-describe-lb-attributes okochang-elb --region ap-northeast-1 --headers
CROSS_ZONE_LOADBALANCING  CROSSZONE_LOADBALANCING_ENABLED
CROSS_ZONE_LOADBALANCING  false
ACCESS_LOG  ACCESSLOG_ENABLED
ACCESS_LOG  false            
CONNECTION_DRAINING  CONNECTION_DRAINING_ENABLED  CONNECTION_DRAINING_TIMEOUT
CONNECTION_DRAINING  false                        1800

先ほど外したインスタンスをELBに戻しておきます。

$ elb-register-instances-with-lb okochang-elb --instances i-3a1f443d --region ap-northeast-1 --headers
INSTANCE_ID  INSTANCE_ID
INSTANCE_ID  i-3a1f443d

再度テスト用のダミーファイルをダウンロードします。

$ curl -OL http://okochang-elb-625610288.ap-northeast-1.elb.amazonaws.com/tempfile

先ほどと同様にインスタンスをELBから外します。

$ elb-deregister-instances-from-lb okochang-elb --instances i-3a1f443d --region ap-northeast-1 --headers
No instances currently registered to LoadBalancer

今度はすぐにELBから外れました。

$ elb-describe-instance-health okochang-elb
No instances currently registered to LoadBalancer

Connection Drainingを無効時はダウンロードが失敗しました。

$ curl -OL http://okochang-elb-625610288.ap-northeast-1.elb.amazonaws.com/tempfile
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 67  500M   67  337M    0     0  2739k      0  0:03:06  0:02:06  0:01:00 2821k
curl: (18) transfer closed with 170663064 bytes remaining to read

まとめ

無事に期待する動作を確認出来ました。
ELB配下のインスタンスをメンテナンスするときなど、運用時に助かる機能なので重宝しますね。
どうやらすでに作成されているELBはConnection Drainingは無効になってるみたいなのでタイミングを見て有効にしておきたいですね。

その後

AWS CLIでConnection Drainingが使えないなーと悩んでいたら@j3tm0t0さんから以下のようにアドバイス頂きました。



debugオプションをつけてレスポンスが返ってくることと、その後Connection Drainingの情報が取得出来ました!
@j3tm0t0さんありがとうとうございます!

$ aws elb describe-load-balancer-attributes --load-balancer-name okochang-elb --region ap-northeast-1
{
    "LoadBalancerAttributes": {
        "ConnectionDraining": {
            "Enabled": false, 
            "Timeout": 1800
        }, 
        "CrossZoneLoadBalancing": {
            "Enabled": false
        }, 
        "AccessLog": {
            "Enabled": false
        }
    }
}