BeanstalkでAutoScalingとLoadBalancerを使用しているときに、EC2インスタンスがOutOfServiceになったら自動terminate/launchする方法


BeanstalkでAutoScalingとLoadBalancerを使用してEC2インスタンスを稼働する場合の話です。
例えばEC2でApache/Tomcatが動作させ、Tomcatが死んでELBのヘルスチェックで500番台のエラーが返るようになった時、LoadBalancerから異常インスタンスが外れ(OutOfService判定され、通信が届かなくなる)、そのインスタンスがterminateされ、新しいインスタンスが起動し、LoadBalancerに登録されるという動作になって欲しいです。しかし、通常の設定ではLoadBalancerから異常インスタンスが外れるのみで、いつまでたっても異常インスタンスは起動したままになります。
※当然ですがインスタンスを手動でterminateさせれば新しいインスタンスは自動起動します。

AWSのDiscussion Folumでも以前話題になっており、
https://forums.aws.amazon.com/thread.jspa?messageID=413103
これによるとAutoScalingの設定でヘルスチェックタイプがEC2かELBかによって動作が違うとのこと。
タイプがEC2ならばEC2インスタンスがrunningかそれ以外かを監視し、ELBならELBの生死確認に準拠するようです。
Beanstalkを使うとヘルスチェックタイプがEC2になってしまうため、前述のような動作になります。
Beanstalkの管理画面ではその設定を変更できないため、コマンドラインツールを使用して設定を変更する必要があります。

AWSの中の人の回答を参考に、この設定変更の手順をまとめました。
AWS Command Line InterfaceがプリインストールされているAmazonLinuxのインスタンス内での作業を想定しています。

credential.txt を用意する(ファイル名はなんでもいい)

AWSAccessKeyId=AKIAXXXXXXXXXX
AWSSecretKey=xxxxxxxxx

環境変数AWS_CREDENTIAL_FILEにそのファイルパスをセット

$ export AWS_CREDENTIAL_FILE=./credential.txt

Beanstalk管理画面のConfiguration>InstancesからSecurityGroup名を確認する

EC2 security groups: awseb-e-abcdefghi-stack-AWSEBSecurityGroup-ABCDEFGHIJKLM

これの前半部分の-AWSEBまでを使ってAutoScalingGroupを探す。

$ as-describe-auto-scaling-groups --region ap-northeast-1|grep awseb-e-abcdefghi-stack-AWSEB|head -1
AUTO-SCALING-GROUP  awseb-e-abcdefghi-stack-AWSEBAutoScalingGroup-XXXXXXXXXXX   awseb-e-abcdefghi-stack-AWSEBAutoScalingLaunchConfiguration-YYYYYYYYYY  ap-northeast-1c,ap-northeast-1a  awseb-e-g-AWSEBLoa-ZZZZZZZZZZ   2  4  2  Default

⇒AutoScalingGroupはawseb-e-abcdefghi-stack-AWSEBAutoScalingGroup-XXXXXXXXXXXであることがわかります。
追記: EC2管理画面で該当LoadBalancerに登録されているインスタンスのTagにAutoScalingGroupの名前が載っているので、それを利用した方がたぶん早いです。お好みで。

ヘルスチェックタイプの変更

$ as-update-auto-scaling-group awseb-e-abcdefghi-stack-AWSEBAutoScalingGroup-XXXXXXXXXXX --region ap-northeast-1 --health-check-type ELB --grace-period 600
OK-Updated AutoScalingGroup

--grace-period 600はAutoScalingのヘルスチェック開始までの秒数。

これでAutoScaling側のヘルスチェックがELBと連動するようになりました。

---- 修正 ----
ロードバランサーに追加中(OutOfService)にAutoScalingのヘルスチェックが行われてしまうとまずいので、AutoScalingのヘルスチェック周期ヘルスチェック開始までの秒数である --grace-period 60 を --grace-period 600 に変更。ELBのヘルスチェック方法に応じて調整してください。
----
なんか見づらかったのでコマンドと実行結果の枠を分ける。