EC2 インスタンスを Amazon ELB に登録するデプロイ スクリプト (具体的には、Ansible モジュール) に取り組んでいます。スクリプトは Boto ライブラリを使用します。
スクリプトの関連部分を次に示します。
def register(self, wait):
"""Register the instance for all ELBs and wait for the ELB
to report the instance in-service"""
for lb in self.lbs:
lb.register_instances([self.instance_id])
if wait:
self._await_elb_instance_state(lb, 'InService')
def _await_elb_instance_state(self, lb, awaited_state):
"""Wait for an ELB to change state
lb: load balancer
awaited_state : state to poll for (string)"""
while True:
state = lb.get_instance_health([self.instance_id])[0].state
if state == awaited_state:
break
else:
time.sleep(1)
(ところで、上記のコードは Ansible のec2_elb モジュールからのものです。)
そのため、インスタンスが最初に登録されたときは「OutOfService」です。ここのスクリプトは、インスタンスがヘルスチェックなどに合格した後、インスタンスが「サービス中」の状態になるのを「待機」します。
ここに問題があります。上記のプロセスは単純すぎます (これが、私が自分の目的に合わせてモジュールをカスタマイズしようとしている理由です)。私が遭遇した主な問題は、インスタンスが存在するアベイラビリティーゾーンにサービスを提供するようにロードバランサーが構成されていない場合、インスタンスがサービスを停止したままになることです。基本的に、上記のスクリプトはハングアップします。
私がやりたいこと (そしてそれが、この組み込みモジュールをカスタマイズしている理由です) は、ELB がインスタンスがヘルスチェックに合格するのを待っているだけなのか、それとも他の理由があるのか (たとえば、未登録のアベイラビリティ ゾーン) がサービス停止の原因となっています。
Boto ライブラリ (Amazon ELB API 経由) は、状態よりもわずかに詳細な情報を提供します。次のように、Boto ドキュメント(およびAmazon ELB API ドキュメント) で説明されている「reason」属性があります。
reason_code (str) – OutOfService インスタンスの原因に関する情報を提供します。具体的には、原因が Elastic Load Balancing にあるのか、それとも LoadBalancer の背後にあるインスタンスにあるのかを示します。
reason_code 属性に関するドキュメントが不足しているため、a) 返される可能性のある値がここにあることを期待できるかどうか、b) 私の質問に関連してそれらが実際に何を意味するかはわかりませんその上。
Amazon が管理コンソールでインスタンスがサービスを停止している詳細な理由を表示できることを考えると、私がやりたいことは実行可能だと思います。
では、インスタンスのステータスの背後にあるより詳細な理由をどこでどのように見つけることができますか?