

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

# Auto Scaling 中的容量重新平衡，以取代具有風險的 Spot 執行個體
<a name="ec2-auto-scaling-capacity-rebalancing"></a>

Auto Scaling 中的容量重新平衡可協助您主動取代具有中斷風險的 Spot 執行個體，以維持工作負載可用性。

當 Spot 執行個體的中斷風險提高時，Amazon EC2 Spot 服務會將 EC2 執行個體重新平衡建議傳送至 Amazon EC2 Auto Scaling。如果您啟用容量重新平衡，Auto Scaling 會嘗試主動取代群組中已收到 EC2 執行個體重新平衡建議的 Spot 執行個體。這樣一來，您即可有機會將工作負載重新平衡至未處於提高之中斷風險的新的 Spot 執行個體。

當您不使用容量重新平衡時，在 Amazon EC2 Spot 服務中斷執行個體且其運作狀態檢查失敗之前，Auto Scaling 不會取代 Spot 執行個體。在中斷執行個體之前，Amazon EC2 必定會提供 EC2 執行個體重新平衡建議和 Spot 執行個體兩分鐘中斷通知。

**Topics**
+ [概要](#capacity-rebalancing-overview)
+ [容量重新平衡行為](#capacity-rebalancing-behavior)
+ [考量事項](#capacity-rebalancing-considerations)
+ [啟用容量重新平衡以主動取代具有風險的 Spot 執行個體](enable-capacity-rebalancing-console-cli.md)

## 概要
<a name="capacity-rebalancing-overview"></a>

若要將容量重新平衡與 Auto Scaling 群組搭配使用，基本步驟如下：

1. 設定您的 Auto Scaling 群組，以使用多個執行個體類型和可用區域。這樣一來，Amazon EC2 Auto Scaling 就可以查看每個可用區域中 Spot 執行個體的可用容量。如需詳細資訊，請參閱[具有多種執行個體類型和購買選項的 Auto Scaling 群組](ec2-auto-scaling-mixed-instances-groups.md)。

1. 視需要新增生命週期關聯，以便在接收重新平衡通知的執行個體內對應用程式執行正常關閉程序。如需詳細資訊，請參閱[Amazon EC2 Auto Scaling lifecycle hook](lifecycle-hooks.md)。

   以下是您可能使用 lifecycle hook 的一些原因：
   + 實現 Amazon SQS 工作者的順利關機
   + 完成從網域名稱系統 (DNS) 取消註冊
   + 提取系統或應用程式日誌並上傳到 Amazon Simple Storage Service (Amazon S3)

1. 開發 lifecycle hook 的自訂動作。若要盡快調用您的自訂動作，您需要知道執行個體何時可以終止。可以透過偵測執行個體的生命週期狀態來找出答案。
   + 若要調用執行個體以外的動作，請撰寫 EventBridge 規則，以在事件模式符合規則時自動化要採取的動作。
   + 若要在執行個體內調用動作，請將執行個體設定為執行關閉指令碼，並透過執行個體中繼資料擷取生命週期狀態。

   設計自訂動作在兩分鐘內完成操作至關重要。這樣可以確保在執行個體終止前有充裕的時間完成任務。

完成這些步驟後，您便可以開始使用容量重新平衡。

## 容量重新平衡行為
<a name="capacity-rebalancing-behavior"></a>

透過容量重新平衡，當執行個體接收重新平衡建議時，Amazon EC2 Auto Scaling 的行為如下：
+ 新 Spot 執行個體啟動時，Amazon EC2 Auto Scaling 會先等待新執行個體通過運作狀態檢查，然後才會終止先前的執行個體。在取代多個執行個體時，每個先前的執行個體都會在新執行個體啟動並通過其運作狀態檢查之後開始終止。
+ 由於 Amazon EC2 Auto Scaling 會在終止先前的執行個體前嘗試啟動新執行個體，達到或接近最大指定容量便會阻礙或完全停止重新平衡的活動。若要避免這個問題，Amazon EC2 Auto Scaling 可以暫時超過該群組的大小上限最高可達所需容量的 10%。
+ 如果您沒有將 lifecycle hook 新增到 Auto Scaling 群組，Amazon EC2 Auto Scaling 便會在新執行個體通過運作狀態檢查後立即終止先前的執行個體。
+ 如果您新增了 lifecycle hook，便可藉由您為 lifecycle hook 指定的逾時值，來延長我們開始終止先前執行個體之前所需的時間。
+ 如果您使用擴展政策或排程擴展，則擴展活動會並行執行。如果正在執行擴展活動，且 Auto Scaling 群組低於其所需的新容量，Amazon EC2 Auto Scaling 會在終止先前的執行個體之前進行擴增。

如果在一個可用區域中沒有執行個體類型的容量，Amazon EC2 Auto Scaling 會繼續嘗試在其他啟用的可用區域中啟動 Spot 執行個體，直到啟動成功為止。

在最壞的情況下，如果新執行個體無法啟動或其運作狀態檢查失敗，Amazon EC2 Auto Scaling 會繼續嘗試重新啟動這些執行個體。在其嘗試啟動新的執行個體時，會在發出兩分鐘的中斷通知後，最終中斷並強制終止先前的執行個體。

## 考量事項
<a name="capacity-rebalancing-considerations"></a>

使用容量重新平衡時，請考慮下列事項：

**應用程式的設計應容許 Spot 中斷**  
您的應用程式應該能夠處理執行個體數量的動態變更以及 Spot 執行個體提前中斷的可能性。例如，如果 Auto Scaling 群組位於 Elastic Load Balancing 負載平衡器後方，Amazon EC2 Auto Scaling 會等待執行個體從負載平衡器取消註冊，然後再呼叫 lifecycle hook。如果取消註冊執行個體和完成生命週期動作的時間過長，在 Amazon EC2 Auto Scaling 等待您的生命週期動作完成後再終止執行個體期間，執行個體可能會中斷。  
Amazon EC2 並不總是能在兩分鐘 Spot 執行個體中斷通知之前傳送重新平衡建議訊號。有時候，重新平衡建議訊號會與兩分鐘的中斷通知一起到達。發生這種情況時，Amazon EC2 Auto Scaling 會呼叫 Lifecycle hook，並嘗試立即啟動新 Spot 執行個體。

**避免中斷替代 Spot 執行個體的風險提高**  
如果您使用 `lowest-price` 配置策略，替代 Spot 執行個體的中斷風險可能會提高。這是因為我們會在當時具有可用容量的最低價集區中啟動執行個體，即使您的替代 Spot 執行個體在啟動後很快就會中斷也一樣。為了避免提高中斷風險，我們強烈建議您不要使用 `lowest-price` 配置策略。相反，我們建議使用 `price-capacity-optimized` 配置策略。此策略會在 Spot 集區中啟動最不可能中斷且價格可能最低的 Spot 執行個體。因此，它們在不久後的將來不太可能會中斷。

**只有在可用性相同或更好時，Amazon EC2 Auto Scaling 才會啟動新執行個體**  
容量重新平衡的其中一個目標是改善 Spot 執行個體的可用性。如果現有的 Spot 執行個體收到重新平衡建議，只有新執行個體提供與現有執行個體相同或更好的可用性時，Amazon EC2 Auto Scaling 才會啟動新執行個體。如果新執行個體的中斷風險比現有執行個體更大，則 Amazon EC2 Auto Scaling 將不會啟動新執行個體。但是，Amazon EC2 Auto Scaling 將基於 Amazon EC2 Spot 服務提供的資訊，繼續評估 Spot 容量集區，並在可用性改善時啟動新執行個體。  
如果 Amazon EC2 Auto Scaling 不主動啟動新執行個體，現有執行個體可能會中斷。發生這種情況時，Amazon EC2 Auto Scaling 會在收到 Spot 執行個體中斷通知後立即嘗試啟動新執行個體。無論新執行個體是否存在高中斷風險，都會進行此嘗試。

**容量重新平衡不會增加 Spot 執行個體中斷率**  
當您啟用容量重新平衡時，不會增加 [Spot 執行個體中斷率](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html) (當 Amazon EC2 需要恢復容量時回收的 Spot 執行個體數量)。但是，如果容量重新平衡偵測到執行個體有中斷風險，Amazon EC2 Auto Scaling 將立即嘗試啟動新的執行個體。因此，與在有風險的執行個體中斷後等待 Amazon EC2 Auto Scaling 啟動新的執行個體相比，可能會取代更多執行個體。  
雖然您可以在啟用容量重新平衡的情況下取代更多執行個體，但您可以從主動式而非被動式中受益。這可讓您有更多時間在執行個體中斷之前採取行動。透過 [Spot 執行個體中斷通知](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html)，您通常最多只有兩分鐘時間來正常關閉您的執行個體。透過容量重新平衡事先啟動新的執行個體，可讓現有程序更有可能在有風險的執行個體上完成作業。您也可以啟動執行個體關閉程序，防止在有風險的執行個體上排定新的作業，並為新啟動的執行個體作好準備以接管該應用程式。透過容量重新平衡的主動式取代，您可以從正常連續性中獲益。  
下列理論範例示範了使用容量重新平衡的風險和益處：  
+ 下午 2:00 – 收到執行個體 A 的重新平衡建議，Amazon EC2 Auto Scaling 立即嘗試啟動取代執行個體 B，讓您有時間開始關機程序。
+ 下午 2:30 – 收到執行個體 B 的重新平衡建議，會取代為執行個體 C，讓您有時間開始關機程序。
+ 下午 2:32 – 如果未啟用容量重新平衡，並且如果在下午 2:32 仍未收到執行個體 A 的 Spot 執行個體中斷通知，則您最多只有兩分鐘時間採取動作。不過，執行個體 A 會一直持續執行，直到此時為止。

# 啟用容量重新平衡以主動取代具有風險的 Spot 執行個體
<a name="enable-capacity-rebalancing-console-cli"></a>

您可以使用 AWS 管理主控台 或 AWS CLI 來啟用 Auto Scaling 群組的容量重新平衡。啟用容量重新平衡時，Amazon EC2 Auto Scaling 會嘗試主動取代群組中收到 EC2 執行個體重新平衡建議的 Spot 執行個體。

## 啟用容量重新平衡 (主控台)
<a name="enable-capacity-rebalancing-console"></a>

您可以在建立或更新 Auto Scaling 群組時啟用或停用容量重新平衡。

**啟用新 Auto Scaling 群組的容量重新平衡**

1. 前往網址 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台，然後從導覽窗格中選擇 **Auto Scaling 群組**。

1. 選擇 **Create Auto Scaling group** (建立 Auto Scaling 群組)。

1. 在**步驟 1：選擇啟動範本或組態**中，輸入 Auto Scaling 群組的名稱，選擇啟動範本，然後選擇**下一步**以繼續下一個步驟。

1. 在**步驟 2：選擇執行個體啟動選項**中，針對**執行個體類型需求**，選擇建立混合執行個體群組的設定。這包括可啟動的執行個體類型、執行個體購買選項，以及 Spot 和隨需執行個體的配置策略。依預設，這些設定並未設定。要進行設定，您必須選擇 **Override launch template** (覆寫啟動範本)。如需有關建立混合執行個體群組的詳細資訊，請參閱 [具有多種執行個體類型和購買選項的 Auto Scaling 群組](ec2-auto-scaling-mixed-instances-groups.md)。

1. 在**網路**下，視需要選擇選項。驗證您想要使用的子網路是否位於不同的可用區域中。

1. 在**配置策略**區段下，選擇 Spot 的配置策略。勾選或清除**容量重新平衡**核取方塊，即可啟用或停用容量重新平衡。您唯有在**執行個體購買選項**區段中請求了要作為 Spot 執行個體啟動的 Auto Scaling 群組的百分比時，才能看到這個選項。

1. 建立 Auto Scaling 群組。

1. (選用) 視需要新增生命週期關聯。如需詳細資訊，請參閱[將生命週期掛鉤新增至 Auto Scaling 群組](adding-lifecycle-hooks.md)。

**啟用或停用現有 Auto Scaling 群組的容量重新平衡**

1. 前往網址 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台，然後從導覽窗格中選擇 **Auto Scaling 群組**。

1. 選取 Auto Scaling 群組旁的核取方塊。頁面底部會開啟一個分割窗格。

1. 在 **Details** (詳細資訊) 索引標籤上，依次選擇 **Allocation strategies** (分配策略)、**Edit** (編輯)。

1. 在**配置策略**區段下，選取或清除**容量重新平衡**下的核取方塊，以啟用或停用容量重新平衡。

1. 選擇**更新**。

## 啟用容量重新平衡 (AWS CLI)
<a name="enable-capacity-rebalancing-aws-cli"></a>

下列範例示範如何使用 AWS CLI 來啟用和停用容量重新平衡。

搭配以下參數使用 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 或 [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) 命令：
+ `--capacity-rebalance` / `--no-capacity-rebalance` – 指出是否啟用容量重新平衡的布林值。

在呼叫 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 命令前，您需要設定供 Auto Scaling 群組使用的啟動範本名稱。如需詳細資訊，請參閱 [為 Auto Scaling 群組建立啟動範本](create-launch-template.md)。

**注意**  
以下程序說明如何使用 JSON 或 YAML 格式組態檔案。如果您使用 AWS CLI 版本 1，則必須指定 JSON 格式的組態檔案。如果您使用 AWS CLI 版本 2，您可以指定 YAML 或 JSON 格式的組態檔案。

### JSON
<a name="enable-capacity-rebalancing-aws-cli-json"></a>

**要建立和設定新的 Auto Scaling 群組**
+ 使用下列 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 命令建立新的 Auto Scaling 群組並啟用容量重新平衡。此命令參考 JSON 檔案作為 Auto Scaling 群組的唯一參數。

  ```
  aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
  ```

  如果您尚未擁有指定[混合執行個體政策](ec2-auto-scaling-mixed-instances-groups.md)的 CLI 組態檔案，請建立一個。

  在組態檔案中，將以下命令列新增至最上層 JSON 物件。

  ```
  {
      "CapacityRebalance": true
  }
  ```

  以下是範例 `config.json` 檔案。

  ```
  {
      "AutoScalingGroupName": "my-asg",
      "DesiredCapacity": 12,
      "MinSize": 12,
      "MaxSize": 15,
      "CapacityRebalance": true,
      "MixedInstancesPolicy": {
          "InstancesDistribution": {
              "OnDemandBaseCapacity": 0,
              "OnDemandPercentageAboveBaseCapacity": 25,
              "SpotAllocationStrategy": "price-capacity-optimized"
          },
          "LaunchTemplate": {
              "LaunchTemplateSpecification": {
                  "LaunchTemplateName": "my-launch-template",
                  "Version": "$Default"
              },
              "Overrides": [
                  {
                      "InstanceType": "c5.large"
                  },
                  {
                      "InstanceType": "c5a.large"
                  },
                  {
                      "InstanceType": "m5.large"
                  },
                  {
                      "InstanceType": "m5a.large"
                  },
                  {
                      "InstanceType": "c4.large"
                  },
                  {
                      "InstanceType": "m4.large"
                  },
                  {
                      "InstanceType": "c3.large"
                  },
                  {
                      "InstanceType": "m3.large"
                  }
              ]
          }
      },
      "TargetGroupARNs": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff",
      "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
  }
  ```

### YAML
<a name="enable-capacity-rebalancing-aws-cli-yaml"></a>

**要建立和設定新的 Auto Scaling 群組**
+ 使用下列 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 命令建立新的 Auto Scaling 群組並啟用容量重新平衡。此命令參考 YAML 檔案作為 Auto Scaling 群組的唯一參數。

  ```
  aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml
  ```

  將下命令列新增至 YAML 格式組態檔案。

  ```
  CapacityRebalance: true
  ```

  以下是範例 `config.yaml` 檔案。

  ```
  ---
  AutoScalingGroupName: my-asg
  DesiredCapacity: 12
  MinSize: 12
  MaxSize: 15
  CapacityRebalance: true
  MixedInstancesPolicy:
    InstancesDistribution:
      OnDemandBaseCapacity: 0
      OnDemandPercentageAboveBaseCapacity: 25
      SpotAllocationStrategy: price-capacity-optimized
    LaunchTemplate:
      LaunchTemplateSpecification:
        LaunchTemplateName: my-launch-template
        Version: $Default
      Overrides:
      - InstanceType: c5.large
      - InstanceType: c5a.large
      - InstanceType: m5.large
      - InstanceType: m5a.large
      - InstanceType: c4.large
      - InstanceType: m4.large
      - InstanceType: c3.large
      - InstanceType: m3.large
  TargetGroupARNs:
  - arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff
  VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782
  ```

**要啟用現有 Auto Scaling 群組的容量重新平衡**
+ 使用下列 [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) 命令來啟用容量重新平衡。

  ```
  aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
    --capacity-rebalance
  ```

**驗證是否已為 Auto Scaling 群組啟用容量重新平衡**
+ 使用下列 [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) 命令來驗證是否已啟用容量重新平衡，並檢視詳細資訊。

  ```
  aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
  ```

  以下是回應範例。

  ```
  {
      "AutoScalingGroups": [
          {
              "AutoScalingGroupName": "my-asg",
              "AutoScalingGroupARN": "arn",
              ...
              "CapacityRebalance": true
          }
      ]
  }
  ```

**停用容量重新平衡**  
使用 [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) 命令與 `--no-capacity-rebalance` 選項來停用容量重新平衡。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
  --no-capacity-rebalance
```

## 相關資源
<a name="capacity-rebalancing-related-resources"></a>

如需容量重新平衡的詳細資訊，請參閱 AWS 運算部落格上的[使用適用於 Amazon EC2 Auto Scaling 的新容量重新平衡功能主動管理 Spot 執行個體生命週期](https://aws.amazon.com/blogs/compute/proactively-manage-spot-instance-lifecycle-using-the-new-capacity-rebalancing-feature-for-ec2-auto-scaling/)。

如需 EC2 執行個體重新平衡建議的詳細資訊，請參閱《Amazon [EC2 使用者指南》中的 EC2 執行個體重新平衡建議](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/rebalance-recommendations.html)。 *Amazon EC2 *

若要進一步了解生命週期關聯，請參閱下列資源。
+ [教學課程：設定叫用 Lambda 函數的 lifecycle hook](tutorial-lifecycle-hook-lambda.md) (使用 EventBridge)
+ [教學課程：使用資料指令碼和執行個體中繼資料來擷取生命週期狀態](tutorial-lifecycle-hook-instance-metadata.md)

## 限制
<a name="capacity-rebalancing-limitations"></a>
+ 只有在執行個體未受到縮減保護的情況下，Amazon EC2 Auto Scaling 才能取代接收重新平衡通知的執行個體。但是，縮減保護不會防止 Spot 中斷的終止。如需詳細資訊，請參閱[使用執行個體縮減保護來控制執行個體終止](ec2-auto-scaling-instance-protection.md)。
+ 容量重新平衡的支援可在所有 AWS 區域 提供 Amazon EC2 Auto Scaling 的商業區域使用，中東 (阿拉伯聯合大公國) 區域除外。