本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
保護您的 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 參考》中的 UpdateTaskProtection 和 GetTaskProtection。
您可以將這兩種方法結合起來使用。例如,使用 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
。