AWS 替 CodeDeploy 加入 Load balancer 的功能

2017-05-02 AWS

這幾天連假 AWS 默默的替 CodeDeploy 加入了 Load balancer 的功能,然後 5/1 的時候在 Discussion Forums 發佈消息「AWS CodeDeploy now integrates with Elastic Load Balancer 」,隨即文件也更新了 Integrating AWS CodeDeploy with Elastic Load Balancing

 

以往都是在 AppSpec 的 hooks 加上 ApplicationStop / ValidateService 的時候把 ELB 上的 Instance 下上架的動作,用 script 自幹

 

CodeDeploy 的流程加入 Load balancer 後變成這樣:

 

好消息是 CodeDeploy 終於想到這一塊了

壞消息是 CodeDeploy 的 Load balancer 機制竟然要花上 10 分鐘/台 以上

 

5 min, 31 secs 的分別是 BlockTraffic、AllowTraffic,就是卡在 ELB 上,對於這樣的速度如果有 n 台,所花費的時間就是 n*10 分鐘,這樣比起人工還要慢 …

 

已經有人在 Discussion Forums 提出和我相同的問題「BlockTraffic/AllowTraffic durations」,

Currently I have a classic ELB with two EC2 nodes. So, If I do a CodeDeploy OneAtATime, the whole process takes up to 25 minutes.

 

Update:

結果有人測出 CodeDeploy 走 ELB 的規則了

UPDATE: CodeDeploy is dependent on the ELB Health Check settings

 

原來 CodeDeploy 是吃 ELB 的 Health Check 設定

 

如果你的 ELB 設定:

Timeout 5 seconds
Interval 30 seconds
Unhealthy threshold 2
Healthy threshold 10

所以你的 Health Check 時間會是 (Interval (30) +Timeout(5))* healthy (10) = 350 秒,執行過程中會再增加 1~2 秒的執行時間,所以最後呈現的時間通常會是 351 或是 352。

 

然後調成

Timeout 2 seconds
Interval 5 seconds
Unhealthy threshold 2
Healthy threshold 2

跑 BlockTraffic/AllowTraffic 只花 16 秒。

 

 

 

 

2 comments

  1. clifflu 說:

    除了 Health Check 以外,Connection Draining 也是可能(或者 應該)造成延遲的原因。善用 Code Deploy 的 ValidateService hook,合理的降低 healthy threshold (與 ping interval);另外是避免長時間的 TCP / HTTP 連線,並縮短 Draining timeout 才能優雅避免。

    透過 script 自幹也有一樣的問題,第一批在 ValidateService 後如果直接當作成功,並開始處理第二批,則也可能發生只剩第一批在 ELB 後,而且所有機器都未判定為 Healthy 的冏境。

    • shazi7804 說:

      實測 Connection Draining 不會影響 BlockTraffic/AllowTraffic,看起來 CodeDeploy 做的 ELB 沒有參考 Connection Draining 的值

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

彙整

分類

open all | close all

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱