background image

Dec 10 2022

非靜態網站使用AWS做金絲雀部署

在佔新作改版時,我們會希望可以先讓一部分使用者先做測試而不是將使用者一次更新。在AWS透過ELB接收網路流量到後面的Container的流量設定該怎麼做呢? 另外我們還希望可以做到如同AWS的新舊版本可以讓使用者自由的切換,這個該又如何處理這樣的需求呢?

什麼是金絲雀部署?

金絲雀部署的劉來是在礦工下礦坑時會先讓金絲雀飛進礦坑中,倘若金絲雀沒有了叫聲,表示礦坑底下的瓦斯濃度或是其他氣體濃度太高,礦工下礦坑就會有生命危險。 金絲雀部署也有其他名稱如:礦工部署與灰度部署

系統架構配置

當使用者進入系統時,有90%的流量進入了Old Version中另外有10%的流量進入New Version

AWS system architecture
AWS system architecture

Load balancer的設定

在ELB中的設定呢分成兩個區塊,首先在主要的Rule設定上的Forward to中設定兩個target group,權重設定分配比例按照9:1的設定,Group-level stickiness要設定多久後要將重新做分配,就可以自動的建立金絲雀部署了

第一個TG設定
第一個TG設定

但想要想可以自求的切換版本那只單純設定一條rule是不夠的!原因是因為Next.js的靜態檔案ex: js, css 靜態檔案的路徑是_next/static/{BUILD_ID},所以要針對這樣的路徑多設定兩個不同的rule來做指向 所以ELB的設定要多一個Path的條件,match了build id 才能導向該Container,這樣每次部署只要更新相對應的路徑就可以了!

還需要再多一個設定,那就是切換舊版後需要一個條件讓使用者可以導向舊版的網站,所以這邊可以使用Query string或是Header的值來做判斷導向哪一個Target group中

以前實作時,Next.js產生靜態檔案的路徑是_next/{BUILD_ID}

文章標籤