Application Load Balancer - Elastic Load Balancing

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Application Load Balancer

負載平衡器做為用戶端的單一聯絡點。用戶端將請求傳送到負載平衡器,而負載平衡器將請求傳送到如 EC2 執行個體等的目標。若要設定您的負載平衡器,您需要建立目標群組,然後使用您的目標群組來登錄目標。您也可以建立接聽程式,以檢查來自用戶端的連線請求,並建立接聽程式規則,將來自用戶端的請求路由到一或多個目標群組中的目標。

如需詳細資訊,請參閱 Elastic Load Balancing 使用者指南中的 Elastic Load Balancing的運作方式

負載平衡器的子網路

建立 Application Load Balancer 時,必須指定下列其中一種子網路類型:可用區域、本機區域或前哨。

可用區域

您必須選取至少兩個可用區域子網路。將適用以下限制:

  • 每個子網路必須來自不同的可用區域。

  • 為確保負載平衡器可以正確擴展,請確認負載平衡器的每個可用區域子網路都有一個 CIDR 區塊,每個子網路至少有一個/27位元遮罩 (例如,10.0.0.0/27) 和至少 8 個可用 IP 位址。負載平衡器會使用這些 IP 地址與目標建立連線。根據您的流量設定檔,負載平衡器可以擴展更高,並消耗最多 100 個 IP 位址,分散在所有啟用的子網路上。

本機區域

您可以指定一或多個「本機區域」子網路。將適用以下限制:

  • 您無法搭配負載平衡器使用 AWS WAF。

  • 您無法將 Lambda 函數做為目標使用。

Outposts

您可以指定單一的前哨子網路。將適用以下限制:

  • 內部部署資料中心必須已安裝和設定 Outpost。Outpost 與其 AWS 區域之間必須有可靠的網路連線。如需詳細資訊,請參閱 AWS Outposts 使用者指南

  • 負載平衡器在負載平衡器節點的 Outpost 上需要兩個large執行個體。下表顯示支援的執行個體類型。負載平衡器會視需要調整節點的大小,一次調整一個大小 (從largexlargexlarge2xlarge、再2xlarge4xlarge)。將節點擴展到最大的執行個體大小之後,如果您需要額外的容量,負載平衡器會將4xlarge執行個體新增為負載平衡器節點。如果您沒有足夠的執行個體容量或可用的 IP 位址來調整負載平衡器,負載平衡器會向報告事件,AWS Health Dashboard且負載平衡器狀態為active_impaired

  • 您可以依執行個體 ID 或 IP 位址註冊目標。如果您在該AWS地區註冊前哨站的目標,則不會使用它們。

  • 無法使用以下功能:作為目標、AWS WAF整合、嚴格工作階段、驗證支援以及與之整合的 Lambda 函數AWS Global Accelerator。

應用程式負載平衡器可部署在前哨的 c5/c5d、m5/m5d 或 r5/r5d 執行個體上。下表顯示負載平衡器可在 Outpost 上使用的每個執行個體類型的大小和 EBS 磁碟區:

執行個體類型和大小 EBS 磁碟區 (EBS)
C5/C5D
大型 50
xlarge 50
2xlarge 50
4xlarge 100
立方米
大型 50
xlarge 50
2xlarge 100
4xlarge 100
R5
大型 50
xlarge 100
2xlarge 100
4xlarge 100

負載平衡器安全群組

安全群組扮演防火牆的角色,可控制允許進出負載平衡器的流量。您可以選擇連接埠和通訊協定,以同時允許傳入和傳出流量。

與負載平衡器相關聯的安全群組規則必須同時允許接聽程式和健全狀況檢查連接埠上的兩個方向流量。當您將接聽程式新增至負載平衡器,或更新目標群組的運作狀態檢查連接埠時,您必須檢閱安全群組規則,以確保它們在新的連接埠上同時允許這兩個方向的流量。如需詳細資訊,請參閱建議規則

負載平衡器狀態

負載平衡器可以是以下其中一個狀態:

provisioning

正在設定負載平衡器。

active

負載平衡器已設定完成並準備好路由流量。

active_impaired

負載平衡器正在路由流量,但沒有擴展所需的資源。

failed

無法設定的負載平衡器。

負載平衡器屬性

以下是負載平衡器屬性:

access_logs.s3.enabled

指出存放在 Amazon S3 中的存取日誌是否啟用。預設值為 false

access_logs.s3.bucket

存取日誌的 Amazon S3 儲存貯體名稱。如果啟用存取日誌,則此為必要屬性。如需詳細資訊,請參閱啟用存取日誌

access_logs.s3.prefix

Amazon S3 儲存貯體中的位置前綴。

deletion_protection.enabled

表示是否已啟用刪除保護。預設值為 false

idle_timeout.timeout_seconds

閒置逾時值 (以秒為單位)。預設值為 60 秒。

ipv6.deny_all_igw_traffic

區塊網際網路閘道 (IGW) 對負載平衡器的存取,以防止透過網際網路閘道對內部負載平衡器進行非預期存取。針對面向網際網路false的負載平衡器和內部負載平衡器,它會設定true為。此屬性不會阻止非 IGW 網際網路存取 (例如透過對等互連、Transit Gateway 或AWS VPN)。AWS Direct Connect

routing.http.desync_mitigation_mode

決定負載平衡器如何處理可能對應用程式造成安全風險的請求。可能的值為 monitordefensivestrictest。預設值為 defensive

routing.http.drop_invalid_header_fields.enabled

指示具有無效標頭欄位的 HTTP 標頭是透過負載平衡器 (true) 移除,還是路由至目標 (false)。預設值為 false。Elastic Load Balancing 要求有效的 HTTP 標頭名稱符合規則運算式[-A-Za-z0-9]+,如 HTTP 欄位名稱登錄中所述。每個名稱由英數字元或連字號組成。true如果要從要求中移除不符合此模式的 HTTP 標頭,請選取此選項。

routing.http.preserve_host_header.enabled

指示 Application Load Balancer 是否應保留 HTTP 請求中的標Host頭並將該請求傳送到目標而不進行任何變更。可能的值為 truefalse。預設值為 false

routing.http.x_amzn_tls_version_and_cipher_suite.enabled

指示包含有關交涉的 TLS 版本x-amzn-tls-version和密碼套件資訊的兩個標頭 (和x-amzn-tls-cipher-suite) 是否會在將用戶端請求傳送至目標之前新增至該請求。x-amzn-tls-version 標頭包含有關與用戶端交涉的 TLS 通訊協定版本的資訊,而 x-amzn-tls-cipher-suite 標頭包含有關與用戶端交涉的密碼套件的資訊。兩個標頭都採用 OpenSSL 格式。此屬性的可能值為 truefalse。預設值為 false

routing.http.xff_client_port.enabled

指出X-Forwarded-For標頭是否應該保留用戶端用來連到負載平衡器的來源連接埠。可能的值為 truefalse。預設值為 false

routing.http.xff_header_processing.mode

可讓您在 Application Load Balancer 將 Application Load Balancer 傳送至目標之前修改、保留或移除 HTTP 請求中的標X-Forward-For頭。可能的值為 appendpreserveremove。預設值為 append

  • 如果該值為 append,Application Load Balancer 會在將 HTTP 請求傳送至目標之前將 HTTP 請求中的 (最近一次跳轉的) 用戶端 IP 地址新增至該請求中的 X-Forward-For 標頭。

  • 如果該值為preserve,Application Load Balancer 會保留 HTTP 請求中的標X-Forward-For頭並將該請求傳送到目標而不進行任何變更。

  • 如果該值為 remove,Application Load Balancer 會在將 HTTP 請求傳送至目標之前移除該請求中的標頭 X-Forward-For

routing.http2.enabled

指出是否啟用 HTTP/2。預設值為 true

waf.fail_open.enabled

指示如果無法將請求轉寄至目標,是否允許AWS WAF啟用的負載平衡器將請求路由至目標AWS WAF。可能的值為 truefalse。預設值為 false

注意

引入此routing.http.drop_invalid_header_fields.enabled屬性是為了提供 HTTP 不同步防護。已新增此routing.http.desync_mitigation_mode屬性,可為您的應用程式提供更全面的 HTTP 不同步防護。您不需要同時使用這兩個屬性,並且可以根據您的應用程序的要求選擇其中一個屬性。

IP 地址類型

您可以設定用戶端可用來存取網際網路對向和內部負載平衡器的 IP 位址類型。

以下是 IP 地址類型:

ipv4

用戶端必須使用 IPv4 地址 (例如,192.0.2.1) 才能連接至負載平衡器

dualstack

用戶端可以使用 IPv4 地址 (例如,192.0.2.1) 和 IPv6 地址 (例如,2001:0db8:85a3:0:0:8a2e:0370:7334) 連接至負載平衡器。

雙堆疊負載平衡器注意事項
  • 負載平衡器會根據目標群組的 IP 位址類型與目標進行通訊。

  • 當您為負載平衡器啟用雙堆疊模式時,Elastic Load Balancing 會為負載平衡器提供 AAAA DNS 記錄。使用 IPv4 地址與負載平衡器通訊的用戶端可解析 A DNS 記錄。使用 IPv6 地址與負載平衡器通訊的用戶端可解析 AAAA DNS 記錄。

  • 透過網際網路閘道存取您的內部 dualstack 負載平衡器會遭到封鎖,以防止意外存取網際網路。不過,這並不會阻止非 IWG 網際網路存取 (例如透過對等互連、Transit Gateway 或AWS VPN)。AWS Direct Connect

跨區域負載平衡 (Cross-zone load balancing)

使用應用程式負載平衡器時,跨區域負載平衡預設為開啟,且無法在負載平衡器層級進行變更。如需詳細資訊,請參閱 E lastic Load Balancing 使用者指南中的跨區域負載平衡部分。

可在目標群層面關閉跨區域負載平衡。如需詳細資訊,請參閱關閉跨區域負載平衡

連線閒置逾時

對於用戶端透過網路負載平衡器提出的每個請求,負載平衡器會維持兩個連線。前端連線介於用戶端和負載平衡器之間。後端連接位於負載平衡器和目標之間。負載平衡器具有適用於其連線的已設定閒置逾時期間。如果截至閒置逾時的時間過後都沒有傳送或接收的資料,負載平衡器會關閉連線。為了確保冗長的操作 (例如檔案上傳) 有時間完成,請在每個閒置逾時期間過去之前傳送至少 1 位元組的資料,並視需要增加閒置逾時期間的長度。

對於後端連線,建議您為 EC2 執行個體啟用 HTTP 保持作用中選項。您可以在 Web 伺服器設定中為 EC2 執行個體啟用 HTTP 保持連線。如果您啟用 HTTP 保持活動狀態,負載平衡器可以重複使用後端連線,直到保持連線逾時到期為止。也建議您將應用程式的閒置逾時設定為大於負載平衡器所設定的閒置逾時。否則,如果應用程式不正常地關閉與負載平衡器的 TCP 連線,負載平衡器可能會在收到封包之前傳送要求給應用程式,指出連線已關閉。如果是這種情況,則負載平衡器會向用戶端傳送 HTTP 502 錯誤閘道錯誤。

預設情況下,Elastic Load Balancer 會將負載平衡器的閒置逾時值設為 60 秒。使用下列程序來設定不同的閒置逾時值。

使用主控台更新閒置逾時值
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格上選擇 Load Balancers (負載平衡器)

  3. 選取負載平衡器。

  4. 在「性」標籤上,選擇「編輯」。

  5. 流量組態下,輸入閒置逾時的值 (以秒為單位)。有效範圍介於 1 到 4000 之間。

  6. 選擇 Save changes (儲存變更)。

使用 AWS CLI 更新閒置逾時值

modify-load-balancer-attributes指令與idle_timeout.timeout_seconds屬性搭配使用。

刪除保護

為避免您的負載平衡器上遭意外刪除,您可以啟用刪除保護。您的負載平衡器的刪除保護預設為停用。

如果您為負載平衡器啟用刪除保護,則必須先停用才可刪除負載平衡器。

使用主控台來啟用刪除保護
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格上選擇 Load Balancers (負載平衡器)

  3. 選取負載平衡器。

  4. 在「性」標籤上,選擇「編輯」。

  5. 在 [設定] 下方,開啟 [刪除保護]。

  6. 選擇 Save changes (儲存變更)。

使用主控台來停用刪除保護
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格上選擇 Load Balancers (負載平衡器)

  3. 選取負載平衡器。

  4. 在「性」標籤上,選擇「編輯」。

  5. 在「配置」頁面下,關閉「刪除保護」。

  6. 選擇 Save changes (儲存變更)。

使用 AWS CLI 來啟用或停用刪除保護

modify-load-balancer-attributes指令與deletion_protection.enabled屬性搭配使用。

非同步緩和模式

非同步緩和模式可保護您的應用程式免於因 HTTP 非同步而發生問題。負載平衡器會根據其威脅層級對每個要求進行分類,允許安全要求,然後根據您指定的緩和模式來降低風險。非同步緩和模式分為監控、防禦性和最嚴格。預設值為防禦模式,可針對 HTTP 非同步提供持久的緩和措施,同時維持應用程式的可用性。您可以切換至最嚴格模式,以確保您的應用程式只接收符合 RFC 7230 的要求。

htt_desync_guardian 程式庫會分析 HTTP 要求,以防止 HTTP 非同步攻擊。如需詳細資訊,請參閱開啟的 HTTP Desync Guardian GitHub。

分類

分類如下:

  • 合規 — 要求符合 RFC 7230,不會造成任何已知的安全威脅。

  • 可接受 — 要求不符合 RFC 7230,但不會造成已知的安全威脅。

  • 不明確 — 要求不符合 RFC 7230,但造成風險,因為各種 Web 伺服器和代理的處理方式不同。

  • 嚴重 — 要求造成高安全性風險。負載平衡器會封鎖要求,傳送提供 400 回應至用戶端,並關閉用戶端連線。

如果要求不符合 RFC 7230,負載平衡器會增加 DesyncMitigationMode_NonCompliant_Request_Count 指標。如需詳細資訊,請參閱Application Load Balancer 指標

每個要求的分類都包含在負載平衡器存取記錄中。如果要求不符合規定,存取記錄會包含分類原因代碼。如需詳細資訊,請參閱分類原因

模式

下表說明 Application Load Balancer 如何根據模式和分類處理要求。

分類 監控模式 防禦性模式 最嚴格模式
合規 允許 已允許 允許
可接受 允許 已允許 封鎖
不明確 允許 允許¹ 封鎖
嚴重 允許 封鎖 封鎖

¹ 路由傳送要求,但關閉用戶端和目標連接。如果負載平衡器在防禦模式下收到大量不明確的要求,您可能會產生額外費用。這是因為每秒增加的新連線數目有助於每小時使用的 Load Balancer 容量單位 (LCU)。您可以使用NewConnectionCount指標來比較負載平衡器在監控模式和防禦模式下建立新連線的方式。

使用主控台更新非同步緩和模式
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格上選擇 Load Balancers (負載平衡器)

  3. 選取負載平衡器。

  4. 在「性」標籤上,選擇「編輯」。

  5. 在 [封包處理] 下,針對 [不同步緩和模式],選擇 [防禦性]、[最嚴格] 或 [監控]

  6. 選擇 Save changes (儲存變更)。

使用 AWS CLI 更新非同步緩和模式

使用modify-load-balancer-attributes指令,將routing.http.desync_mitigation_mode屬性設定為monitordefensive、或strictest

主機標頭保留

當您啟用 P reserve 主機標頭屬性時,Application Load Balancer 會保留 HTTP 請求中的標Host頭並將標頭傳送到目標而不進行任何修改。如果應用程式負載平衡器收到多個Host標頭,則會保留所有標頭。接聽程式規則只會套用至收到的第一個Host標頭。

依預設,未啟用 P reserve 主機標頭屬性時,Application Load Balancer 會以下列方式修改Host標頭:

如果未啟用主機標頭保留,且監聽程式連接埠為非預設連接埠:未使用預設連接埠 (連接埠 80 或 443) 時,如果用戶端尚未附加,則會將連接埠號碼附加至主機標頭。例如,如果監聽器連接埠是非預設連接埠 (例如)Host: www.example.com:8080,則 HTTP 要求中的Host標頭Host: www.example.com會被修改為8080

未啟用主機標頭保留,且監聽器連接埠為預設連接埠 (連接埠 80 或 443) 時:對於預設的監聽程式連接埠 (連接埠 80 或 443),我們不會將連接埠號碼附加至外寄主機標頭。已存在於內送主機標頭中的任何連接埠號碼都會被移除。

下表顯示應用程式負載平衡器如何根據接聽程式連接埠處理 HTTP 要求中的主機標頭的更多範例。

接聽連接埠

範例請求

請求中的主機標頭

主機標頭保留已停用 (預設行為)

已啟用主機標頭保留
在預設的 HTTP/HTTPS 接聽程式上傳送要求。 GET /index.html HTTP/1.1 Host: example.com example。com example.com example.com
請求在默認 HTTP 接聽器上發送,並且主機頭具有端口(80 或 443)。 GET /index.html HTTP/1.1 Host: example.com:80 例如:80 example。com 例如:80
請求具有絕對路徑。 GET https://dns_name/index.html HTTP/1.1 Host: example.com example。com dns_name example.com
要求會在非預設接聽程式連接埠上傳送,且主機標頭具有連接埠 (例如 8080)。 GET /index.html HTTP/1.1 Host: example.com example。com 例如: example。com
啟用主機標頭保留
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格中,選擇 Load Balancers (負載平衡器)

  3. 選取負載平衡器。

  4. 在「性」標籤上,選擇「編輯」。

  5. 在 [封包處理] 下方,開啟 [保留主機標頭]。

  6. 選擇 Save changes (儲存變更)。

若要使用啟用主機標頭保留AWS CLI

在將routing.http.preserve_host_header.enabled屬性設定為的情況下使用modify-load-balancer-attributes指令true

Application Load Balancer 和AWS WAF

您可以AWS WAF搭配 Application Load Balancer 使用,以根據 Web 存取控制清單 (Web ACL) 中的規則進行 Web 存取控制清單 (Web ACL) 允許或區塊請求。如需詳細資訊,請參閱開AWS WAF發人員指南中的使用 Web ACL

若要檢查您的負載平衡器是否整合AWS WAF​,請在AWS Management Console中選取您的負載平衡器,並選擇 ​Integrated services (整合服務) 標籤。

根據預設,如果負載平衡器無法從中取得回應AWS WAF,則會傳回 HTTP 500 錯誤,而且不會轉寄要求。如果您需要負載平衡器將要求轉送至目標,即使目標無法連絡AWS WAF,您可以啟用AWS WAF fail open 屬性。

若要啟用AWS WAF失敗,請使用主控台開啟
  1. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格上選擇 Load Balancers (負載平衡器)

  3. 選取負載平衡器。

  4. 在「性」標籤上,選擇「編輯」。

  5. 流量配置下,打開 WAF 失敗打開

  6. 選擇 Save changes (儲存變更)。

若要啟用AWS WAF失敗開啟,請使用AWS CLI

在將waf.fail_open.enabled屬性設定為的情況下使用modify-load-balancer-attributes指令true