如何疑難排解 Fargate 上 Amazon ECS 任務的 Application Load Balancer 運作狀態檢查失敗?
我想解決在 AWS Fargate 上執行 Amazon Elastic Container Service (Amazon ECS) 任務時 Application Load Balancer 運作狀態檢查失敗的問題。
簡短描述
當 Amazon ECS 任務未能通過 Application Load Balancer 運作狀態檢查時,您可能會從 Amazon ECS 服務事件訊息中收到以下錯誤之一:
- 請求逾時
- 運作狀態檢查失敗,沒有錯誤碼
- 運作狀態檢查失敗,並顯示 404 或 5xx 錯誤碼
- 目標位於負載平衡器未開啟的可用區域
如需容器運作狀態檢查失敗的詳細資訊,請參閱如何疑難排解 Amazon ECS 任務的容器運作狀態檢查失敗?
如果您將 Amazon ECS 與 Amazon Elastic Compute Cloud (Amazon EC2) 容器執行個體結合使用,請參閱以下文件:
- 如何使用 Amazon EC2 啟動類型執行我的 Amazon ECS 任務,以通過 Amazon ECS 中的 Application Load Balancer 運作狀態檢查?
- 如需已停止之 Amazon ECS 任務的詳細資訊,請參閱檢查已停止的任務是否有錯誤。
解決方案
**注意:**如果執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確定您執行的是最新版本的 AWS CLI。在下列 AWS CLI 命令中,將範例值取代為您的值。
請求逾時錯誤
檢查安全群組,確定負載平衡器可以向 Fargate 任務發出運作狀態檢查請求。Fargate 任務安全群組必須允許任務定義中指定的容器連接埠上的傳入和傳出流量。來源必須是 Application Load Balancer 安全群組。Application Load Balancer 安全群組必須允許傳出至 Fargate 任務安全群組的流量。
**注意:**最佳實務是為 Fargate 任務和負載平衡器設定不同的安全群組,以允許它們之間的流量。
如果安全群組允許 Fargate 任務和 Application Load Balancer 之間的通訊,則檢查運作狀態檢查設定中的 HealthCheckTimeoutSeconds。如有必要,稍微增加逾時秒數。
**注意:**只有當應用程式需要很長時間來回應運作狀態檢查時,才增加 HealthCheckTimeoutSeconds。
若要檢查平均回應時間,請執行下列命令:
$ time curl -Iv http://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>
**注意:**任務的資源使用率高可能會導致程序緩慢或停滯,並導致運作狀態檢查失敗。
運作狀態檢查失敗,沒有錯誤碼
運作狀態檢查失敗錯誤訊息範例:
(service AWS-service) (port 80) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)
如果您收到類似的錯誤訊息,請檢查任務在 Amazon ECS 中啟動後是否快速回應。此外,請檢查應用程式是否使用正確的回應代碼回覆。
確保任務在 Amazon ECS 中啟動後有時間做出回應
為確保任務在啟動後有足夠的時間回應,請增加 healthCheckGracePeriodSeconds。這可讓 Amazon ECS 將任務保留更長時間,並忽略狀態不良的 Elastic Load Balancing 目標運作狀態檢查。
**注意:**如果您要建立新服務,則可以在負載平衡器組態頁面上設定運作狀態檢查寬限期。
若要更新現有 Amazon ECS 服務的 healthCheckGracePeriodSeconds,請執行下列命令:
$ aws ecs update-service --cluster <EXAMPLE-CLUSTER-NAME> --service <EXAMPLE-SERVICE-NAME> --region <EXAMPLE-REGION> --health-check-grace-period-seconds <example-value-in-seconds>
檢查應用程式是否使用正確的回應代碼回覆
若要確認應用程式在運作狀態檢查路徑上傳送的回應代碼,請使用下列方法。
如果您在應用程式上設定存取記錄,請使用 ELB-HealthChecker/2.0 來檢查回應。如果您使用 AWS CloudWatch Logs,請使用 CloudWatch Logs Insights 並執行下列命令:
fields @timestamp, @message | sort @timestamp desc | filter @message like /ELB-HealthChecker/
對於相同 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon EC2 執行個體,執行以下命令以確認您的任務回應手動檢查。若要啟動新的 Amazon EC2 執行個體,請參閱教學課程: 開始使用 Amazon EC2 Linux 執行個體。
HTTP 運作狀態檢查
$ curl -Iv http://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>
HTTPS 運作狀態檢查
$ curl -Iv https://<example-task-pvt-ip>:<example-port>/<example_healthcheck_path>
如果任務快速停止,並且您無法取得私有 IP 地址,請在 Amazon ECS 外部啟動獨立任務以疑難排解問題。使用相同的任務定義,並對其 IP 地址執行 curl 命令以啟動任務。任務不會因為運作狀態檢查失敗而停止。
此外,您也可以使用 Amazon ECS Exec 來檢查容器層級的接聽連接埠。使用 netstat 確認應用程式接聽適當的連接埠:
$ netstat -tulpn | grep LISTEN
運作狀態檢查失敗,並顯示 404 或 5xx 錯誤碼
收到錯誤碼為 404 或 5xx 的運作狀態檢查失敗表示已確認運作狀態檢查請求,但收到無效的回應碼。這些代碼也指出應用程式傳送的回應碼與目標群組層級上設定的成功碼不符 (參數: Matcher)。
當運作狀態檢查路徑不存在,或者運作狀態檢查路徑的組態中有錯字時,就可能會發生 404 錯誤碼。當任務內的應用程式未正確回覆請求,或發生處理錯誤時,可能會出現 5xx 錯誤碼。
若要確定應用程式是否成功啟動,請檢查應用程式日誌。
目標位於負載平衡器未開啟的可用區域
當您為負載平衡器開啟可用區域時,Elastic Load Balancing 會在可用區域中建立負載平衡器節點。如果您在可用區域中註冊目標,但未開啟可用區域,則註冊的目標不會接收流量。如需詳細資訊,請參閱可用區域和負載平衡器節點。
若要識別負載平衡器設定的可用區域,請執行下列命令:
aws elbv2 describe-load-balancers --load-balancer-arns <EXAMPLE-ALB-ARN> --query 'LoadBalancers[*].AvailabilityZones[].{Subnet:SubnetId}'
若要識別 Fargate 任務設定的可用區域,請執行下列命令:
aws ecs describe-services --cluster <EXAMPLE-CLUSTER-NAME> --service <EXAMPLE-SERVICE-NAME> --query 'services[*].deployments[].networkConfiguration[].awsvpcConfiguration.{Subnets:subnets}'
**注意:**使用 update-service AWS CLI 命令變更 Amazon ECS 服務的子網路組態。使用 enable-availability-zones-for-load-balancer AWS CLI 命令,將可用區域新增至現有的 Application Load Balancer。
相關資訊
相關內容
- 已提問 9 個月前lg...
- 已提問 10 個月前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前