負載平衡器:Application Load Balancer(ALB)

寫給耀達 Lite 雲端進銷存的部署討論(2026-10-30)。接續〈資料庫擴充指南〉(db-scaling.html)第 8 節的「②③ 負載平衡器+多個容器」。
前提:AWS 東京、ECS Fargate 用 Express Mode 建立、前面有 CloudFront、後面是 Aurora PostgreSQL。

1. 先講結論

2. ALB 是什麼

用餐廳來比喻:

店家 A 的電腦 店家 B 的手機 店家 C 的平板 ALB 帶位員 容器 1(健康) 容器 2(健康) 容器 3 健康檢查沒過 不派
店家只認得一個網址,後面有幾個容器、哪個壞了,都由 ALB 處理。

「Application」的意思是它看得懂 HTTP:網址路徑、主機名稱、標頭、Cookie 都能拿來決定往哪裡送。只看 IP 和連接埠、不看內容的是另一種負載平衡器(第 13 節)。

3. 耀達 Lite 為什麼需要它

如果只有一個容器、店家直接連到它,下面每一件事都會讓店家看到錯誤畫面:

情境沒有 ALB有 ALB
人變多,ECS 自動多開兩個容器新容器的位址店家不知道,用不到新容器通過健康檢查後自動加入分派
半夜人少,ECS 關掉多的容器正在處理的請求被切斷先停止派新單,等手上的做完再關(第 8 節)
發布新版要停機換版新版容器先上、舊的排空再下,店家不會斷線
某個容器當掉或卡住連到它的店家全部出錯健康檢查發現後不再派單給它,ECS 換一個新的
AWS 東京某一個機房出問題容器剛好在那裡就全掛ALB 跨至少兩個可用區域,另一區的容器繼續服務
HTTPS 憑證每個容器都要裝憑證、自己更新憑證只裝在 ALB,AWS 自動更新

這些就是 db-scaling.html 第 4 節「容器不存狀態」那條規矩的理由:任何一個請求都可能被派到任何一個容器,容器隨時可能被關掉,所以登入狀態、購物車這類東西不能只存在某個容器的記憶體裡。

4. 裡面的四個零件

在 AWS 主控台打開一台 ALB,會看到這幾個名詞:

ALB ① 監聽器 HTTPS 443 ② 規則 主機名稱是 X 路徑是 /api/* ⋯⋯ ③ 目標群組 一群容器 ④ 健康檢查 每 30 秒問一次每個容器 容器 1 容器 2 容器 3 「你還好嗎?」
請求從左邊進來:監聽器收下、規則決定送去哪個目標群組、群組裡挑一個健康的容器。

①監聽器(Listener):在某個連接埠等請求,例如 HTTPS 的 443。HTTPS 憑證就掛在這裡。

②規則(Rule):依照主機名稱、網址路徑、標頭等條件決定送去哪裡,也可以直接回固定內容或轉址。Express Mode 用「主機名稱」來分:同一台 ALB 後面可以掛好幾個服務,各有各的網址(第 10 節)。

③目標群組(Target group):一群做同一件事的容器。ECS 開新容器時自動把它登記進來,關掉時自動移除。

④健康檢查(Health check):定期對每個容器發一個請求,看它還能不能正常回應(第 6 節)。

5. 一個請求走過的路

店家在銷貨單按「存檔」時:

店家 CloudFront ALB 容器 RDS Proxy → Aurora HTTPS HTTPS HTTP 80 網際網路 台灣附近的節點 東京,解開 HTTPS 東京,跑 C# 程式 東京 AWS 內部網路
ALB 和容器之間走的是 AWS 內部網路,Express Mode 預設在這一段用一般 HTTP 的 80 連接埠。
  1. 店家的瀏覽器用 HTTPS 送出請求,先到 CloudFront 在台灣附近的節點。
  2. 存檔這種請求每次內容都不同,CloudFront 不能拿快取回應,於是轉送到東京的 ALB。
  3. ALB 解開 HTTPS,看規則決定要交給哪個目標群組,再從群組裡挑一個健康的容器。
  4. 容器的 C# 程式收到請求,經過 RDS Proxy 寫進 Aurora,把結果原路回傳。

「HTTPS 在 ALB 解開」是什麼意思:加密是為了不讓網路上的人偷看。店家到 ALB 這段要經過網際網路,所以要加密;ALB 到容器這段在 AWS 的私人網路裡,外面的人碰不到,Express Mode 預設就用一般 HTTP。好處是 C# 程式不用管憑證,憑證到期也是 AWS 自動換。

6. 健康檢查

Express Mode 建好的目標群組預設這樣檢查:

設定預設值白話
檢查路徑/對每個容器發 GET /
間隔30 秒每 30 秒問一次
逾時5 秒5 秒內沒回應就算失敗
判定不健康連續 2 次失敗大約 1 分鐘內就不再派單給它
判定恢復健康連續 5 次成功大約 2 分半後重新派單
成功的回應碼200回其他狀態碼都算失敗
新容器的寬限期300 秒剛啟動的 5 分鐘內,健康檢查沒過也不會被 ECS 換掉

容器全部不健康時,ALB 反而全部都派:AWS 稱為 fail open。如果群組裡的容器全都沒通過檢查,ALB 會當作檢查本身出了問題,把請求平均派給所有容器,不是全部擋掉。

這帶出一個設計重點:健康檢查的路徑要很輕,例如專門寫一個 /health,只回「程式還活著」,不要在裡面查資料庫。如果檢查會查資料庫,資料庫一慢,所有容器同時被判不健康,ECS 會開始輪流換容器,問題反而變大。資料庫的狀況交給監控和告警(第 8 題)去看。

7. 怎麼分派:輪流、最少處理中、黏著

方式做法適合
輪流(Round robin,預設)健康的容器依序一人一個每個請求的工作量差不多
最少處理中(Least outstanding requests)派給手上還在處理的請求最少的那個請求的輕重差很多,例如有的開單、有的跑報表
加權隨機(Weighted random)隨機挑,可以搭配「自動降低出錯容器的流量」(ATW)容器偶爾會有一個出狀況、又不至於健康檢查失敗

第一版用預設的輪流就好。等報表變多、監控看到某些容器特別忙,再考慮改成最少處理中,隨時可以改。

黏著(Sticky sessions):耀達 Lite 不需要

ALB 可以發一個 Cookie,讓同一個使用者之後的請求都送到同一個容器。這是給「把登入狀態存在容器記憶體裡」的舊式程式用的。耀達 Lite 的容器不存狀態(db-scaling.html 第 4 節),任何容器都能處理任何請求,所以不開。不開的好處:容器數量變動時,流量馬上就能平均分配。

8. 部署與縮減時:先排空再關掉

容器要被關掉時(發布新版、半夜縮減),ALB 不會直接把它拔掉:

  1. ECS 把容器從目標群組移除,容器進入「排空中」(draining)。
  2. ALB 不再派新的請求給它,但讓它把手上的請求做完。
  3. 手上沒有請求了就完成移除;最多等 300 秒(預設)。
  4. ECS 才送出停止訊號,容器有 30 秒收尾(Express Mode 預設),之後強制關閉。

Express Mode 發布新版用的是金絲雀部署(canary):先讓一小部分流量走新版,沒出錯再全部切過去。Express Mode 另外建一個警報,專門偵測部署出錯。這個部署方式在 Express Mode 裡不能改。

對寫程式的影響:C# 程式收到停止訊號時,要讓手上的請求做完再結束。ASP.NET Core 有內建的關機等待機制,實作時要確認等待時間不超過容器的 30 秒收尾時間(這個搭配還沒實測)。

9. 要小心的限制

閒置逾時預設 60 秒:一條連線超過 60 秒都沒有資料往來,ALB 就切斷它。店家按「匯出全年銷貨明細」,如果伺服器算了 70 秒才開始回傳,店家會看到錯誤。

10. Express Mode 幫忙建好的 ALB

用 Express Mode 建立服務時,AWS 一次建好下面這些,不用自己一個一個設定:

項目Express Mode 的預設
監聽器HTTPS 443,附一張 AWS 自動申請的憑證(給它產生的網址用)
規則依主機名稱分派
公開或內部看給它的子網路:公開子網路就建公開的 ALB,私有子網路就建內部的 ALB
共用同一個 VPC 裡最多 25 個 Express Mode 服務共用一台 ALB,超過才自動多建一台
健康檢查第 6 節的那些預設值
自動擴充CPU 平均維持在 60%;最少 1 個、最多 20 個容器。也可以改成依記憶體或依「每個容器每秒的請求數」(這個數字就是 ALB 量出來的)
部署金絲雀部署,不能改
存取紀錄預設關閉

兩件跟第 7 題「環境與發布」有關的事,這裡先記下,不在這裡決定:

11. ALB 跟 CloudFront 怎麼接

店家的請求要先過 CloudFront(才會經過 WAF 防火牆),再到 ALB。重點是不能讓人繞過 CloudFront 直接打 ALB,不然防火牆形同虛設。有兩種擺法:

甲:公開的 ALB,只收 CloudFront CloudFront 公開 ALB 容器 帶祕密標頭 直接打 ALB 安全群組+祕密標頭擋掉 容器要對外連線: 直接用自己的公開 IP 乙:內部的 ALB,CloudFront 從私有網路連進來(VPC origin) CloudFront 私有子網路(網際網路連不進來) 內部 ALB 容器 容器要對外連線: 要經過 NAT 閘道(另外收費)
甲最接近 Express Mode 用預設 VPC 時的樣子(再補上只收 CloudFront 的設定);乙比較安全,但容器要連外面的服務時多一筆費用。
甲:公開 ALB,只收 CloudFront乙:內部 ALB+VPC origin
怎麼擋繞路ALB 的安全群組只允許 CloudFront 的 IP 範圍;再由 CloudFront 加一個祕密標頭,ALB 規則沒看到就拒絕ALB 根本沒有公開位址,網際網路連不到
為什麼甲還要祕密標頭CloudFront 的 IP 範圍是所有人的 CloudFront 共用的。別人也可以開一個自己的 CloudFront 指向我們的 ALB,只靠 IP 範圍擋不掉,要再檢查只有我們知道的標頭。乙沒有這個問題。
容器連外面的服務(寄信、金流、電子發票、拉程式映像檔)容器有自己的公開 IP,直接連出去私有子網路要另外架 NAT 閘道才能連出去
額外費用ALB 與每個容器的公開 IP,每個每小時 0.005 美元NAT 閘道:第三方整理的東京價格約每小時 0.062 美元(一個月約 45 美元)加每 GB 0.062 美元,未在 AWS 官方頁確認
設定難度Express Mode 預設就接近這樣,再補安全群組與標頭規則要自己規劃 VPC、子網路、NAT

已查證的事實:

未驗證:Express Mode 建的 ALB 只開 HTTPS,憑證是給它自動產生的網址用的。CloudFront 用 VPC origin 或自己的網域連過去時,憑證與主機名稱要怎麼對上,還沒有查到明確的文件,也還沒實測。真正建置前要先試一次,這可能是 Express Mode 跟乙方案之間的接縫。

Claude 的看法(還沒定,留到第 7 題再問):第一版傾向甲。容器一定要連外面的服務(至少寄信、金流),乙每個月多出的 NAT 費用比甲的公開 IP 費用高;甲配上祕密標頭,安全性在第一版夠用,而且最貼近 Express Mode 的預設。等店家數上來、或公司資安要求更嚴時再搬到乙。

12. 費用(東京)

價格取自 AWS 官方價目表(東京 ap-northeast-1),未稅,以美元計:

項目單價一個月(730 小時)
ALB 本身0.0243/小時約 17.7
LCU(用量單位,見下方)0.008/LCU‧小時平均 1 LCU 約 5.8
公開 IPv4 位址(甲方案的 ALB,兩個可用區域至少 2 個)0.005/個‧小時約 7.3
公開 IPv4 位址(甲方案每個容器 1 個)0.005/個‧小時每個約 3.65

LCU 怎麼算

LCU 是「ALB 這一小時忙不忙」的單位,看下面四項,取用量最高的那一項計費:

項目1 LCU 等於
新連線每秒 25 條
同時連線每分鐘 3,000 條
處理的資料量每小時 1 GB(容器當目標時)
規則判斷每秒 1,000 次;前 10 條規則免費,規則不超過 10 條時這項不算

耀達 Lite 第一版(試用到幾百家店),平均通常不到 1 LCU,表上用 1 LCU 算是偏高的估計。

粗估:甲方案、兩個容器時,ALB 相關每月約 17.7+5.8+7.3+7.3 ≈ 38 美元。實際數字等月費試算時用 AWS Pricing Calculator 一起算。

免費額度:價目頁同時寫著舊制(每月 750 小時+15 LCU)和 2025-07-15 之後的新制(新帳號最多 200 美元抵用額度)。適用哪一種要看公司 AWS 帳號何時開,不要先算進去。

13. AWS 的其他負載平衡器

種類看什麼適合耀達 Lite
Application Load BalancerHTTP 內容:網址、主機名稱、標頭網站、API用這個(Express Mode 固定用它)
Network Load Balancer只看 IP 與連接埠,不看 HTTP 內容極高流量、需要固定 IP、非 HTTP 的協定用不到
Gateway Load Balancer把流量導去防火牆設備檢查自己架網路資安設備用不到
Classic Load Balancer舊世代舊系統不要用

API Gateway 也能擋在程式前面,但它比較適合搭 Lambda;耀達 Lite 用的是常駐容器,ALB 比較直接,也是 Express Mode 的固定組合。

14. 名詞對照

名詞白話
負載平衡器(Load Balancer)把請求分給多台伺服器或容器的接待員
監聽器(Listener)在某個連接埠等請求的入口,HTTPS 憑證掛在這裡
規則(Rule)決定請求要送去哪個目標群組的條件
目標群組(Target group)一群做同一件事的容器
健康檢查(Health check)定期問每個容器「你還好嗎」
排空(Draining)不再派新請求、等手上的做完
黏著(Sticky session)同一個使用者固定送到同一個容器;耀達 Lite 不用
可用區域(Availability Zone)同一個地區裡互相獨立的機房
安全群組(Security group)AWS 的防火牆規則,決定誰能連進來
VPC/子網路公司在 AWS 裡自己的私人網路,再切成幾塊
VPC origin讓 CloudFront 從私人網路直接連到內部 ALB 的功能
NAT 閘道讓私有子網路裡的容器可以連出去、外面卻連不進來的出口
LCUALB 的用量計費單位
金絲雀部署(Canary)先讓一小部分流量試新版,沒問題才全部切換

15. 來源