當我在 Amazon Elastic Container Service (Amazon ECS) 叢集中部署新服務時,任務會錯誤地部署或終止。
解決方法
請確認您使用的容器具有足夠的資源容量
如果新部署持續未能通過負載平衡器運作狀態檢查,請檢查 CpuUtilized、CpuReserved 和 MemoryUtilized Amazon ECS Container Insights 指標。如果您使用的是 Application Load Balancer,也請檢查TargetResponseTime。
此外,請將 HealthCheckGracePeriodSeconds 屬性設定為一個比應用程式啟動時間更長的值。延遲的運作狀態檢查回應可能會導致故障,並促使 Amazon ECS 重新輪替任務。
檢查容器狀態和結束代碼
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
對於意外終止的任務,請執行以下 describe-tasks 命令來檢查容器的結束代碼:
aws ecs describe-tasks --cluster ECS_CLUSTER --tasks TASK_ARN -- region REGION
**注意:**將 ECS_CLUSTER 替換為您的叢集名稱,將 TASK_ARN 替換為您的任務 ARN,並將 REGION 替換為您的 AWS 區域。
如果上述命令的輸出為 0,則表示任務已成功啟動。如果輸出為 1,則表示出現應用程式錯誤,您必須檢查應用程式日誌。如果輸出為 137,則表示容器收到了 SIGKILL 訊號,這通常是由記憶體不足問題所導致。若要解決此問題,請參閱如何對 Amazon ECS 中的 OutOfMemory 錯誤進行疑難排解?和為什麼我的 Amazon ECS 任務停止了?
檢查任務定義組態
請確保所有任務定義組態皆為有效,尤其是在修改或建立新的任務定義之後。若要確認您的任務定義組態,請執行獨立任務。
設定負載平衡器設定
請根據您的需求,設定負載平衡器的 deregistration_delay.timeout_seconds。對於長時間持續的請求,請使用較高的值。對於 Amazon Elastic Compute Cloud (Amazon EC2) Spot 執行個體,此值必須低於 120 秒。
若要修改 deregistration_delay.timeout_seconds,請執行以下 modify-target-group-attributes 命令:
aws elbv2 modify-target-group-attributes --target-group-arn
EXAMPLE_ARN --attributes Key=deregistration_delay.timeout_seconds,Value=120
**注意:**將 EXAMPLE_ARN 替換為您的負載平衡器 ARN,並將 120 替換為取消註冊延遲逾時時間 (以秒為單位)。
此外,最佳化負載平衡器的運作狀態檢查設定。如果設定對於您的應用程式而言過於嚴格,負載平衡器可能會頻繁地將目標標記為運作不良。
設定應用程式的正常關閉時間
預設情況下,ECS_CONTAINER_STOP_TIMEOUT 設為 30 秒。當您在新的 Amazon ECS 部署中,於前一批任務的清空階段存取應用程式時,可能會收到 5xx 錯誤。如果您在存取應用程式時發生問題,請根據應用程式的正常關閉需求,增加 ECS_CONTAINER_STOP_TIMEOUT 的值。最佳實務是在部署更新的值之前,在測試環境中對其進行測試。
若要更新該值,請將類似以下範例的程式碼新增至您的任務定義:
{
"containerDefinitions": [
{
"name": "your-container",
"image": "your-image",
"stopTimeout": 120
}
]
}
**注意:**將 120 替換為您的 ECS_CONTAINER_STOP_TIMEOUT 值。
若要設定正常關閉,請在應用程式中新增 SIGTERM 處理常式。對於 AWS Fargate Spot,請設定組態以在 SIGTERM 處理常式中呼叫 DeregisterTargets。這可確保 Amazon ECS 從負載平衡器的目標群組中取消註冊 FARGATE_SPOT 任務。
相關資訊
為 Amazon ECS 最佳化負載平衡器的連接耗盡參數