Amazon-Elb

為什麼我的實例通過 Ansible 添加到負載均衡器時 ELB 執行狀況檢查失敗?

  • September 23, 2015

我正在嘗試使用帶有模組的 Ansible 劇本將 EC2 實例添加到彈性負載均衡ec2_elb器。這是應該執行此操作的任務:

- name: "Add host to load balancer {{ load_balancer_name }}"
 sudo: false
 local_action:
   module: ec2_elb
   state: present
   wait: true
   region: "{{ region }}"
   ec2_elbs: ['{{ load_balancer_name }}']
   instance_id: "{{ ec2_id }}"

但是,它通常會失敗,並出現以下輸出(出現冗長):

TASK: [Add host to load balancer ApiELB-staging] ****************************** 
<127.0.0.1> REMOTE_MODULE ec2_elb region=us-east-1 state=present instance_id=i-eb7e0cc7
<127.0.0.1> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1409156786.81-113716163813868 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1409156786.81-113716163813868 && echo $HOME/.ansible/tmp/ansible-tmp-1409156786.81-113716163813868']
<127.0.0.1> PUT /var/folders/d4/17fw96k107d5kbck6fb2__vc0000gn/T/tmpki4HPF TO /Users/pkaeding/.ansible/tmp/ansible-tmp-1409156786.81-113716163813868/ec2_elb
<127.0.0.1> EXEC ['/bin/sh', '-c', u'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /Users/pkaeding/.ansible/tmp/ansible-tmp-1409156786.81-113716163813868/ec2_elb; rm -rf /Users/pkaeding/.ansible/tmp/ansible-tmp-1409156786.81-113716163813868/ >/dev/null 2>&1']
failed: [10.0.115.149 -> 127.0.0.1] => {"failed": true}
msg: The instance i-eb7e0cc7 could not be put in service on LoadBalancer:ApiELB-staging. Reason: Instance has not passed the configured HealthyThreshold number of health checks consecutively.

FATAL: all hosts have already failed -- aborting

我有這樣定義的 ELB 配置(也通過 Ansible):

- name: "Ensure load balancer exists: {{ load_balancer_name }}"
 sudo: false
 local_action:
   module: ec2_elb_lb
   name: "{{ load_balancer_name }}"
   state: present
   region: "{{ region }}"
   subnets: "{{ vpc_public_subnet_ids }}"
   listeners:
     - protocol: https
       load_balancer_port: 443
       instance_protocol: http
       instance_port: 8888
       ssl_certificate_id: "{{ ssl_cert }}"
   health_check:
       ping_protocol: http # options are http, https, ssl, tcp
       ping_port: 8888
       ping_path: "/internal/v1/status"
       response_timeout: 5 # seconds
       interval: 30 # seconds
       unhealthy_threshold: 10
       healthy_threshold: 10
 register: apilb

當我從筆記型電腦或伺服器本身(作為本地主機)訪問狀態資源時,我得到了200預期的響應。在將實例添加到 ELB 之前,我還在commandAnsible 劇本中添加了一個任務,以確認應用程序已啟動並正確處理請求(確實如此):

- command: /usr/bin/curl -v --fail http://localhost:8888/internal/v1/status

在我的應用程序的日誌中,我沒有看到任何針對狀態檢查資源的非 200 響應(當然,如果請求從未到達我的應用程序,它們將不會被記錄)。

另一個奇怪的事情是實例確實被添加到了 ELB,而且它似乎工作正常。所以我知道,至少在某個時候,負載均衡器可以正確訪問應用程序(對於狀態檢查資源和其他資源)。AWS 控制台顯示實例執行狀況良好,Cloudwatch 圖表未顯示任何失敗的執行狀況檢查。

有任何想法嗎?

改編自我之前的評論:

從 Ansible 文件來看,有一個wait_timeout參數必須設置為高於 300 才能使其工作。(330 是安全的)。

或者你可以降低你的intervalhealthy_threshold兩者,這樣你就必須等待不到 300 秒。

Yourunhealthy_threshold與 相同healthy_threshold,因此一旦 Web 伺服器開始拋出 500 個響應,它將在 ELB 丟棄之前在池中停留 5 分鐘。

您可以使用 ec2_elb 選項wait: no

引用自:https://serverfault.com/questions/624495