1

我正在编写一个向 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。

那么如何/在哪里可以找到实例状态背后的更详细原因?

4

1 回答 1

1

啊,这是InstanceState的描述字段:

description (str) -- 实例的描述。

我想那太模糊了,以至于我的大脑忽略了它。

看起来可能state是两个字符串值:

  • 'ELB'
  • '实例'

那只是在玩弄 API;这不是确定的或任何东西。

于 2013-09-13T17:10:53.193 回答