

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

# 為 Classic Load Balancer 設定黏性工作階段
<a name="elb-sticky-sessions"></a>

Classic Load Balancer 預設會以最小的負載，將每個請求獨立路由至已註冊的執行個體。不過，您可以使用*黏性工作階段*功能 (也稱為*工作階段親和性*)，它能讓負載平衡器將使用者的工作階段繫結到特定執行個體。這樣能確保該工作階段期間所有的使用者請求都能傳送到相同的執行個體。

管理黏性工作階段的金鑰是決定您的負載平衡器應該持續將使用者請求路由到同一個執行個體的時間。如果您的應用程式有其自己的工作階段 Cookie，則您可以設定 Elastic Load Balancing，因此工作階段 Cookie 遵循應用程式的工作階段 Cookie 指定的持續時間。如果您的應用程式沒有自己的工作階段 Cookie，則您可用指定自己的黏性持續時間來設定 Elastic Load Balancing，以建立工作階段 Cookie。

Elastic Load Balancing 建立名為 AWSELB 的 Cookie，用於對應工作階段到執行個體。

**要求**
+ HTTP/HTTPS 負載平衡器。
+ 在各個可用區域內啟動至少一個正常運作的執行個體。

**相容性**
+ 路徑屬性 Cookie 的 RFC 允許底線。不過，Elastic Load Balancing URI 會編碼底線字元，像是 `%5F`，因為有些瀏覽器如 Internet Explorer 7，預期底線以 `%5F` 為 URI 編碼。由於目前運作的瀏覽器可能受影響，Elastic Load Balancing 會持續進行 URI 編碼底線字元。例如，如果 Cookie 有屬性 `path=/my_path`，Elastic Load Balancing 會變更轉發請求至 `path=/my%5Fpath` 的屬性。
+ 您無法設定 `secure` 旗標或 `HttpOnly` 旗標在您的持續時間為基礎的工作階段黏著 Cookie。不過，這些 Cookie 不包含機密資料。請注意，如果您設定將 `secure` 旗標或 `HttpOnly` 旗標在應用程式控制的工作階段黏性 Cookie，它也一樣設在 AWSELB Cookie。
+ 如果您有一個在 `Set-Cookie` 欄位在應用程式 Cookie 結尾的分號，則負載平衡器忽略 Cookie。

**Topics**
+ [持續時間為基礎的工作階段黏著](#enable-sticky-sessions-duration)
+ [應用程式控制工作階段黏著](#enable-sticky-sessions-application)

## 持續時間為基礎的工作階段黏著
<a name="enable-sticky-sessions-duration"></a>

負載平衡器會使用特殊的 Cookie (AWSELB)，為每個接聽程式的每個請求追蹤執行個體。當負載平衡器收到請求時，首先會檢查此 Cookie 是否存在於請求中。若是，此請求會傳送至 Cookie 中指定的執行個體。若 Cookie 不存在，則負載平衡器會根據現有負載平衡演算法選擇執行個體。回應會插入 Cookie，藉此將後續來自相同使用者的請求繫結至該執行個體。黏性政策設定可定義 Cookie 過期時間，用來建立每個 Cookie 有效期。負載平衡器在使用之前，不會重新整理 Cookie 的過期時間也不會檢查 Cookie 是否過期。在 Cookie 過期之後，工作階段不再有黏性。用戶端應該從其 Cookie 存放在到期移除 Cookie。

透過 CORS (跨來源資源共享) 請求，有些瀏覽器需要 `SameSite=None; Secure` 來啟用綁定。在此情況下，Elastic Load Balancing 會建立第二個綁定 Cookie (AWSELBCORS)，其中包含與原始綁定 Cookie 加上與此 `SameSite` 屬性相同的資訊。用戶端會同時收到這兩個 Cookie。

如果執行個體發生失敗或變成運作狀態不佳，負載平衡器停止路由請求到該執行個體，並根據現有的負載平衡演算法選擇新的運作狀態良好的執行個體。如果沒有 Cookie，而且工作階段不再有黏性，該請求路由到新的執行個體。

如果用戶端切換到具備不同的後端連接埠的接聽程式，黏著性遺失。

**若要使用主控台的負載平衡器啟用持續時間為基礎的黏性工作階段**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格的 **Load Balancing (負載平衡器)**，選擇 **Load Balancer (負載平衡器)**。

1. 選擇負載平衡器的名稱來開啟其詳細資訊頁面。

1. 在**接聽程式**索引標籤中，選擇**管理接聽程式**。

1. 在**管理接聽程式**頁面上找到要更新的接聽程式，然後選擇 **Cookie 黏性**下方的**編輯**。

1. 在**編輯 Cookie 黏性設定**快顯視窗上，選取**依負載平衡器產生**。

1. (選用) 對於**過期期間**，輸入 Cookie 過期期間 (以秒為單位)。如果您不指定過期時段，黏性工作階段持續在瀏覽器工作階段。

1. 選擇**儲存變更**以關閉快顯視窗。

1. 選擇**儲存變更**以返回負載平衡器詳細資訊頁面。

**使用 為負載平衡器啟用以持續時間為基礎的黏性工作階段 AWS CLI**

1. 使用以下 [create-lb-cookie-stickiness-policy](https://docs.aws.amazon.com/cli/latest/reference/elb/create-lb-cookie-stickiness-policy.html) 命令來建立負載平衡器產生 Cookie 黏性政策與 Cookie 過期時段的 60 秒：

   ```
   aws elb create-lb-cookie-stickiness-policy --load-balancer-name {{my-loadbalancer}} --policy-name {{my-duration-cookie-policy}} --cookie-expiration-period 60
   ```

1. 使用以下 [set-load-balancer-policies-of-listener](https://docs.aws.amazon.com/cli/latest/reference/elb/set-load-balancer-policies-of-listener.html) 命令以啟用指定的負載平衡器的工作階段黏性：

   ```
   aws elb set-load-balancer-policies-of-listener --load-balancer-name {{my-loadbalancer}} --load-balancer-port {{443}} --policy-names {{my-duration-cookie-policy}}
   ```
**注意**  
此 `set-load-balancer-policies-of-listener` 命令會取代目前的政策與指定的負載平衡器連接埠相關聯。每當您使用此命令，指定 `--policy-names` 選項列出所有政策以啟用。

1. (選用) 使用以下 [describe- load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html) 命令來驗證已啟用的政策：

   ```
   aws elb describe-load-balancers --load-balancer-name {{my-loadbalancer}}
   ```

   回應包含下列資訊，其中說明為指定的連接埠上的接聽程式啟用政策：

   ```
   {
       "LoadBalancerDescriptions": [
           {
               ...
               "ListenerDescriptions": [
                   {
                       "Listener": {
                           "InstancePort": 443, 
                           "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-certificate", 
                           "LoadBalancerPort": 443, 
                           "Protocol": "HTTPS", 
                           "InstanceProtocol": "HTTPS"
                       }, 
                       "PolicyNames": [
                           "my-duration-cookie-policy", 
                           "ELBSecurityPolicy-TLS-1-2-2017-01"
                       ]
                   },
                   ...
               ],            
               ...
               "Policies": {
                   "LBCookieStickinessPolicies": [
                    {
                           "PolicyName": "my-duration-cookie-policy", 
                           "CookieExpirationPeriod": 60
                       }
   
                   ], 
                   "AppCookieStickinessPolicies": [], 
                   "OtherPolicies": [
                       "ELBSecurityPolicy-TLS-1-2-2017-01"
                   ]
               },
               ...
           }
       ]
   }
   ```

## 應用程式控制工作階段黏著
<a name="enable-sticky-sessions-application"></a>

負載平衡器使用特殊的 Cookie，將工作階段與處理初始請求的執行個體相關聯，但遵循指定在政策組態中應用程式 Cookie 的生命週期。如果應用程式回應包含新應用程式 Cookie，負載平衡器只會插入新的黏性 Cookie。負載平衡器黏性 Cookie 不會隨著每個請求更新。如果應用程式 Cookie 明確移除或過期，工作階段會停止其黏性直到發出新的應用程式 Cookie。

下列由後端執行個體設定的屬性會傳送至 Cookie 中的用戶端：`path`、`port`、`domain`、`secure`、`httponly`、`discard`、`max-age`、`expires`、`version`、`comment`、`commenturl` 和 `samesite`。

如果執行個體發生失敗或變成運作狀態不佳，負載平衡器停止路由請求到該執行個體，並根據現有的負載平衡演算法選擇新的運作狀態良好的執行個體。負載平衡器會將工作階段視為「卡住」到運作狀態良好的執行個體，並持續路由請求到即使失敗的執行個體恢復到該執行個體。

**使用主控台來啟用應用程式控制工作階段黏著**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格的 **Load Balancing (負載平衡器)**，選擇 **Load Balancer (負載平衡器)**。

1. 選擇負載平衡器的名稱來開啟其詳細資訊頁面。

1. 在**接聽程式**索引標籤中，選擇**管理接聽程式**。

1. 在**管理接聽程式**頁面上找到要更新的接聽程式，然後選擇 **Cookie 黏性**下方的**編輯**。

1. 選取**由應用程式產生**。

1. 在 **Cookie Name (Cookie 名稱)**，輸入您的應用程式名稱。

1. 選擇**儲存變更**。

**使用 啟用應用程式控制的工作階段黏性 AWS CLI**

1. 使用以下 [create-app-cookie-stickiness-policy](https://docs.aws.amazon.com/cli/latest/reference/elb/create-app-cookie-stickiness-policy.html) 命令來建立應用程式產生的 Cookie 黏著政策：

   ```
   aws elb create-app-cookie-stickiness-policy --load-balancer-name {{my-loadbalancer}} --policy-name {{my-app-cookie-policy}} --cookie-name {{my-app-cookie}}
   ```

1. 使用以下 [set-load-balancer-policies-of-listener](https://docs.aws.amazon.com/cli/latest/reference/elb/set-load-balancer-policies-of-listener.html) 命令以啟用負載平衡器的工作階段黏性：

   ```
   aws elb set-load-balancer-policies-of-listener --load-balancer-name {{my-loadbalancer}} --load-balancer-port {{443}} --policy-names {{my-app-cookie-policy}}
   ```
**注意**  
此 `set-load-balancer-policies-of-listener` 命令會取代目前的政策與指定的負載平衡器連接埠相關聯。每當您使用此命令，指定 `--policy-names` 選項列出所有政策以啟用。

1. (選用) 使用以下 [describe- load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html) 命令來驗證已啟用的黏性政策：

   ```
   aws elb describe-load-balancers --load-balancer-name {{my-loadbalancer}}
   ```

1. 回應包含下列資訊，其中說明為指定的連接埠上的接聽程式啟用政策：

   ```
   {
       "LoadBalancerDescriptions": [
           {
               ...
               "ListenerDescriptions": [
                   {
                       "Listener": {
                           "InstancePort": 443, 
                           "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-certificate", 
                           "LoadBalancerPort": 443, 
                           "Protocol": "HTTPS", 
                           "InstanceProtocol": "HTTPS"
                       }, 
                       "PolicyNames": [
                           "my-app-cookie-policy",  
                           "ELBSecurityPolicy-TLS-1-2-2017-01"
                       ]
                   }, 
                   {
                       "Listener": {
                           "InstancePort": 80, 
                           "LoadBalancerPort": 80, 
                           "Protocol": "TCP", 
                           "InstanceProtocol": "TCP"
                       }, 
                       "PolicyNames": []
                   }
               ],
               ...
               "Policies": {
                   "LBCookieStickinessPolicies": [], 
                   "AppCookieStickinessPolicies": [
                   {
                           "PolicyName": "my-app-cookie-policy", 
                           "CookieName": "my-app-cookie"
                       }
   
                   ], 
                   "OtherPolicies": [
                       "ELBSecurityPolicy-TLS-1-2-2017-01" 
                   ]
               }, 
               ...
           }
       ]
   }
   ```