

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

# 對 Amazon ECS 部署問題進行故障診斷
<a name="troubleshooting-ecs"></a>

**Topics**
+ [等待替換任務集時發生逾時](#troubleshooting-ecs-timeout)
+ [等待通知繼續時發生逾時](#troubleshooting-ecs-timeout-notif)
+ [IAM 角色沒有足夠的許可](#troubleshooting-ecs-iam)
+ [部署在等待狀態回呼時逾時](#troubleshooting-ecs-timeout-callback)
+ [部署失敗，因為一或多個生命週期事件驗證函數失敗](#troubleshooting-ecs-lifecycle)
+ [由於下列錯誤，ELB 無法更新：主要任務集目標群組必須位於接聽程式後方](#troubleshooting-ecs-elb)
+ [使用 Auto Scaling 時，我的部署有時會失敗](#troubleshooting-ecs-auto-scaling)
+ [只有 ALB 支援逐步流量路由，請在建立/更新部署群組時使用 AllAtOnce 流量路由](#troubleshooting-ecs-lb)
+ [即使我的部署成功，替代任務集仍無法通過 Elastic Load Balancing 運作狀態檢查，而且我的應用程式已關閉](#troubleshooting-ecs-task-set-stability)
+ [我可以將多個負載平衡器連接到部署群組嗎？](#troubleshooting-ecs-lb-multi)
+ [我可以在沒有負載平衡器的情況下執行 CodeDeploy 藍/綠部署嗎？](#troubleshooting-ecs-lb-bg)
+ [如何在部署期間使用新資訊更新 Amazon ECS 服務？](#troubleshooting-ecs-exec)

## 等待替換任務集時發生逾時
<a name="troubleshooting-ecs-timeout"></a>

**問題**：使用 CodeDeploy 部署 Amazon ECS 應用程式時，您會看到下列錯誤訊息：

`The deployment timed out while waiting for the replacement task set to become healthy. This time out period is 60 minutes.`

**可能原因**：如果您的任務定義檔案或其他部署相關檔案發生錯誤，可能會發生此錯誤。例如，如果您的任務定義檔案中的 `image` 欄位有錯別字，Amazon ECS 會嘗試提取錯誤的容器映像並持續失敗，導致此錯誤。

**可能的修正和後續步驟**：
+ 修正任務定義檔案和其他檔案中的印刷錯誤和組態問題。
+ 檢查相關的 Amazon ECS 服務事件，並了解取代任務無法正常運作的原因。如需 Amazon ECS 事件的詳細資訊，請參閱《[Amazon Elastic Container Service 開發人員指南》中的 Amazon ECS 事件](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html)。 **
+ 請參閱《[Amazon Elastic Container Service 開發人員指南》中的 Amazon ECS 疑難排解](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/troubleshooting.html)一節，了解與事件中訊息相關的錯誤。 **

## 等待通知繼續時發生逾時
<a name="troubleshooting-ecs-timeout-notif"></a>

**問題**：使用 CodeDeploy 部署 Amazon ECS 應用程式時，您會看到下列錯誤訊息：

 `The deployment timed out while waiting for a notification to continue. This time out period is n minutes.` 

**可能原因**：如果您在建立部署群組時在**指定重新路由流量**欄位中指定等待時間，但部署無法在等待時間過期之前完成，則可能會發生此錯誤。

**可能的修正和後續步驟**：
+ 在您的部署群組中，設定**指定何時將流量重新路由**到更長的時間並重新部署。如需詳細資訊，請參閱[建立 Amazon ECS 部署的部署群組 （主控台）](deployment-groups-create-ecs.md)。
+ 在您的部署群組中，變更**指定何時立即將流量重新路由**至**重新路由流量**並重新部署。如需詳細資訊，請參閱[建立 Amazon ECS 部署的部署群組 （主控台）](deployment-groups-create-ecs.md)。
+ 重新部署 ，然後執行 [https://docs.aws.amazon.com/cli/latest/reference/deploy/continue-deployment.html](https://docs.aws.amazon.com/cli/latest/reference/deploy/continue-deployment.html) AWS CLI 命令，並將 `--deployment-wait-type`選項設定為 `READY_WAIT`。請務必在**指定何時重新路由流量**過期中指定的時間*之前*執行此命令。

## IAM 角色沒有足夠的許可
<a name="troubleshooting-ecs-iam"></a>

**問題**：使用 CodeDeploy 部署 Amazon ECS 應用程式時，您會看到下列錯誤訊息：

 `The IAM role role-arn does not give you permission to perform operations in the following AWS service: AWSLambda.` 

**可能原因**：如果您在 [AppSpec 檔案的 `Hooks`區段](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs)中指定 Lambda 函數，但未將 CodeDeploy 許可授予 Lambda 服務，則可能會發生此錯誤。

**可能修正**：將 `lambda:InvokeFunction` 許可新增至 CodeDeploy 服務角色。若要新增此許可，請將下列其中一個 AWS受管政策新增至角色： **AWSCodeDeployRoleForECS**或 **AWSCodeDeployRoleForECSLimited**。如需這些政策以及如何將其新增至 CodeDeploy 服務角色的詳細資訊，請參閱 [步驟 2：建立 CodeDeploy 的服務角色](getting-started-create-service-role.md)。

## 部署在等待狀態回呼時逾時
<a name="troubleshooting-ecs-timeout-callback"></a>

**問題**：使用 CodeDeploy 部署 Amazon ECS 應用程式時，您會看到下列錯誤訊息：

 `The deployment timed out while waiting for a status callback. CodeDeploy expects a status callback within one hour after a deployment hook is invoked.` 

**可能原因**：如果您在 [AppSpec 檔案的 `Hooks`區段](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs)中指定 Lambda 函數，但 Lambda 函數無法呼叫必要的 `PutLifecycleEventHookExecutionStatus` API 將 `Succeeded`或 `Failed` 狀態傳回 CodeDeploy，則可能會發生此錯誤。

**可能的修正和後續步驟**：
+ 將 `codedeploy:putlifecycleEventHookExecutionStatus` 許可新增至您在 AppSpec 檔案中指定的 Lambda 函數所使用的 Lambda 執行角色。此許可授予 Lambda 函數將 `Succeeded`或 狀態傳回 `Failed` CodeDeploy 的能力。如需 Lambda 執行角色的詳細資訊，請參閱*AWS Lambda 《 使用者指南*》中的 [Lambda 執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。
+ 檢查您的 Lambda 函數程式碼和執行日誌，確認您的 Lambda 函數正在呼叫 CodeDeploy 的 `PutLifecycleEventHookExecutionStatus` API，以通知 CodeDeploy 生命週期驗證測試`Succeeded`或 `Failed`。如需 `putlifecycleEventHookExecutionStatus` API 的相關資訊，請參閱*AWS CodeDeploy 《 API 參考*》中的 [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html)。如需 Lambda 執行日誌的資訊，請參閱[存取 Amazon CloudWatch logs AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html)。

## 部署失敗，因為一或多個生命週期事件驗證函數失敗
<a name="troubleshooting-ecs-lifecycle"></a>

**問題**：使用 CodeDeploy 部署 Amazon ECS 應用程式時，您會看到下列錯誤訊息：

`The deployment failed because one or more of the lifecycle event validation functions failed.`

**可能原因**：如果您在 [AppSpec 檔案的 `Hooks`區段](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs)中指定 Lambda 函數，但 Lambda 函數在呼叫 時傳回 `Failed` CodeDeploy，則可能會發生此錯誤`PutLifecycleEventHookExecutionStatus`。此失敗會向 CodeDeploy 指出生命週期驗證測試失敗。

**可能的後續步驟**：檢查您的 Lambda 執行日誌，了解驗證測試程式碼失敗的原因。如需 Lambda 執行日誌的資訊，請參閱[存取 Amazon CloudWatch logs AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html)。

## 由於下列錯誤，ELB 無法更新：主要任務集目標群組必須位於接聽程式後方
<a name="troubleshooting-ecs-elb"></a>

**問題**：使用 CodeDeploy 部署 Amazon ECS 應用程式時，您會看到下列錯誤訊息：

`The ELB could not be updated due to the following error: Primary taskset target group must be behind listener`

**可能原因**：如果您已設定選用的測試接聽程式，且設定的目標群組錯誤，則可能會發生此錯誤。如需 CodeDeploy 中測試接聽程式的詳細資訊，請參閱 [開始 Amazon ECS 部署之前](deployment-steps-ecs.md#deployment-steps-prerequisites-ecs)和 [Amazon ECS 部署期間會發生什麼情況](deployment-steps-ecs.md#deployment-steps-what-happens)。如需任務集的詳細資訊，請參閱《*Amazon Elastic Container Service API 參考*》中的 [TaskSet](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskSet.html)，以及《 *AWS CLI 命令參考*》Amazon ECS 區段中的 [describe-task-set](https://docs.aws.amazon.com/cli/latest/reference/ecs/describe-task-set.html)。

**可能修正**：確定 Elastic Load Balancing 的生產接聽程式和測試接聽程式都指向目前為您的工作負載提供服務的目標群組。有三個地方可以檢查：
+ 在 Amazon EC2 中，在負載平衡器的**接聽程式和規則**設定中。如需詳細資訊，請參閱《[Application Load Balancer 使用者指南](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html)》中的 *Application Load Balancer *接聽程式，或[《Network Load Balancer 使用者指南》中的 Network Load Balancer 接聽](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-listeners.html)程式。 **
+ 在 Amazon ECS 中，在您的叢集中，在您的服務**的網路**組態下。如需詳細資訊，請參閱《*Amazon Elastic Container Service 開發人員指南*》中的 [Application Load Balancer 和 Network Load Balancer 考量](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#alb-considerations)事項。
+ 在 CodeDeploy 的部署群組設定中。如需詳細資訊，請參閱[建立 Amazon ECS 部署的部署群組 （主控台）](deployment-groups-create-ecs.md)。

## 使用 Auto Scaling 時，我的部署有時會失敗
<a name="troubleshooting-ecs-auto-scaling"></a>

**問題**：您使用 Auto Scaling 搭配 CodeDeploy，並注意到您的部署偶爾會失敗。如需此問題症狀的詳細資訊，請參閱《*Amazon Elastic Container Service 開發人員指南*》中的 主題：[針對設定為使用服務自動擴展和藍/綠部署類型的服務，自動擴展不會在部署期間遭到封鎖，但在某些情況下部署可能會失敗](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-bluegreen.html#deployment-type-bluegreen-considerations)。

**可能原因**：如果 CodeDeploy 和 Auto Scaling 程序發生衝突，可能會發生此問題。

**可能修正**：使用 `RegisterScalableTarget` API （或對應的`register-scalable-target` AWS CLI 命令） 在 CodeDeploy 部署期間暫停和繼續 Auto Scaling 程序。如需詳細資訊，請參閱《[Application Auto Scaling 使用者指南》中的暫停和恢復](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-suspend-resume-scaling.html) *Application Auto Scaling *的擴展。

**注意**  
CodeDeploy 無法`RegisterScaleableTarget`直接呼叫 。若要使用此 API，您必須設定 CodeDeploy 將通知或事件傳送至 Amazon Simple Notification Service （或 Amazon CloudWatch)。然後，您必須將 Amazon SNS （或 CloudWatch) 設定為呼叫 Lambda 函數，並將 Lambda 函數設定為呼叫 `RegisterScalableTarget` API。必須呼叫 `RegisterScalableTarget` API，並將 `SuspendedState` 參數設為 `true`以暫停 Auto Scaling 操作，並繼續`false`操作。  
CodeDeploy 傳送的通知或事件必須在部署開始 （觸發 Auto Scaling 暫停操作） 或部署成功、失敗或停止 （觸發 Auto Scaling 繼續操作） 時發生。  
如需如何設定 CodeDeploy 以產生 Amazon SNS 通知或 CloudWatch 事件的詳細資訊，請參閱 [使用 Amazon CloudWatch Events 監控部署](monitoring-cloudwatch-events.md)。 和 [使用 Amazon SNS 事件通知監控部署](monitoring-sns-event-notifications.md)。

## 只有 ALB 支援逐步流量路由，請在建立/更新部署群組時使用 AllAtOnce 流量路由
<a name="troubleshooting-ecs-lb"></a>

**問題**：在 CodeDeploy 中建立或更新部署群組時，您會看到下列錯誤訊息：

 `Only ALB supports gradual traffic routing, use AllAtOnce Traffic routing instead when you create/update Deployment group.` 

**可能原因**：如果您使用 Network Load Balancer 並嘗試使用 以外的預先定義部署組態，則可能會發生此錯誤`CodeDeployDefault.ECSAllAtOnce`。

**可能的修正：**
+ 將預先定義的部署組態變更為 `CodeDeployDefault.ECSAllAtOnce`。這是 Network Load Balancer 唯一支援的預先定義部署組態。

  如需預先定義部署組態的詳細資訊，請參閱 [Amazon ECS 運算平台的預先定義部署組態](deployment-configurations.md#deployment-configurations-predefined-ecs)。
+ 將負載平衡器變更為 Application Load Balancer。Application Load Balancer 的 支援所有預先定義的部署組態。如需建立 Application Load Balancer 的詳細資訊，請參閱 [設定 CodeDeploy Amazon ECS 部署的負載平衡器、目標群組和接聽程式](deployment-groups-create-load-balancer-for-ecs.md)。

## 即使我的部署成功，替代任務集仍無法通過 Elastic Load Balancing 運作狀態檢查，而且我的應用程式已關閉
<a name="troubleshooting-ecs-task-set-stability"></a>

**問題**：即使 CodeDeploy 指出我的部署成功，替代任務集仍無法通過 Elastic Load Balancing 的運作狀態檢查，而且我的應用程式已關閉。

**可能原因**：如果您執行 CodeDeploy all-at-once部署，且取代 （綠色） 任務集包含導致 Elastic Load Balancing 運作狀態檢查失敗的錯誤程式碼，則可能會發生此問題。使用all-at-once部署組態時，負載平衡器的運作狀態檢查會在流量轉移到替代任務集*後* （即 CodeDeploy 的`AllowTraffic`生命週期事件發生*後*) 開始執行。這就是為什麼在流量轉移之後，您會在替代任務集上看到運作狀態檢查失敗，但之前不會失敗。如需 CodeDeploy 產生之生命週期事件的相關資訊，請參閱 [Amazon ECS 部署期間會發生什麼情況](deployment-steps-ecs.md#deployment-steps-what-happens)。

**可能的修正：**
+ 將您的部署組態從all-at-once變更為 Canary 或線性。在 Canary 或線性組態中，負載平衡器的運作狀態檢查會在取代任務集上開始執行，同時 CodeDeploy 會在取代環境中安裝您的應用程式，並在流量轉移*之前* （即`Install`生命週期事件期間和`AllowTraffic`事件*之前*)。透過允許檢查在應用程式安裝期間執行，但在流量轉移之前，將偵測到錯誤的應用程式程式碼，並在應用程式公開可用之前導致部署失敗。

  如需如何設定 Canary 或線性部署的資訊，請參閱 [使用 CodeDeploy 變更部署群組設定](deployment-groups-edit.md)。

  如需在 Amazon ECS 部署期間執行之 CodeDeploy 生命週期事件的相關資訊，請參閱 [Amazon ECS 部署期間會發生什麼情況](deployment-steps-ecs.md#deployment-steps-what-happens)。
**注意**  
Canary 和線性部署組態僅支援 Application Load Balancer。
+ 如果您想要保留all-at-once部署組態，請設定測試接聽程式，並使用`BeforeAllowTraffic`生命週期掛鉤檢查替換任務集的運作狀態。如需詳細資訊，請參閱[Amazon ECS 部署的生命週期事件掛鉤清單](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs)。

## 我可以將多個負載平衡器連接到部署群組嗎？
<a name="troubleshooting-ecs-lb-multi"></a>

否。如果您想要使用多個 Application Load Balancer 或 Network Load Balancer，請使用 Amazon ECS 滾動更新，而不是 CodeDeploy 藍/綠部署。如需滾動更新的詳細資訊，請參閱《*Amazon Elastic Container Service 開發人員指南*》中的[滾動更新](https://docs.aws.amazon.com/AmazonECS/latest/userguide/deployment-type-ecs.html)。如需搭配 Amazon ECS 使用多個負載平衡器的詳細資訊，請參閱《*Amazon Elastic Container Service 開發人員指南*》中的[向服務註冊多個目標群組](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html)。

## 我可以在沒有負載平衡器的情況下執行 CodeDeploy 藍/綠部署嗎？
<a name="troubleshooting-ecs-lb-bg"></a>

否，如果沒有負載平衡器，您就無法執行 CodeDeploy 藍/綠部署。如果您無法使用負載平衡器，請改用 Amazon ECS 的滾動更新功能。如需 Amazon ECS 滾動更新的詳細資訊，請參閱《*Amazon Elastic Container Service 開發人員指南*》中的[滾動更新](https://docs.aws.amazon.com/AmazonECS/latest/userguide/deployment-type-ecs.html)。

## 如何在部署期間使用新資訊更新 Amazon ECS 服務？
<a name="troubleshooting-ecs-exec"></a>

若要讓 CodeDeploy 在執行部署時使用新參數更新您的 Amazon ECS 服務，請在 AppSpec 檔案的 `resources`區段中指定 參數。CodeDeploy 僅支援幾個 Amazon ECS 參數，例如任務定義檔案和容器名稱參數。如需 CodeDeploy 可更新之 Amazon ECS 參數的完整清單，請參閱 [Amazon ECS 部署的 AppSpec 'resources' 區段](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

**注意**  
如果您需要使用 CodeDeploy 不支援的參數來更新 Amazon ECS 服務，請完成下列任務：  
使用您要更新的參數呼叫 Amazon ECS 的 `UpdateService` API。如需可更新參數的完整清單，請參閱《*Amazon Elastic Container Service API 參考*》中的 [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html)。
若要將變更套用至任務，請建立新的 Amazon ECS 藍/綠部署。如需詳細資訊，請參閱[建立 Amazon ECS 運算平台部署 （主控台）](deployments-create-console-ecs.md)。