保護您的 Amazon ECS 任務不受縮減事件終止 - Amazon Elastic Container Service

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

保護您的 Amazon ECS 任務不受縮減事件終止

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

某些應用程式需要一種機制來保護關鍵任務,避免任務在使用率較低時或服務部署期間因縮減事件終止。例如:

  • 您擁有佇列處理非同步應用程式,例如影片轉碼工作,即使累積服務使用率很低,其中部分任務仍需要執行數小時。

  • 您有一個遊戲應用程式,將遊戲伺服器作為 Amazon ECS 任務執行,即使所有使用者都已登出,以減少伺服器重新啟動的啟動延遲,仍需要繼續執行。

  • 部署新的程式碼版本時,您需要繼續執行任務,因為重新處理的費用很昂貴。

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

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

任務縮減保護機制

您可以使用 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 任務縮減保護端點

  • Amazon ECS API

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

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

    如需詳細資訊,請參閱《Amazon Elastic Container Service API 參考》中的 UpdateTaskProtectionGetTaskProtection

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

考量事項

使用任務縮減保護之前,請考量下列幾點:

  • 建議使用 Amazon ECS 容器代理程式端點,因為 Amazon ECS 代理程式具有內建的重試機制和更簡單的介面。

  • 您可以為已開啟保護的任務呼叫 UpdateTaskProtection,以重設任務縮減保護過期期間。

  • 判斷任務需要多久才能完成其必要的工作,並相應地設定 expiresInMinutes 屬性。如果您設定的保護過期期間超過必要的時間,則會產生費用,並會在部署新任務時面臨延遲。

  • Amazon ECS 容器代理程式 1.65.0 或更新版本支援任務縮減保護。

    使用較舊版本的 Amazon ECS 容器代理程式可在 Amazon EC2 執行個體上新增此功能的支援,方法是將代理程式更新為最新版本。如需詳細資訊,請參閱更新 Amazon ECS 容器代理程式

  • 部署考量事項:

    • 如果服務使用滾動更新,則會建立新任務,但在 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 許可

任務必須具有具有下列許可的 Amazon ECS 任務角色:

  • ecs:GetTaskProtection:允許 Amazon ECS 容器代理程式呼叫 GetTaskProtection

  • ecs:UpdateTaskProtection:允許 Amazon ECS 容器代理程式呼叫 UpdateTaskProtection