

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

# 在可用區域之間平衡 Amazon ECS 服務
<a name="service-rebalancing"></a>

自 2025 年 9 月 5 日起，Amazon ECS 會為所有符合功能資格的服務啟用可用區域重新平衡。當可用區域分佈是第一項任務置放策略，或者沒有置放策略時，服務即符合資格。

為了協助讓應用程式達到高可用性，建議您將多任務服務設定為在多個可用區域中執行。對於將第一個置放策略指定為可用區域分散的服務， AWS 會盡最大努力跨可用區域平均分配服務任務。

但是，在某個可用區域中執行的任務數目，有時可能會與其他可用區域中執行的任務數目不相同，例如在可用區域中斷之後。若要解決此任務不平衡情況，您可以啟用可用區域重新平衡功能。

Amazon ECS 會利用可用區域重新平衡功能，持續監控您每項服務的可用區域之間的任務分佈。當 Amazon ECS 偵測到任務分佈不均勻時，便會自動採取行動來重新平衡可用區域之間的工作負載。這包括在任務最少的可用區域中啟動新任務，以及終止超載的可用區域中的任務。

這種重新分佈可確保不會有單一可用區域成為失敗點，有助於維持容器化應用程式的整體可用性。有了自動重新平衡程序，就不需手動介入操作，且能加快事件後復原的時間。

下列是可用區域重新平衡程序的概觀：

1. Amazon ECS 會在服務達到穩定狀態後開始監控服務，並查看每個可用區域中的執行中任務數量。

1. 當 Amazon ECS 偵測到每個可用區域中執行的任務數量不平衡時，會執行下列操作：
   + 傳送指示可用區域重新平衡即將啟動的服務事件。
   + 在執行中任務數量最少的可用區域中啟動任務
   + 在執行中任務數量最多的可用區域中停止任務。
   + 排程器會等待新啟動的任務變為 `HEALTHY` 與 `RUNNING`，然後在過度擴展的可用區域中停止任務。
   + 傳送具有可用區域重新平衡結果的服務事件。

## Amazon ECS 如何偵測任務分佈不均問題
<a name="service-rebalancing-imbalance"></a>

Amazon ECS 透過將服務所需的任務計數除以設定的可用區域數量，來判斷每個可用區域中的執行中任務數量是否不平衡。如果所需任務計數不能整除，Amazon ECS 會將剩餘的任務均勻分佈到設定的可用區域。每個可用區域必須有至少一項任務。

例如，假設 Amazon ECS 服務所需計數為針對兩個可用區域設定的兩項任務。在這種情況下，所需任務計數可以整除。平衡分佈應為每個可用區域一項任務。如果可用區域 1 中有兩項任務，可用區域 2 中有零項任務，則 Amazon ECS 將透過在可用區域 2 中啟動任務，然後在可用區域 1 中停止任務來啟動重新平衡。

現在，假設 Amazon ECS 服務所需計數為針對兩個可用區域設定的三項任務。在這種情況下，所需任務計數不能整除。平衡分佈應為可用區域 1 中一項任務，可用區域 2 中兩項任務，因為每個可用區域有至少一項任務，且剩餘的任務會置放在可用區域 2 中。

假設 Amazon ECS 服務所需計數為針對三個可用區域設定的五項任務。在這種情況下，所需任務計數不能整除。平衡分佈應為可用區域 1 中一項任務，可用區域 2 與 3 中各兩項任務。在確保每個可用區域都有一項任務後，剩餘的兩項任務會均勻分佈到各可用區域。

## 設定可用區域重新平衡的考量
<a name="service-rebalancing-configurations"></a>

若要設定可用區域重新平衡，請考量下列事項：
+ 可用區域重新平衡支援 Fargate 與 EC2 容量提供者，並在 Amazon ECS 受管執行個體上受支援。對於 Fargate，Amazon ECS 會自動在可用區域中重新分佈任務，以維持平衡。對於 EC2 容量提供者，Amazon ECS 會盡力重新平衡現有容器執行個體間的任務，同時遵循您定義的置放策略與限制條件。但是，在重新平衡程序中，Amazon ECS 無法在使用率不足的可用區域中啟動新的執行個體，這會將重新平衡限制在現有容器執行個體的範圍內。
+ 可用區域重新平衡適用於下列組態：
  + 使用 `Replica` 策略的服務
  + 將可用區域分佈指定為第一項任務置放策略，或未指定置放策略的服務。
+ 您無法搭配符合下列任一條件的服務使用可用區域重新平衡：
  + 使用 `Daemon` 策略
  + 使用 `EXTERNAL` 啟動類型 (ECS Anywhere)
  + 對 `maximumPercent` 值使用 100%
  + 使用 Classic Load Balancer
  + 使用 `attribute:ecs.availability-zone` 作為任務置放限制條件

## 使用可用區域重新平衡的置放策略與置放限制條件
<a name="service-rebalancing-placement-constraints"></a>

置放策略決定了 Amazon ECS 如何選取容器執行個體與可用區域來終止任務置放。任務置放限制條件是判斷是否允許任務在特定容器執行個體上執行的規則。

對於 EC2，您可以搭配可用區域重新平衡使用置放策略與置放限制條件。不過，為了讓可用區域重新平衡正常運作，可用區域分佈置放策略必須是第一項指定的策略。

可用區域重新平衡與各種置放策略組合相容。例如，您可以建立一項策略，先將任務均勻分佈到各個可用區域，然後根據每個可用區域內的記憶體對任務進行分箱封裝。在這種情況下，可用區域重新平衡能夠運作，因為會先指定可用區域分佈策略。

請務必注意，如果置放策略陣列中的第一項策略不是可用區域分佈元件，可用區域重新平衡將無法運作。此需求可確保任務分佈的主要重點是維持可用區域之間的平衡，這對高可用性至關重要。

如需有關任務置放策略與限制條件的詳細資訊，請參閱 [Amazon ECS 如何在容器執行個體上置放任務](task-placement.md)。

使用 Fargate 的任務不支援任務置放策略與限制條件。Fargate 將盡力將任務分散至可存取的可用區域。如果容量提供者同時包含 Fargate 和 Fargate Spot，則每個容量提供者的分散行為均各自獨立。

下列範例策略會將任務均勻分佈到各個可用區域，然後根據每個可用區域內的記憶體對任務進行分箱封裝。由於 `spread` 策略是第一項策略，可用區域重新平衡與該服務相容。

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    },
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

## 開啟可用區域重新平衡功能
<a name="service-rebalancing-use"></a>

您需要為新服務與現有服務啟用可用區域重新平衡功能。

您可以使用主控台 AWS CLI、APIs 和 來啟用和停用可用區域重新平衡 CloudFormation。

`AvailabilityZoneRebalancing` 的預設行為在建立與更新請求之間有所不同：
+ 對於建立服務請求，如果未為 `AvailabilityZoneRebalancing` 指定值，Amazon ECS 會將該值預設為 `ENABLED`。
+ 對於更新服務請求，如果未為 `AvailabilityZoneRebalancing` 指定值，Amazon ECS 預設會使用現有服務的 `AvailabilityZoneRebalancing` 值。如果服務從未設定 `AvailabilityZoneRebalancing` 值，Amazon ECS 會將其視為 `DISABLED`。


| 服務類型 | API | 主控台 | CLI | 
| --- | --- | --- | --- | 
| 現有 | [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html) |  [更新 Amazon ECS 服務](update-service-console-v2.md)  | [update-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/update-service.html) | 
| 新增 | [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html) |  [建立 Amazon ECS 滾動更新部署](create-service-console-v2.md)  | [create-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html) | 

下列範例說明如何在建立新服務時啟用服務重新平衡：

```
aws ecs create-service \
    --cluster my-cluster \
    --service-name my-service \
    --task-definition my-task-definition:1 \
    --desired-count 6 \
    --availability-zone-rebalancing ENABLED
```

## 對服務重新平衡進行疑難排解
<a name="service-rebalancing-troubleshooting"></a>

如果您在重新平衡服務時遇到問題，請考慮下列疑難排解步驟：

重新平衡未啟動  
請驗證：  
+ 服務已啟用服務重新平衡
+ 服務使用支援組態 (請參閱[設定可用區域重新平衡的考量](#service-rebalancing-configurations))
+ 服務已達到穩定狀態

重新平衡期間任務置放失敗  
如果您看到 `SERVICE_TASK_PLACEMENT_FAILURE` 事件：  
+ 對於 EC2：檢查目標可用區域中是否有可用的容器執行個體
+ 對於 Fargate：檢查是否存在資源限制條件或服務配額限制了任務置放
+ 檢閱任務置放限制條件，確保它們不會阻止適當的任務分佈

重新平衡意外停止  
如果您看到 `SERVICE_REBALANCING_STOPPED` 事件：  
+ 檢查是否存在可能封鎖操作的任務保護
+ 尋找可能中斷重新平衡的並行服務部署
+ 檢閱服務事件，以取得有關為何停止重新平衡的其他資訊

## 服務重新平衡的最佳實務
<a name="service-rebalancing-best-practices"></a>

遵循以下最佳實務以充分利用服務重新平衡：
+ **監控重新平衡操作** – 設定 CloudWatch 警示來監控與重新平衡相關的服務事件，以便快速識別任何問題。
+ **考慮效能影響** – 重新平衡操作可能會暫時增加資源使用量，因為新任務會在舊任務停止之前啟動。
+ **策略性使用任務保護** – 如果有關鍵任務不應在重新平衡期間終止，請考慮使用任務保護。
+ **制定 EC2 容量計畫** – 對於 EC2，請確保所有可用區域中擁有足夠的容器執行個體，能夠支援重新平衡有效運作。
+ **測試重新平衡行為** – 在生產環境中依賴重新平衡之前，請在非生產環境中測試服務在重新平衡操作期間的行為。