

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

# 保護 Amazon ECS 任務，避免其因縮減事件而終止
<a name="task-scale-in-protection"></a>

您可以使用 Amazon ECS 任務縮減保護來保護任務，避免任務因服務自動擴展或部署的縮減事件而終止。

某些應用程式需要一種機制來保護關鍵任務，避免任務在使用率較低時或服務部署期間因縮減事件終止。例如：
+ 您擁有佇列處理非同步應用程式，例如影片轉碼工作，即使累積服務使用率很低，其中部分任務仍需要執行數小時。
+ 遊戲應用程式會以 Amazon ECS 任務的形式執行遊戲伺服器，即使所有使用者都已登出，也需要繼續執行，以減少伺服器重新開機的啟動延遲。
+ 部署新的程式碼版本時，您需要繼續執行任務，因為重新處理的費用很昂貴。

若要保護屬於服務的任務不會在縮減事件中終止，請將 `ProtectionEnabled` 屬性設定為 `true`。在將 `ProtectionEnabled` 設定為 true 時，任務預設會受到 2 小時保護。您隨後可以使用 `ExpiresInMinutes` 屬性自訂保護期間。任務的保護時間最短可至 1 分鐘，最長可達 2880 分鐘 (48 小時)。如果您使用的是 AWS CLI，您可以指定 `--protection-enabled`選項。

任務完成必要的工作之後，您可以將 `ProtectionEnabled` 屬性設定為 `false`，以便隨後的縮減事件終止任務。如果您使用的是 AWS CLI，您可以指定 `--no-protection-enabled`選項。

## 任務縮減保護機制
<a name="task-scale-in-protection-mechanisms"></a>

您可以使用 Amazon ECS 容器代理程式端點或 Amazon ECS API 來設定和取得任務縮減保護。
+ **Amazon ECS 容器代理程式端點**

  我們建議將 Amazon ECS 容器代理程式端點，用於可自行判斷是否需要保護的任務。針對以佇列為基礎或工作處理的工作負載使用此方法。

  當容器開始處理工作時 (例如使用 SQS 訊息)，您可以從容器內透過任務縮減保護端點路徑 `$ECS_AGENT_URI/task-protection/v1/state` 來設定 `ProtectionEnabled` 屬性。Amazon ECS 不會在縮減事件期間終止此任務。在任務完成工作之後，您可以使用相同的端點清除對 `ProtectionEnabled` 屬性的設定，使任務符合在後續縮減事件期間終止的資格。

  如需有關 Amazon ECS 容器代理程式端點的詳細資訊，請參閱 [Amazon ECS 任務縮減保護端點](task-scale-in-protection-endpoint.md)。
+ **Amazon ECS API**

  如果應用程式具有追蹤作用中任務狀態的元件，則可使用 Amazon ECS API 來設定與擷取任務縮減保護。使用 `UpdateTaskProtection` 將一或多個任務標記為受保護。使用 `GetTaskProtection` 擷取保護狀態。

  如果應用程式以 Amazon ECS 任務的形式託管遊戲伺服器工作階段，則可使用此方法。當使用者登入伺服器 (任務) 上的工作階段時，您可以將任務標示為受保護。使用者登出後，您可以清除專門針對此任務的保護設定，或根據您希望伺服器保持閒置的需求，定期清除不再具有作用中工作階段的類似任務的保護設定。

  如需詳細資訊，請參閱 *Amazon Elastic Container Service API Reference* 中的 [UpdateTaskProtection](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateTaskProtection.html) 與 [GetTaskProtection](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_GetTaskProtection.html)。

您可以將這兩種方法結合起來使用。例如，使用 Amazon ECS 代理程式端點，從容器內設定任務保護，並使用 Amazon ECS API，從外部控制器服務移除對任務保護的設定。

## 考量事項
<a name="task-scale-in-protection-considerations"></a>

使用任務縮減保護之前，請考量下列幾點：
+ 任務縮減保護僅支援從服務部署的任務。
+ 任務縮減保護支援從在 Amazon ECS 受管執行個體上執行的服務部署的任務。
+ 建議使用 Amazon ECS 容器代理程式端點，因為 Amazon ECS 代理程式具有內建的重試機制和更簡單的介面。
+ 您可以為已開啟保護的任務呼叫 `UpdateTaskProtection`，以重設任務縮減保護過期期間。
+ 判斷任務需要多久才能完成其必要的工作，並相應地設定 `expiresInMinutes` 屬性。如果您設定的保護過期期間超過必要的時間，則會產生費用，並會在部署新任務時面臨延遲。
+ Amazon ECS 容器代理程式 `1.65.0` 或更新版本支援任務縮減保護。使用較舊版本的 Amazon ECS 容器代理程式可在 Amazon EC2 執行個體上新增此功能的支援，方法是將代理程式更新為最新版本。如需詳細資訊，請參閱[更新 Amazon ECS 容器代理程式](ecs-agent-update.md)。
+ 部署考量事項：
  + 如果服務使用滾動更新，則會建立新任務，但在 `protectionEnabled` 設定清除或過期之前執行舊版本的任務都不會終止。您可以將部署組態中的 `maximumPercentage` 參數調整為可允許在舊任務受保護時建立新任務的值。
  + 如果套用了藍/綠更新，若任務有 `protectionEnabled`，則不會移除具有受保護任務的藍色部署。流量將轉移至新啟動的任務，而且只有在 `protectionEnabled` 清除或過期時才會移除較舊的任務。視 CodeDeploy 或 CloudFormation 更新的逾時而定，部署可能會逾時，而較舊的藍色任務可能仍會存在。
  + 如果您使用 CloudFormation，則更新堆疊會有 3 小時的逾時。因此，如果您將任務保護設定為 3 小時以上，則 CloudFormation 部署可能會導致失敗和復原。

    在您的舊任務受到保護期間，CloudFormation 堆疊會顯示 `UPDATE_IN_PROGRESS`。如果任務縮減保護遭移除或在 3 小時視窗內過期，部署將會成功並變為 `UPDATE_COMPLETE` 狀態。如果部署停滯在 `UPDATE_IN_PROGRESS` 的時間超過 3 小時，其將失敗並顯示 `UPDATE_FAILED` 狀態，然後會復原至舊任務集。
  + 當受保護的任務導致部署 (滾動或藍/綠) 無法進入穩定狀態，Amazon ECS 會傳送服務事件，以便您採取補救措施。嘗試更新任務的受保護狀態時，如果您收到 `DEPLOYMENT_BLOCKED` 錯誤訊息，則表示該服務的受保護任務比服務所需的任務計數更多。若要解決此錯誤，請執行以下其中一個動作：
    + 等待目前的任務保護過期。然後設定任務保護。
    + 判斷可以停止哪些任務。然後使用 `UpdateTaskProtection`，並將 `protectionEnabled` 選項設為 `false` 來完成這些任務。
    + 將服務的所需任務計數提高到超過受保護任務的數目。

## 任務縮減保護所需的 IAM 許可
<a name="task-scale-in-protection-iam"></a>

任務必須具備具有如下許可的 Amazon ECS 任務角色：
+ `ecs:GetTaskProtection`：允許 Amazon ECS 容器代理程式呼叫 `GetTaskProtection`。
+ `ecs:UpdateTaskProtection`：允許 Amazon ECS 容器代理程式呼叫 `UpdateTaskProtection`。