

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

# Amazon ECS 部署斷路器如何偵測失敗
<a name="deployment-circuit-breaker"></a>

部署斷路器是可確定任務是否達到穩定狀態的滾動式更新機制。部署斷路器邏輯有一個選項，可將失敗的部署自動復原至處於 `COMPLETED` 狀態的部署。

當開始服務部署變更狀態時，Amazon ECS 會傳送服務部署狀態變更事件至 EventBridge。這提供一種程式設計方式來監控您的服務部署的狀態。如需詳細資訊，請參閱[Amazon ECS 服務部署狀態變更事件](ecs_service_deployment_events.md)。建議您使用 `SERVICE_DEPLOYMENT_FAILED` 的 `eventName` 建立和監控 EventBridge 規則，以便您可以採取手動動作來啟動部署。如需詳細資訊，請參閱 *Amazon EventBridge User Guide* 中的 [Getting started with EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)。

當部署斷路器判斷部署失敗時，會尋找處於 `COMPLETED` 狀態的最新部署。這是部署斷路器用來做為復原部署的部署。復原開始時，部署會從 `COMPLETED` 變更為 `IN_PROGRESS`。這表示在部署達到 `COMPLETED` 狀態之前，不符合另一個復原的資格。當部署斷路器找不到處於 `COMPLETED` 狀態的部署時，斷路器不會啟動新任務，且會阻礙部署。

建立服務時，排程器會追蹤兩個階段中啟動失敗的任務。
+ 階段 1 – 排程器會監控任務，檢查其是否轉換為 RUNNING 狀態。
  + 成功 – 部署有機會轉換為 COMPLETED 狀態，因為有多項任務已轉換為 RUNNING 狀態。系統會略過失敗條件，且斷路器會移至階段 2。
  + 失敗 – 有連續任務未能轉換為 RUNNING 狀態，且部署可能會轉換為 FAILED 狀態。
+ 階段 2 – 當至少有一項任務處於 RUNNING 狀態時，部署會進入此階段。斷路器會檢查目前部署中正在評估的任務的運作狀態檢查。驗證的運作狀態檢查為 Elastic Load Balancing、 AWS Cloud Map 服務運作狀態檢查和容器運作狀態檢查。
  + 成功 – 至少有一項處於執行中狀態的任務通過了運作狀態檢查。
  + 失敗 – 因運作狀態檢查失敗而被取代的任務達到了失敗閾值。

當您對服務使用部署斷路器方法時，請考量下列事項。EventBridge 產生規則。
+ `DescribeServices` 回應可提供部署狀態洞察，`rolloutState` 和 `rolloutStateReason`。當啟動新的部署時，推展狀態從 `IN_PROGRESS` 狀態開始。當服務到達穩定狀態時，推展狀態轉移到 `COMPLETED`。若服務無法達到穩定狀態，而斷路器已開啟，則部署將轉換為 `FAILED` 狀態。處於 `FAILED` 狀態的部署不會啟動任何新任務。
+ 除 Amazon ECS 為已開始和已完成的部署傳送服務部署狀態變更事件以外，Amazon ECS 還會在開啟的斷路器部署失敗時傳送事件。這些事件提供有關部署失敗原因的詳細資訊，或者部署是否因為回復而開始。如需詳細資訊，請參閱[Amazon ECS 服務部署狀態變更事件](ecs_service_deployment_events.md)。
+ 如果新的部署因為先前的部署失敗並發生復原而開始，服務部署狀態變更事件的 `reason` 欄位將指示部署因為復原而開始。
+ 部署斷路器僅支援使用滾動更新 (`ECS`) 部署控制器的 Amazon ECS 服務。
+ 當您搭配 CloudWatch 選項使用部署斷路器 AWS CLI 時，必須使用 Amazon ECS 主控台或 。如需詳細資訊，請參閱《AWS Command Line Interface 參考》**中的 [使用定義的參數建立服務](create-service-console-v2.md#create-custom-service) 和 [create-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html)。

下列`create-service` AWS CLI 範例顯示當部署斷路器與復原選項搭配使用時，如何建立 Linux 服務。

```
aws ecs create-service \
     --service-name {{MyService}} \
     --deployment-controller type={{ECS}} \
     --desired-count {{3}} \
     --deployment-configuration "deploymentCircuitBreaker={enable={{true}},rollback={{true}}}" \
     --task-definition {{sample-fargate:1}} \
     --launch-type {{FARGATE}} \
     --platform-family {{LINUX}} \
     --platform-version {{1.4.0}} \
     --network-configuration "awsvpcConfiguration={subnets=[{{subnet-12344321}}],securityGroups=[{{sg-12344321}}],assignPublicIp={{ENABLED}}}"
```

範例：

部署 1 處於 `COMPLETED` 狀態。

部署 2 無法啟動，因此斷路器會復原至部署 1。部署 1 會轉換至 `IN_PROGRESS` 狀態。

部署 3 會啟動，且 `COMPLETED` 狀態中沒有部署，因此部署 3 無法復原或啟動任務。

## Failure threshold
<a name="failure-threshold"></a>

部署斷路器會計算閾值，然後使用該值判斷何時將部署移動到 `FAILED` 狀態。

部署斷路器的最小閾值為 3，最大閾值為 200。 會使用下列公式中的值來判斷部署失敗。

```
Minimum threshold <= 0.5 * {{desired task count}} => maximum threshold
```

當計算結果大於最小值 3，但小於最大值 200 時，失敗閾值會設定為計算閾值 （四捨五入）。

**注意**  
您不能更改任何一個閾值。

部署狀態檢查有兩個階段。

1. 部署斷路器監視部署過程中的任務，並檢查處於 `RUNNING` 狀態的任務。當目前部署中的任務處於 `RUNNING` 狀態時，排程器會忽略故障條件，並繼續進行到下一個階段。當任務無法到達 `RUNNING` 狀態時，部署斷路器會在故障計數上增加一。當故障計數等於閾值時，部署將標記為 `FAILED`。

1. 如果一項或多項任務處於 `RUNNING` 狀態，則會進入此階段。部署斷路器對目前部署中的任務，針對以下資源執行運作狀態檢查：
   + Elastic Load Balancing 負載平衡器
   + AWS Cloud Map 服務
   + Amazon ECS 容器運作狀態檢查

   當任務的運作狀態檢查失敗時，部署斷路器會在故障計數上增加一。當故障計數等於閾值時，部署將標記為 `FAILED`。

下表提供一些範例。


| 所需的任務計數 | 計算 | Threshold | 
| --- | --- | --- | 
| 1 |  <pre>3 <= 0.5 * 1 => 200</pre>  | 3 （計算值小於最小值） | 
| 25 |  <pre>3 <= 0.5 * 25 => 200</pre>  | 13 (值會無條件進位) | 
| 400 |  <pre>3 <= 0.5 * 400 => 200</pre>  | 200 | 
| 800 |  <pre>3 <= 0.5 * 800 => 200</pre>  | 200 (計算值大於最大值) | 

例如，當閾值為 3 時，斷路器會從失敗計數設定為 0 開始。當任務未能達到 `RUNNING` 狀態時，部署斷路器會在失敗計數上增加一。當失敗計數等於 3 時，部署將標記為 `FAILED`。

如需有關使用復原選項的其他範例，請參閱 [Announcing Amazon ECS deployment circuit breaker](https://aws.amazon.com/blogs/containers/announcing-amazon-ecs-deployment-circuit-breaker/) (推出 Amazon ECS 部署斷路器)。