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さんから以下のようにアドバイス頂きました。
@oko_chang --debug するとレスポンスにはちゃんと返ってるようですね。このあたりに足してあげると出ると思われます。 https://t.co/r9FeLqtOjv
— moto (@j3tm0t0) 2014, 3月 23
@oko_chang https://t.co/iRmOcu3aEN を site-packages/botocore/data/aws/elb/ に置いたら、出るようになると思います。
— moto (@j3tm0t0) 2014, 3月 23
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 } } }
参考リンク
- http://aws.typepad.com/aws_japan/2014/03/elb-connection-draining-remove-instances-from-service-with-care.html
- http://aws.amazon.com/jp/about-aws/whats-new/2014/03/20/elastic-load-balancing-supports-connection-draining/
- http://dev.classmethod.jp/cloud/aws/elb-connection-draining/
- http://aws.amazon.com/releasenotes/CLI/8669233270940230
- http://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancer-attributes.html
- http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-conn-drain.html
- https://github.com/aws/aws-cli/blob/develop/CHANGELOG.rst
- http://aws.amazon.com/developertools/Amazon-EC2/2536
- http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_LoadBalancerAttributes.html