Amazon Elastic Container Service (Amazon ECS) 任務停止。如何解決 Amazon ECS 任務停止的問題?
簡短描述
Amazon ECS 任務可能會因為許多原因停止。最常見的可能原因為:
- 基本容器退出
- 彈性負載平衡 (ELB) 運作狀態檢查失敗
- 容器運作狀態檢查失敗
- 不正常的容器執行個體
- 底層基礎設施維護
- 觸發了服務擴展事件
- ResourceInitializationError
- CannotPullContainerError
- 使用者已停止任務
了解停止的任務與停止原因之間的關聯有助於減少疑難排解所需的工作量。
解決方案
您可以使用 DescribeTasks API 查看停止任務的詳細資訊。但是,停止任務的詳細資訊僅會在返回結果後的一小時內顯示。要在之後查看停止任務的詳細資訊,您可以使用此 AWS CloudFormation 範本來存放任務停止時觸發的 EventBridge 事件的 Amazon CloudWatch Logs。
停止原因
任務的基本容器退出
所有任務都必須至少有一個基本容器。如果容器的基本參數被標記為 True,並且該容器因任何原因而失敗或停止,則該任務中的所有其他容器都將停止。要了解任務為什麼會因此原因退出,請使用 DescribeTasks API 確定退出代碼,然後前往本文的「常見退出代碼」部分查看。
任務的 ELB 運作狀態檢查失敗
當任務由於 ELB 運作狀態檢查失敗而停止時,請確認您的容器安全群組允許來自 ELB 的通訊。考慮以下事項:
- 定義最小運作狀態檢查寬限期。這會給予服務排程器一項指示,使其於任務執行個體化後的一段預先定義的期間內,忽略彈性負載平衡運作狀態檢查。
- 預設情況下,目標在向目標群組註冊並通過初始運作狀態檢查後,會立即開始接收全部的請求份額。使用慢速啟動模式可在負載平衡器傳送全部的請求份額前,為目標的啟動提供緩衝時間。
- 監控服務的 CPU 和記憶體指標。例如,高 CPU 使用率可能會使應用程式無回應並導致 502 錯誤。
- 檢查應用程式日誌中的應用程式錯誤。
- 檢查 Ping 端口和運作狀態檢查路徑是否正確設定。
- 從 Amazon Elastic Compute Cloud (Amazon EC2) 中訪問 (Curl) 運作狀態檢查路徑,並確認回應代碼。
容器運作狀態檢查失敗
運作狀態檢查可以在 TaskDefinition API 或 Dockerfile 中定義。
您可以使用 DescribeTasks API 指令查看個別容器和任務的運作狀態。
確保運作狀態檢查指令的退出狀態顯示容器正常。使用任務定義中指定的日誌驅動程式設定來檢查容器日誌中的應用程式錯誤。以下是可能的值:
- 0:成功 – 容器運作狀態正常,可供使用。
- 1:運作狀態不佳 – 容器無法正常工作。
- 2:保留 – 不要使用此退出代碼。
(執行個體 i-xx) (端口 x) 運作狀態不佳 (運作狀態檢查失敗的原因)
這表示容器的運作狀態不正常。對此問題進行疑難排解:
- 確認連接到容器執行個體的安全群組允許通訊。
- 確認後端能否成功且無延遲的回應。
- 正確設定回應時間值。
- 請查看負載平衡器的存取日誌以進一步了解。
服務 ABCService:ECS 正對執行任務的底層基礎設施進行維護
這表示任務是因維護問題而停止。請參閲 AWS Fargate 任務維護以進一步了解。
服務會確保遵循指定的排程策略,並在停止或失敗時重新規劃任務的執行時間。如果容器執行個體是 Auto Scaling 群組的一部分。則必須啟動新容器執行個體並指派任務。請參閲驗證 Auto Scaling 群組的擴展活動以進一步了解。
觸發 ECS 服務擴展事件
這是一則標準服務訊息。Amazon ECS 利用應用程式自動擴展服務來提供此功能。ECS 能夠自動增加或減少所需的任務數。請考慮採取以下動作:
ResourceInitializationError:無法提取密碼或登錄檔授權:執行資源檢索失敗
要對此錯誤進行疑難排解,請參閱如何對 Amazon ECS 中的 "unable to pull secrets or registry auth" (無法提取密碼或登錄檔授權) 錯誤進行疑難排解?
CannotPullContainerError
此錯誤表示正在使用的任務執行角色沒有與 Amazon ECS 通訊的權限。對此問題進行疑難排解:
- 驗證任務執行角色是否具有所需的權限。Amazon ECS 提供名為 AmazonECSTaskExecutionRolePolicy 的受管政策,其包含大多數使用案例所需的權限。
- 驗證 ECR 服務端點是否可透過以下方式存取:ecr.region.amazonaws.com 和 dkr.ecr.region.amazonaws.com
- 對於需要身分驗證的私有映像,請確保使用正確的資訊定義 repositoryCredentials 和 credentialsParameter。請參閲任務的私有登錄檔身分驗證以了解更多。
使用者已停止任務
這表示任務已收到 StopTask 指令。您可以在 CloudTrail 中查看 StopTask 的 userIdentity 資訊,以確認是誰發起此呼叫。
常見的退出代碼
- 0 – 入口點、成功或 CMD 正在完成其執行,因此容器停止。
- 1 – 表示應用程式發生錯誤。有關詳細資訊,請查看應用程式日誌。
- 137 – 當任務因容器而強制退出 (SIGKILL) 時出現,容器為:
在 SIGKILL 傳送後,未能在預設的 30 秒內回應 SIGTERM,強制停止容器。預設的 30 秒可於 ECS 容器代理使用 ECS_CONTAINER_STOP_TIMEOUT 參數設定。
在記憶體不足 (OOM) 的情況下也可能發生這種情況。查看您的 CloudWatch 指標以確認是否發生了 OOM 的情況。
- 139 – 分段錯誤發生時出現。例如應用程式試圖存取不可用的記憶體區域,或者存在未設定或無效的環境變數。
- 255 – 當容器的 ENTRYPOINT CMD 命令由於錯誤而失敗時出現。查看 CloudWatch 日誌以確認這一點。
常見的錯誤訊息
在叢集中未找到容器執行個體
查看叢集中的容器執行個體部分。如果需要,您可以啟動容器執行個體。
InvalidParameterException
確保在 TaskDefinition 中定義的任何參數都存在,並且 ARN 是正確的。確認任務角色和任務執行角色擁有足夠的權限。
您已達到可同時運作的任務數量限制
有關限制的詳細資訊,請參閲 ECS Service Quotas。
對於全部其他的配額增加請求,請在 AWS Support 主控台中建立案例,然後選擇 Service limit increase (提高服務限制)。