很多人第一次建 Target Group 時都會卡在這一步:「為什麼要我選 VPC?」
這問題看起來很小,但其實搞懂它,你對整個 AWS 負載平衡的理解會清楚很多。
這篇文章用白話文帶你搞懂這件事,不講太多理論,直接告訴你「為什麼」跟「怎麼做」。
先搞懂這三個東西是什麼
在講重點之前,先搞懂三個主角。這段有點長,但基礎打好,後面會看得很順。
整體架構圖
先看一下這三個東西怎麼串在一起:
flowchart LR
subgraph Internet
User[👤 用戶請求]
end
subgraph AWS
subgraph VPC["🔒 VPC(私人網路)"]
LB[🔀 Load Balancer<br/>流量分配器]
TG[📋 Target Group<br/>後端伺服器名單]
subgraph Targets[Targets]
EC2_1[🖥️ EC2-1<br/>10.0.1.10]
EC2_2[🖥️ EC2-2<br/>10.0.1.11]
EC2_3[🖥️ EC2-3<br/>10.0.1.12]
end
LB -->|2.查名單| TG
TG -->|3.健康檢查| Targets
LB -->|4.轉發流量| EC2_1
LB -.->|備用| EC2_2
LB -.->|備用| EC2_3
end
end
User -->|1.發送請求| LB
style VPC fill:#e8f4ea,stroke:#2d6a4f
style TG fill:#fff3cd,stroke:#856404
style LB fill:#cce5ff,stroke:#004085流程說明:
- 用戶發請求 → 打到 Load Balancer
- Load Balancer 查 Target Group → 看誰可以接
- Target Group 做健康檢查 → 確認機器活著
- 轉發流量 → 丟給健康的 EC2
重點是:Target Group 和它管理的機器,都在同一個 VPC 裡面。
這就是為什麼建 Target Group 要選 VPC。
VPC:你在 AWS 上的私人網路
VPC 是什麼?
VPC(Virtual Private Cloud)就是你在 AWS 上租的一塊「私人網段」。你可以想像成:AWS 有一棟超大的資料中心大樓,VPC 就是你在裡面隔出來的一間獨立辦公室,有自己的門禁和內部網路。
VPC 裡面有什麼?
你在 AWS 上建的大部分東西,都是放在 VPC 裡面的:
- EC2:虛擬機器
- RDS:資料庫
- ECS / EKS:容器服務
- Lambda(如果設定連接 VPC 的話)
- ElastiCache:快取服務
VPC 的幾個重要特性
| 特性 | 說明 |
|---|---|
| 獨立 IP 範圍 | 每個 VPC 可以自己定義 CIDR,像是 10.0.0.0/16 |
| 預設隔離 | 不同 VPC 之間,預設是不互通的 |
| 可以切子網路 | 一個 VPC 裡面可以再切 Subnet(公有、私有) |
| 有自己的路由表 | 控制流量怎麼走 |
| 有自己的安全規則 | Security Group、NACL |
為什麼這很重要?
因為你的機器(EC2)會拿到一個 Private IP,這個 IP 是「屬於某個 VPC」的。
同樣是 10.0.1.10,在 VPC-A 跟 VPC-B 可能是完全不同的兩台機器。
所以當 AWS 要連到你的機器時,光知道 IP 不夠,還要知道是哪個 VPC。
Target Group:後端伺服器的名單
Target Group 是什麼?
Target Group 就是一份「誰可以接收流量」的清單。
Load Balancer 會看這份清單,把請求分給上面的機器。
你可以把它想成餐廳的「服務生排班表」:
- 排班表上有哪些服務生(Target)
- 每個服務生目前有沒有空(健康狀態)
- 經理(Load Balancer)根據排班表派任務
Target Group 可以放什麼?
| Target 類型 | 說明 | 常見用途 |
|---|---|---|
| EC2 Instance | 直接指定 EC2 機器 | 傳統網站架構 |
| IP 位址 | 手動輸入 Private IP | 跨 VPC、地端機器 |
| Lambda | 無伺服器函數 | API、輕量服務 |
| ALB | 另一個 Load Balancer | 多層架構 |
Target Group 會做什麼事?
- 記錄 Target 清單:知道有哪些機器可以接請求
- 健康檢查:定期去 ping 每台機器,確認還活著
- 回報狀態:告訴 Load Balancer 哪些機器是健康的
- 設定分流規則:比如權重、Sticky Session 等
健康檢查是什麼意思?
Target Group 會定期(預設 30 秒)發一個請求到你的機器,看它有沒有正常回應。
像這樣:
Target Group → 發 HTTP GET /health → EC2
EC2 → 回 200 OK → Target Group 標記為 healthy
EC2 → 沒回應或回 500 → Target Group 標記為 unhealthy只有 healthy 的機器才會收到真正的用戶流量。
Load Balancer:流量分配器
Load Balancer 是什麼?
Load Balancer(負載平衡器)就是一個「流量分配員」。它站在最前面,接收所有進來的請求,然後根據規則分給後面的伺服器。
為什麼需要 Load Balancer?
想像你開了一家很紅的飲料店:
- 只有一個店員 → 排隊排到死
- 有五個店員 → 客人分散處理,速度快很多
- Load Balancer 就是那個「叫號機」,幫你把客人分給不同店員
好處:
- 分散流量:不會讓單一機器被打爆
- 高可用:一台掛了,還有其他台可以用
- 彈性擴展:流量大就多開幾台,流量小就關掉
AWS 有幾種 Load Balancer?
| 類型 | 全名 | 運作層級 | 適合場景 |
|---|---|---|---|
| ALB | Application Load Balancer | Layer 7(HTTP) | 網站、API、微服務 |
| NLB | Network Load Balancer | Layer 4(TCP/UDP) | 遊戲伺服器、高效能需求 |
| GLB | Gateway Load Balancer | Layer 3 | 防火牆、流量檢測設備 |
大部分的網站用 ALB 就夠了。
Load Balancer 跟 Target Group 的關係
這兩個是搭配使用的:
用戶請求 → Load Balancer → 查 Target Group → 找到健康的機器 → 轉發請求Load Balancer 本身不知道後面有哪些機器,它是透過 Target Group 來知道的。
一個 Load Balancer 可以配多個 Target Group(根據路徑或 Host 分流),但每個 Target Group 只能屬於一個 VPC。
為什麼建 Target Group 要選 VPC?
簡單講:因為你的機器就在 VPC 裡面
你放進 Target Group 的 EC2、容器這些東西,本來就是部署在某個 VPC 裡面的。
AWS 需要知道「這些機器在哪個網段」,才能正確地把流量送過去。
這就像寄包裹一樣:光知道收件人叫「王小明」不夠,你還要知道他住哪個社區、哪棟樓、哪個門牌號。
VPC 就是那個「社區地址」,Private IP 就是「門牌號」。
更具體一點,Target Group 要做三件事
📍 找到你的機器在哪
問題:Private IP 不是全球唯一的
每台 EC2 都有一個 Private IP,但這個 IP 是私有的,只在那個 VPC 裡面有效。
看這個例子:
| VPC | 機器 | Private IP |
|---|---|---|
| vpc-aaa | web-01 | 10.0.1.10 |
| vpc-bbb | db-01 | 10.0.1.10 |
兩台完全不同的機器,卻有一模一樣的 IP!這在 AWS 是完全合法的,因為 Private IP 只要在自己的 VPC 裡不重複就好。
所以 AWS 需要 VPC 資訊
當 Target Group 要連到 10.0.1.10,它必須知道是 vpc-aaa 的還是 vpc-bbb 的,不然會連到錯的機器。
🩺 做健康檢查
健康檢查的運作方式
Load Balancer 會定期(預設每 30 秒)對 Target Group 裡的每台機器做健康檢查,確認它們還活著、能正常服務。
flowchart TB
subgraph VPC["🔒 VPC(私人網路)"]
LB["🔀 Load Balancer"]
TG["📋 Target Group"]
LB --- TG
TG -->|"健康檢查"| EC2_1
TG -->|"健康檢查"| EC2_2
TG -->|"健康檢查"| EC2_3
EC2_1["🖥️ EC2-1<br/>10.0.1.10<br/>✅ Healthy"]
EC2_2["🖥️ EC2-2<br/>10.0.1.11<br/>✅ Healthy"]
EC2_3["🖥️ EC2-3<br/>10.0.1.12<br/>❌ Unhealthy"]
end
Note["💡 健康檢查走 VPC 內部網路"]
style VPC fill:#e8f4ea,stroke:#2d6a4f
style EC2_1 fill:#d4edda,stroke:#155724
style EC2_2 fill:#d4edda,stroke:#155724
style EC2_3 fill:#f8d7da,stroke:#721c24
style Note fill:#fff3cd,stroke:#856404健康檢查的細節設定
| 設定項目 | 說明 | 常見設定 |
|---|---|---|
| Protocol | 用什麼協定檢查 | HTTP、HTTPS、TCP |
| Path | 檢查哪個路徑 | /health、/ping、/api/health |
| Port | 檢查哪個 Port | 80、443、8080 |
| Interval | 多久檢查一次 | 30 秒 |
| Timeout | 等多久沒回應算失敗 | 5 秒 |
| Healthy threshold | 連續幾次成功算健康 | 2 次 |
| Unhealthy threshold | 連續幾次失敗算不健康 | 3 次 |
為什麼健康檢查需要知道 VPC?
因為健康檢查是走 VPC 內部的私有網路,不是走公網。
這表示:
- Load Balancer 要能在 VPC 裡面路由到 Target 的 Private IP
- 安全群組(Security Group)要允許健康檢查的流量進來
- 這一切都只在指定的 VPC 裡面發生
如果不知道 VPC,根本不知道要從哪裡發健康檢查、走哪條網路路徑。
🔁 轉發流量
流量怎麼從 Load Balancer 到 EC2?
當真正的用戶請求進來,Load Balancer 要把流量轉發給後端的 EC2。
這個轉發過程:
flowchart LR
subgraph Internet["🌐 Internet"]
User["👤 用戶"]
end
subgraph VPC["🔒 VPC"]
subgraph PublicSubnet["📤 Public Subnet"]
LB["🔀 Load Balancer<br/>公網 IP: 54.xx.xx.xx"]
end
subgraph PrivateSubnet["📥 Private Subnet"]
EC2_1["🖥️ EC2-1<br/>Private IP: 10.0.1.10"]
EC2_2["🖥️ EC2-2<br/>Private IP: 10.0.1.11"]
end
RT["🔀 Route Table<br/>VPC 內部路由"]
end
User -->|"1️⃣ 請求打到公網 IP"| LB
LB -->|"2️⃣ 查 Route Table"| RT
RT -->|"3️⃣ 走 VPC 內網"| EC2_1
RT -.->|"備用路徑"| EC2_2
style Internet fill:#ffe6e6,stroke:#cc0000
style PublicSubnet fill:#cce5ff,stroke:#004085
style PrivateSubnet fill:#e8f4ea,stroke:#2d6a4f
style VPC fill:#f5f5f5,stroke:#666666流程說明
- 用戶請求打到 Load Balancer 的公網 IP(在 Public Subnet)
- Load Balancer 查 Route Table,找到目標 EC2 的路徑
- 流量透過 VPC 內部網路 轉發到 Private Subnet 的 EC2
💡 重點:第 2、3 步都是走 VPC 內網,不會繞到外面去,所以速度快、延遲低。
轉發流量需要的網路元件
| 元件 | 作用 | 跟 VPC 的關係 |
|---|---|---|
| ENI(Elastic Network Interface) | Load Balancer 用來發送流量的網卡 | 建在 VPC 的 Subnet 裡 |
| Route Table | 決定流量怎麼走 | 每個 VPC / Subnet 都有自己的 |
| Security Group | 控制什麼流量可以進出 | 綁定在 VPC 裡的資源上 |
所以 VPC 資訊不可或缺
Load Balancer 需要知道 Target 在哪個 VPC,才能:
- 在對的 VPC 裡建立 ENI
- 透過對的 Route Table 找到 Target
- 確保 Security Group 允許流量通過
舉個完整的例子
假設你有兩台 EC2 當 web server:
| 機器 | Private IP | VPC | Subnet | Security Group |
|---|---|---|---|---|
| web-01 | 10.0.1.10 | vpc-aaa | subnet-public-1a | sg-web |
| web-02 | 10.0.1.11 | vpc-aaa | subnet-public-1b | sg-web |
建 Target Group 時選 vpc-aaa,會發生什麼事?
1. Target Group 知道去哪裡找機器
- 去
vpc-aaa裡面找10.0.1.10和10.0.1.11 - 不會跑去其他 VPC 亂找
2. 健康檢查可以正確執行
- Load Balancer 在
vpc-aaa裡面發 HTTP GET 請求 - 走 VPC 內部網路到達 EC2
- 透過
sg-webSecurity Group 進入
3. 流量轉發有正確路徑
- 用戶請求進來 → Load Balancer 收到
- 查 Target Group → 發現 web-01 和 web-02 都健康
- 透過
vpc-aaa的內部路由 → 把流量丟給其中一台
如果你不選 VPC 會怎樣?
AWS 不讓你這樣做。建 Target Group 時 VPC 是必填欄位,因為:
10.0.1.10可能存在於好幾個 VPC- 不知道 VPC 就不知道網路路徑
- 健康檢查和流量轉發都會失敗
一個 Target Group 只能配一個 VPC(以及怎麼繞過這個限制)
AWS 的硬規定:一個 Target Group 只能綁一個 VPC
這是 AWS 的設計限制,沒有例外。當你建立 Target Group 時,選了 vpc-aaa,就只能放 vpc-aaa 裡面的機器,不能混著放 vpc-bbb 的機器進去。
在 Console 上長這樣:
建立 Target Group
├── Target Group 名稱:my-web-targets
├── Target Type:Instance
├── VPC:vpc-aaa ← 選了就不能改,也不能選多個
└── ...為什麼 AWS 要這樣限制?
很多人會覺得這個限制很煩,但其實背後有很實際的原因:
原因一:健康檢查會變得超複雜
假設 AWS 允許你把 vpc-aaa 和 vpc-bbb 的機器放在同一個 Target Group:
flowchart LR
subgraph VPC_A["VPC-A"]
LB["Load Balancer"]
EC2_A["EC2-A<br/>10.0.1.10"]
end
subgraph VPC_B["VPC-B"]
EC2_B["EC2-B<br/>10.0.2.20"]
end
LB -->|"健康檢查 ✅ 簡單"| EC2_A
LB -.->|"健康檢查 ❓ 怎麼過去?"| EC2_B
style VPC_A fill:#e8f4ea,stroke:#2d6a4f
style VPC_B fill:#fff3cd,stroke:#856404問題來了:
- Load Balancer 在
vpc-aaa,要怎麼 ping 到vpc-bbb的機器? - 兩個 VPC 預設是隔離的,網路不通
- 你要先設定 VPC Peering 或 Transit Gateway
- 還要改 Route Table、Security Group…
- 萬一設錯,健康檢查就失敗,流量就斷了
AWS 乾脆不讓你這樣做,省得你踩坑。
原因二:效能會變差
VPC 內部的網路是最快的,延遲通常在 0.1ms 以下。
但如果跨 VPC:
| 路徑 | 延遲 | 說明 |
|---|---|---|
| 同 VPC 內 | < 0.1ms | 直接走內部網路 |
| 跨 VPC(同 Region) | 1-2ms | 要經過 Peering 或 Transit Gateway |
| 跨 VPC(跨 Region) | 10-100ms+ | 要走跨區域的骨幹網路 |
對於高流量的網站來說,這個延遲差異會累積起來,影響用戶體驗。
原因三:管理會變成噩夢
如果允許跨 VPC,你要處理的東西:
| 項目 | 同 VPC | 跨 VPC |
|---|---|---|
| Security Group | 設一組就好 | 兩邊都要設,還要互相允許 |
| Route Table | 預設就通 | 要手動加路由 |
| NACL | 通常不用管 | 兩邊都要確認沒擋到 |
| 除錯難度 | 低 | 高(不知道是哪邊的問題) |
AWS 限制在同一個 VPC,就是幫你省掉這些麻煩。
那如果我真的需要跨 VPC 怎麼辦?
有時候你的架構就是分散在不同 VPC,比如:
- 公司併購,兩邊的系統在不同 VPC
- 微服務架構,每個服務有自己的 VPC
- 開發/測試/正式環境分開在不同 VPC
這時候有兩種做法:
做法一:用 IP 類型的 Target(土砲但有效)
概念
不用 Instance 類型,改用 IP 類型的 Target。這樣你可以手動輸入任何 IP,包括其他 VPC 的機器。
步驟
- 建 Target Group 時,Target Type 選
ip(不是instance) - 手動輸入另一個 VPC 中 EC2 的 Private IP
- 但是!網路要先打通
網路打通的 checklist
| 步驟 | 要做什麼 | 為什麼 |
|---|---|---|
| 1 | 建 VPC Peering 或 Transit Gateway | 讓兩個 VPC 的網路可以互通 |
| 2 | 改 Route Table | 告訴流量:「要去 10.0.2.0/24 的話,走 Peering 那條路」 |
| 3 | 改 Security Group | 允許 Load Balancer 的 IP 或 Security Group 進來 |
| 4 | 確認 NACL 沒擋到 | Subnet 層級的防火牆,有時候會偷偷擋掉流量 |
架構圖
flowchart LR
subgraph VPC_A["VPC-A"]
LB["Load Balancer"]
TG["Target Group<br/>(IP 類型)"]
EC2_A["EC2-A<br/>10.0.1.10"]
end
subgraph VPC_B["VPC-B"]
EC2_B["EC2-B<br/>10.0.2.20"]
end
Peering["🔗 VPC Peering<br/>或 Transit Gateway"]
LB --> TG
TG --> EC2_A
TG -.->|"跨 VPC"| Peering
Peering -.-> EC2_B
style VPC_A fill:#e8f4ea,stroke:#2d6a4f
style VPC_B fill:#cce5ff,stroke:#004085
style Peering fill:#fff3cd,stroke:#856404優點
- 不用改太多架構
- 現有的 Load Balancer 可以繼續用
缺點
- IP 要自己管,EC2 換了 IP 你要手動更新
- 沒有 Auto Scaling 的自動註冊功能
- 網路設定比較複雜,出錯不好除錯
做法二:用 PrivateLink 或 API Gateway(乾淨但成本高)
概念
不要硬把不同 VPC 的機器塞進同一個 Target Group。改成每個 VPC 各自建立服務,然後用 PrivateLink 或 API Gateway 串起來。
架構圖
flowchart TB
User["👤 用戶"]
subgraph Main["主要 VPC"]
APIGW["🌐 API Gateway<br/>或 ALB"]
end
subgraph VPC_A["VPC-A"]
LB_A["ALB-A"]
TG_A["Target Group A"]
EC2_A["EC2-A"]
Endpoint_A["🔌 VPC Endpoint"]
end
subgraph VPC_B["VPC-B"]
LB_B["ALB-B"]
TG_B["Target Group B"]
EC2_B["EC2-B"]
Endpoint_B["🔌 VPC Endpoint"]
end
User --> APIGW
APIGW -->|"PrivateLink"| Endpoint_A
APIGW -->|"PrivateLink"| Endpoint_B
Endpoint_A --> LB_A --> TG_A --> EC2_A
Endpoint_B --> LB_B --> TG_B --> EC2_B
style Main fill:#ffe6e6,stroke:#cc0000
style VPC_A fill:#e8f4ea,stroke:#2d6a4f
style VPC_B fill:#cce5ff,stroke:#004085這樣做的好處
| 優點 | 說明 |
|---|---|
| 🔒 安全隔離 | 每個 VPC 的服務獨立,不用開太多防火牆規則 |
| 📈 各自 Scale | 每個服務可以獨立擴展,互不影響 |
| 🔧 好管理 | 出問題時,範圍比較好切割 |
| 🚀 彈性高 | 之後要加新服務,直接建新的 VPC + Endpoint |
缺點
| 缺點 | 說明 |
|---|---|
| 💰 成本較高 | 每個 VPC Endpoint 都要收費(約 $7/月 + 流量費) |
| 🏗️ 架構複雜 | 元件變多,要管的東西也多 |
| ⏱️ 初期設定費時 | 第一次建會花比較多時間 |
兩種做法怎麼選?
| 情況 | 建議做法 |
|---|---|
| 臨時要串兩個 VPC | IP 類型 Target + VPC Peering |
| 長期的微服務架構 | PrivateLink + API Gateway |
| 預算有限 | IP 類型 Target |
| 追求乾淨的架構 | PrivateLink |
| 機器數量少、不常變動 | IP 類型 Target |
| 機器數量多、常常 Scale | PrivateLink(避免手動管 IP) |
Target Type 有三種,搞清楚差別
建 Target Group 時要選 Target Type,這邊快速講一下三種的差別:
Instance 類型
特性
- 用在 EC2
- 直接選 Instance ID 就好
- 一定要跟 Target Group 在同一個 VPC
適合場景
傳統的網站架構,EC2 數量固定或用 Auto Scaling Group 管理。
IP 類型
特性
- 可以是任何 Private IP
- 手動輸入 IP 位址
- 可以跨 VPC(但網路要自己打通)
適合場景
跨 VPC 架構、連接地端機器、或是 ECS awsvpc 網路模式。
Lambda 類型
特性
- 用在無伺服器架構
- 選 Lambda 函數就好
- 沒有 VPC 限制
適合場景
輕量級 API、Webhook、或是不想管伺服器的場景。
常見問題快問快答
因為你的機器在 VPC 裡面,AWS 要知道去哪裡找它們、怎麼做健康檢查、怎麼送流量。
不行,一個 Target Group 只能配一個 VPC。
直接跨不行。但如果用 IP 類型的 Target,再加上 VPC Peering 或 Transit Gateway,就可以間接做到。
幾個選項:
– 每個 VPC 各自建 Load Balancer 和 Target Group
– 用 Transit Gateway 把 VPC 都連起來,用 IP 類型 Target
– 用 API Gateway 整合所有服務
Security Group 記得開
常見的坑
Target Group 的健康檢查會從 Load Balancer 打過來,記得在 EC2 的 Security Group 開放對應的 port。
最常見的坑:健康檢查一直失敗,結果是 Security Group 沒開。
怎麼設定
在 EC2 的 Security Group 加一條:
| Type | Protocol | Port | Source |
|---|---|---|---|
| Custom TCP | TCP | 80(或你的應用 port) | Load Balancer 的 Security Group |
健康檢查路徑別亂設
為什麼重要
如果你用 HTTP 健康檢查,記得設一個專門的路徑,像是 /health 或 /ping。不要用 / 首頁,因為首頁可能會重導向或需要登入,導致健康檢查失敗。
好的健康檢查端點應該
- 回傳 200 OK
- 不需要登入驗證
- 回應速度快(不要做太多運算)
- 可以順便檢查資料庫連線狀態
總結
| 問題 | 答案 |
|---|---|
| 為什麼要選 VPC? | 機器在 VPC 裡,AWS 要知道去哪裡找 |
| 可以選多個 VPC? | 不行,只能選一個 |
| 可以跨 VPC? | 用 IP 類型 + VPC Peering 可以 |
搞懂這個,你對 AWS 負載平衡的理解就會清楚很多。下次建 Target Group 的時候,就不會再困惑為什麼要選 VPC 了。