我正在编写一个向 Amazon ELB 注册 EC2 实例的部署脚本(更具体地说,是一个 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”。此处的脚本“等待”实例在通过健康检查等后达到状态“InService”。
所以这就是问题所在:上面的过程过于简单(这就是为什么我试图为自己的目的定制模块)。我遇到的主要问题是,如果负载均衡器未配置为为实例所在的可用区提供服务,那么该实例将保持停止服务。基本上上面的脚本只会挂起。
我想做的(这就是我定制这个内置模块的原因)是找到一种方法来确定 ELB 是否只是在等待实例通过运行状况检查,或者是否有其他原因(比如未注册的可用区),这导致它仍然无法使用。
Boto 库(通过 Amazon ELB API)确实提供了比状态略多的细节:它有一个“原因”属性,在 Boto 文档(以及Amazon ELB API 文档)中描述如下:
reason_code (str) – 提供有关 OutOfService 实例原因的信息。具体来说,它指示原因是 Elastic Load Balancing 还是 LoadBalancer 背后的实例。
关于 reason_code 属性的文档很少我可以在那里找到,所以我不确定 a)我可以期望可能的返回值甚至在这里,以及 b)它们与我的问题相关的实际含义以上。
我认为我想做的事情是可行的,因为亚马逊能够显示一个实例停止服务的详细原因是管理控制台——据我所知,他们正在那里测试他们的 API。
那么如何/在哪里可以找到实例状态背后的更详细原因?