為什麼我的 Amazon ECS 工作會停止運作?

2 分的閱讀內容
0

我想要疑難排解 Amazon Elastic Container Service (Amazon ECS) 任務停止的原因。

簡短說明

您的 Amazon ECS 任務可能會因下列其中一個原因停止:

  • 任務中的必要容器已結束
  • Elastic Load Balancing (ELB) 運作狀態檢查失敗
  • 容器運作狀態檢查失敗
  • 不健康的容器執行個體
  • 基礎架構維護
  • 已觸發服務擴展事件
  • ResourceInitializationError
  • CannotPullContainerError
  • 使用者停止任務

解決方法

您可以使用 DescribeTasks API 查看已停止任務的詳細資料。但是,已停止任務的詳細資料只會在傳回的結果中顯示一小時。若要獲得更多時間來檢視已停止任務的詳細資料,請使用 GitHub 網站中的 AWS CloudFormation 範本。使用範本來儲存在 EventBridge 事件 (任務停止時觸發) 中的 Amazon CloudWatch Logs。

停止的原因

下列是 Amazon ECS 任務可能會停止的常見原因。

任務中的必要容器已結束

所有任務必須至少具有一個必要容器。如果容器的基本參數標記為 true,而且失敗或停止,則任務中的所有容器都會停止。若要了解任務為何因此原因結束,請使用 DescribeTasks API 來識別結束代碼。然後,完成本文「常見結束代碼」區段中的步驟。

任務未通過 ELB 運作狀態檢查

當任務因 ELB 運作狀態檢查而失敗時,請確認容器安全性群組是否允許來自負載平衡器的流量。請完成下列任務:

  • 定義運作狀態檢查寬限期下限。寬限期會指示服務排程器在具現化任務之後,忽略預先定義時段內的 Elastic Load Balancing 運作狀態檢查。
  • 使用慢速啟動模式。依預設,目標在向目標群組註冊並通過初始運作狀態檢查後,就會收到其請求。慢速啟動模式可在負載平衡器將完整的請求量傳送給目標之前,讓目標先行暖機。
  • 監控服務的 CPU 和記憶體指標。例如,高度佔用 CPU 可能使您的應用程式沒有回應,並導致 502 錯誤。
  • 檢查應用程式日誌中是否有應用程式錯誤。
  • 檢查 ping 連接埠和運作狀態檢查路徑均已正確設定。
  • 使用 Curl 對 Amazon Elastic Compute Cloud (Amazon EC2) 中的健康檢查路徑進行測試,然後確認回應代碼。

容器運作狀態檢查失敗

您可以在 TaskDefinition API 中定義運作狀態檢查。或者,您可以在 Dockerfile 中定義運作狀態檢查。如需詳細資訊,請參閱 Docker 網站上的運作狀態檢查

若要檢視個別容器和任務的健康狀態,請使用 DescribeTasks API 作業。

運作狀態檢查指令結束狀態必須指出容器處於健康狀態。若要檢查容器日誌是否載有應用程式錯誤,請使用任務定義中指定的日誌驅動程式設定。下列是運作狀態檢查狀態的可能值:

  • 0:成功 容器健康且可以使用
  • 1: 不健康 容器並未正常運作
  • 2:保留 請勿使用此結束代碼

(instance i-##) (port #) is unhealthy in (reason Health checks failed) ((執行個體 i-##) (連接埠 # ) 不健康 (運作狀態檢查失敗的原因))

此錯誤訊息指出容器處於不健康狀態。若要對此問題進行疑難排解,請完成下列任務:

  • 確認附加到容器執行個體的安全性群組允許流量。
  • 確認後端已立即成功回應。
  • 將回應時間更新為正確的值。
  • 檢查負載平衡器的存取日誌,以取得詳細資訊。

Service ABCService: ECS is performing maintenance on the underlying infrastructure hosting the task (服務 ABCService:ECS 正在對託管任務的基礎架構執行維護作業)

此錯誤訊息指出任務因任務維護問題而停止。如需詳細資訊,請參閱 Amazon ECS 常見問題集中的 AWS Fargate 任務維護

如果容器執行個體屬於 Auto Scaling 群組,則必須啟動新的容器執行個體,然後安排任務。如需詳細資訊,請參閱驗證 Auto Scaling 群組的擴展活動

ECS service scaling event triggered (已觸發 ECS 服務擴展事件)

此錯誤訊息是標準服務訊息。Amazon ECS 會使用應用程式自動擴展服務來提供此功能。ECS 服務可以自動增加或減少所需的任務數量。若要解決該錯誤訊息,請完成下列任務:

  • 請檢閱是否有關於任務中任何變更的 CloudWatch 警報
  • 檢閱任何已排程且可能影響任務的部署。

ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed (ResourceInitializationError:無法提取密碼或登錄身份驗證:執行資源擷取失敗)

若要疑難排解此錯誤訊息,請參閱如何疑難排解 Amazon ECS 中的 "unable to pull secrets or registry auth" (無法提取密碼或登錄身份驗證) 錯誤訊息?

CannotPullContainerError

此錯誤訊息指出使用的任務執行角色沒有與 Amazon ECS 進行通訊的權限。若要對此問題進行疑難排解,請完成下列任務:

  • 確認任務執行角色具有所需的權限。Amazon ECS 提供名為 AmazonECSTaskExecutionRolePolicy 的受管政策,其中包含適用於大多數使用案例的權限。
  • 確認 Amazon Elastic Container Registry (Amazon ECR) 服務端點可以存取:ecr.region.amazonaws.comdkr.ecr.region.amazonaws.com
  • 對於需要驗證的私有映像,請確認已使用正確的資訊定義 repositoryCredentialscredentialsParameter。如需詳細資訊,請參閱在 Amazon ECS 中使用非 AWS 容器映像

Task stopped by user (使用者停止任務)

此錯誤訊息指出任務收到 StopTask。若要識別啟動呼叫的人員,請在 CloudTrail 中檢視 StopTask 以取得 userIdentity 資訊。

常見結束代碼

下列是常見的結束代碼:

  • 0: 進入點、成功或 CMD 正在完成其執行作業。容器已停止。
  • 1: 意指應用程式錯誤。如需詳細資訊,請檢閱應用程式日誌。
  • 137: 在容器的任務強制結束 (SIGKILL) 時發生。
    如果您在預設的 30 秒期間內沒有回應 SIGTERM,則系統會傳送 SIGKILL 值並強制停止容器。您可以使用 ECS_CONTAINER_STOP_TIMEOUT 參數,在 ECS 容器代理程式上設定預設 30 秒期間。此結束代碼也可能在記憶體不足 (OOM) 的情況下出現。若要驗證是否發生 OOM,請檢閱您的 CloudWatch 指標。
  • 139: 在出現分段錯誤時發生。這通常會在應用程式嘗試存取無法使用的記憶體區域,或存在未設定環境變數或環境變數無效時發生。
  • 255: 在容器中的 ENTRYPOINT CMD 命令因錯誤而失敗時發生。若要確認是否為這項原因,請檢閱您的 CloudWatch 指標。

常見錯誤訊息

下列是常見的錯誤訊息:

No Container Instances were found in your cluster (在您的叢集中找不到任何容器執行個體)

若要解決此錯誤訊息,請檢閱叢集的容器執行個體區段。如果需要,請啟動容器執行個體

InvalidParameterException

若要解決此錯誤訊息,請檢閱您的 TaskDefinition 參數。任何在 TaskDefinition 中定義的參數都必須存在,且 Amazon Resource Name (ARN) 必須正確。確認任務角色任務執行角色具有足夠的權限。

You've reached the limit of the number of tasks that you can run concurrently (您已達到可以同時執行的任務數量限制)

若要解決此錯誤訊息,請檢閱您的限制。如需有關限制的詳細資訊,請參閱 ECS Service Quotas

對於所有其他配額增加請求,請在 AWS Support 主控台中建立案例,然後選擇 Service Limit Increase (提高服務限制)。

AWS 官方
AWS 官方已更新 7 個月前