跳至內容

如何針對 Fargate 上 Amazon ECS 任務的 Network Load Balancer 運作狀態檢查失敗進行疑難排解?

3 分的閱讀內容
0

當我在 AWS Fargate 上執行 Amazon Elastic Container Service (Amazon ECS) 任務時,收到 Network Load Balancer 運行狀況檢查失敗訊息。

簡短說明

如需 HTTP 和 HTTPS 運作狀態檢查,請參閱如何針對 Fargate 上 Amazon ECS 任務的 Application Load Balancer 運作狀態檢查失敗進行疑難排解?

當 Amazon ECS 任務未透過 Network Load Balancer 運作狀態檢查時,您會在服務事件訊息中收到類似下列錯誤範例:

  • 「運作狀態檢查失敗錯誤 - (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) ((service AWS-service) (連接埠 80) 在 (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) 中運作狀態不佳,原因在於 (運作狀態檢查失敗))」
  • 「目標位於未為負載平衡器啟用的可用區域中之錯誤 - (service AWS-service) (port 80) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Target is in an Availability Zone that is not enabled for the load balancer) ((服務 AWS 服務) (連接埠 80) 在 (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) 中運作狀態不佳,原因在於 (目標位於未為負載平衡器啟用的可用區域中))」
  • 「Health checks requests getting timed out - (service AWS-service) (port 8443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Request timed out).」

如果您收到容器運作狀態檢查失敗,請參閱如何對 Amazon ECS 任務的容器運作狀態檢查失敗進行疑難排解?

如果您的 Amazon ECS 任務已停止,請參閱查看 Amazon ECS 已停止任務錯誤

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

運作狀態檢查失敗

若要對 Fargate 任務上的負載平衡器運作狀態檢查失敗問題進行疑難排解,請執行下列動作。

檢查負載平衡器與 Amazon ECS 任務之間的連線

若要允許負載平衡器對您的 Amazon ECS 任務執行運作狀態檢查,請確認下列組態:

  • 如果您的容器對應至連接埠 80,那麼您的任務安全群組允許連接埠 80 上的傳入流量。
  • 該應用程式可以在任務定義中對應到容器執行個體的連接埠上執行。
  • 彈性網路介面安全群組允許 Amazon Virtual Private Cloud (Amazon VPC) CIDR 範圍內的流量。如需詳細資訊,請參閱目標安全群組
  • Network Load Balancer 安全群組規則允許傳出流量到所需容器連接埠上的 Amazon ECS 服務安全群組。
  • 您任務網路介面子網路的網路存取控制清單 (網路 ACL) 允許運作狀態檢查連接埠上的傳入流量。
  • 網路 ACL 允許暫時性連接埠上的傳出流量。

確認您的任務是否正確回應 Amazon VPC 連線中的手動檢查

確認 VPC 中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體任務是否正確回應手動檢查。

**注意:**您可以為 Amazon EC2 啟動類型建立叢集,或啟動新的 Amazon EC2 執行個體。如果您不想啟動 Amazon EC2 執行個體,可以使用 ECS Exec

若要檢查您的任務回應,請使用 SSH 連線到 Amazon VPC 連線內的 EC2 執行個體。然後,執行下列其中一個命令來測試您的目標群組組態。

HTTP 運作狀態檢查:

curl -Iv http://example-task-private-ip:example-port/healthcheck_path

注意: 用您的任務 IP 位址取代 example-task-private-ip,用您的連接埠取代 example-port。此命令的輸出顯示目標群組上 HTTP 運作狀態檢查組態的成功狀態代碼在 200-399 範圍內。

輸出範例:

HTTP/1.1 200 OK

不對目標使用 SSL 的 TCP 運作狀態檢查:

nc -z -v -w10 example-task-private-ip example-port

注意: 用您的任務 IP 位址取代 example-task-private-ip,用您的連接埠取代 example-port

輸出範例:

nc -z -v -w10 10.x.x.x 80Connection to 10.x.x.x port 80 [tcp/http] succeeded!

需要 SSL 進行後端運作狀態檢查的 TCP 運作狀態檢查:

nc -z -v -w10 --ssl example-task-private-ip example-port

注意: 用您的任務 IP 位址取代 example-task-private-ip,用您的連接埠取代 example-port

輸出範例:

nc -z -v -w10 10.x.x.x 443Connection to 10.x.x.x port 443 [tcp/https] succeeded!

在 Amazon ECS 容器執行個體中檢查應用程式的狀態和組態

請執行下列動作:

  • 檢查您是否已正確設定目標群組的 ping 連接埠和運作狀態檢查路徑。
  • 監控服務的 CPU 和記憶體使用量指標,以防資源消耗過高導致應用程式無法回應運作狀態檢查請求。

如果您的任務需要更長的執行狀況檢查寬限期,請執行以下 update-service AWS CLI 命令來增加 healthCheckGracePeriodSeconds

aws ecs update-service --cluster example-cluster --service example-service --region example-region --health-check-grace-period-seconds example-value --force-new-deployment

注意:example-cluster 替換為您的叢集名稱,將 example-service 替換為您的服務名稱,將 example-region 替換為您的 AWS 區域,並將 example-value 替換為您的運作狀態檢查寬限期 (以秒為單位)。

檢查目標群組中的目標是否因回應時間超過預設逾時時間,而造成運作狀態檢查失敗。若要解決此問題,請執行以下 modify-target-group 命令來增加目標群組逾時秒數:

aws elbv2 modify-target-group --target-group-arn Target-Group-ARN --health-check-timeout-seconds Timeout-Value

注意:Target-Group-ARN 替換為您的目標群組 ARN,將 Timeout-Value 替換為您的群組逾時值 (以秒為單位)。

檢查應用程式日誌中是否有應用程式錯誤

確保您的應用程式在 HealthCheckPath 上傳送的回應代碼與目標群組的運作狀態檢查參數中的回應代碼相符。如果您在應用程式上設定了存取記錄,請使用 ELB-HealthChecker/2.0 關鍵字來檢查記錄的回應。如果您使用 Amazon CloudWatch Logs,請使用 CloudWatch Logs Insights 執行下列查詢:

fields @timestamp, @message| sort @timestamp desc
| filter @message like /ELB-HealthChecker/

查詢的輸出會顯示 Network Load Balancer 傳送的運作狀態檢查請求、回應代碼和錯誤。

目標位於未針對負載平衡器啟動的可用區中

如果您在可用區域中註冊目標,則必須啟動該可用區域以便已註冊的目標接收流量。

重要: 建立負載平衡器後,您無法停用 Network Load Balancer 的可用區域。但是,您可以啟動其他可用區。

若要識別您的負載平衡器設定的可用區域,請執行以下 describe-load-balancers 命令:

aws elbv2 describe-load-balancers --load-balancer-arn example-arn-load-balancer --region example-region --query "LoadBalancers[].AvailabilityZones[].ZoneName"

注意:example-arn-load-balancer 替換為您的負載平衡器 ARN,將 example-region 替換為您的區域。

若要識別 Fargate 任務設定的可用區域,請執行下列 describe-services 命令:

aws ecs describe-services --cluster example-cluster-name --services example-service-name --region example-region --query "services[].networkConfiguration.awsvpcConfiguration.subnets"

注意:example-cluster-name 替換為您的叢集名稱,將 example-service-name 替換為您的服務名稱,並將 example-region 替換為您的區域。此命令的輸出顯示您的服務中子網路的 ID。

若要辨識任務子網路的可用區,請執行以下 describe-subnets 命令:

aws ec2 describe-subnets --subnet-ids example-subnet-ids --region example-region --query "Subnets[].AvailabilityZone"

注意:example-subnet-ids 替換為您的子網路 ID,將 example-region 替換為您的區域。該命令的輸出會顯示您服務設定的可用區域。

若要變更 Amazon ECS 服務的子網路組態,請執行下列 update-service 命令:

aws ecs update-service --cluster cluster-name --service service-name --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxx,subnet-yyyyy]}"

注意:cluster-name 替換為您的叢集名稱,將 service-name 替換為您的服務名稱。

後端相依性

如果應用程式的運作狀態檢查路徑與上游或下游服務 (例如資料庫) 進行通訊,請確定這些服務可用。服務有問題可能導致運作狀態檢查失敗。

Amazon ECS 任務可能因多種原因處於運作狀態不良。如果上述解決方案未能解決您的問題,請參閱對 Amazon ECS 中的服務負載平衡器進行故障排除

相關資訊

Network Load Balancer 目標群組的運作狀態檢查

網路組態

AWS 官方已更新 2 個月前