如何讓使用 Amazon EC2 啟動類型的 Amazon ECS 任務通過 Application Load Balancer 運作狀態檢查?
我想要疑難排解並解決在 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上執行的 Amazon Elastic Container Service (Amazon ECS) 任務的 Application Load Balancer 運作狀態檢查問題。
簡短描述
當您的 Amazon ECS 任務無法通過負載平衡器運作狀態檢查時,您會透過 Amazon ECS 服務事件訊息收到下列其中一個錯誤:
- "(service AWS-service) (port 8080) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed with these codes: [502 or 504]) or (request timeout)"
- "(service AWS-Service) (port 8080) is unhealthy in target-group tf-20190411170 due to (reason Health checks failed)"
- 「(服務 AWS-Service) (執行個體 i-1234567890abcdefg) (連接埠 443) 在 (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) 中的運作狀態不良,原因在於 (運作狀態檢查失敗的原因)」
您可能會從 Amazon ECS 任務主控台收到下列錯誤:
「(target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) 中任務失敗的 ELB 運作狀態檢查」
如需容器運作狀態檢查失敗的詳細資訊,請參閱如何疑難排解 Amazon ECS 任務的容器運作狀態檢查失敗?
若要確定 Amazon ECS 任務停止的原因,請參閱查看 Amazon ECS 已停止任務錯誤和我的 Amazon ECS 任務為何停止?
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
設定不同的安全群組
最佳做法是設定不同的安全群組,以允許負載平衡器和容器執行個體或任務彈性網路介面之間的所有流量。您也可以設定容器執行個體,以接受為任務指定之連接埠上的流量。
在您的組態中,檢查下列設定:
- 與您的負載平衡器關聯的安全群組允許傳出流量流向註冊連接埠上的容器執行個體或任務網路介面。此外,允許傳出流量到運作狀態檢查連接埠上的容器執行個體。
- 允許與負載平衡器關聯,安全群組任務主機連接埠範圍的傳入流量。
開啟負載平衡器的可用區域
當您為負載平衡器設定可用區域時,Elastic Load Balancing 會在可用區域中建立負載平衡器節點。如果您在可用區域中註冊目標,但未開啟可用區域,則註冊的目標不會接收流量。如需詳細資訊,請參閱可用區域和負載平衡器節點。
若要確定負載平衡器設定的可用區域,請完成下列步驟:
- 開啟 Amazon EC2 主控台。
- 在導覽窗格的 Load Balancing (負載平衡) 下,選擇 Load balancers (負載平衡器)。
- 選取您要用於 Amazon ECS 服務的負載平衡器。
- 在 Description (描述) 索引標籤上,您可以查看可用區域。
或者,執行 describe-load-balancers AWS CLI 命令:
aws elbv2 describe-load-balancers --load-balancer-arns EXAMPLE-ALB-ARN --query 'LoadBalancers[*].AvailabilityZones[].{Subnet:SubnetId}'
注意: 將 EXAMPLE-ALB-ARN 替換為 Application Load Balancer 的 ARN。
若要確定容器執行個體設定的可用區域,請完成下列步驟:
- 開啟 Amazon EC2 主控台。
- 在導覽窗格的 Auto Scaling 下,選擇 Auto Scaling groups (Auto Scaling 群組)。
- 選取與叢集關聯的容器執行個體 Auto Scaling 群組。
- 在 Details (詳細資料) 索引標籤的 Network (網路) 下方,確認可用區域與負載平衡器可用區域相符。
或者,執行 describe-auto-scaling-groups AWS CLI 命令:
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names EXAMPLE-ASG-NAME --query 'AutoScalingGroups[*].{Subnets:VPCZoneIdentifier}' --output text
注意: 將 EXAMPLE-ASG-NAME 替換為 Auto Scaling 群組的名稱。
若要修改叢集的可用區域,請完成以下步驟:
- 開啟 AWS CloudFormation 主控台。
- 選取叢集的 CloudFormation 堆疊。
- 更新堆疊。
- 在 Specify stack details page (指定堆疊詳細資料頁面) 下,更新 Subnet IDs (子網路 ID) 組態。
若要確定任務設定的可用區域,請完成以下步驟:
-
開啟 Amazon ECS 主控台。
-
在導覽窗格中,選擇 Clusters (叢集),然後選取包含服務的叢集。
-
在叢集頁面的 Services (服務) 索引標籤的 Service Name (服務名稱) 中,選取您要檢查的服務。
-
選擇 Configuration and Networking (組態和網路) 索引標籤。
-
在 Network configuration (網路組態) 下,查看已設定的子網路。
-
開啟 Amazon Virtual Private Cloud (Amazon VPC) 主控台以查看 ECS 主控台中其他無法使用的資訊。
-
執行 describe-services 命令以確認子網路的可用區域是否與負載平衡器的可用區域相符:
aws ecs describe-services --cluster EXAMPLE-CLUSTER-NAME --service EXAMPLE-SERVICE-NAME --query 'services[*].deployments[].networkConfiguration[].awsvpcConfiguration.{Subnets:subnets}'注意: 將 EXAMPLE-CLUSTER-NAME 替換為您的叢集名稱,將 EXAMPLE-SERVICE-NAME 替換為您的服務名稱。
您無法使用 Amazon ECS 主控台變更 Amazon ECS 服務的子網路設定。請改為執行 AWS CLI update-service 命令。
設定網路 ACL 以允許子網路之間的流量
負載平衡器和容器執行個體或任務網路介面的子網路可能不同。
若要允許子網路之間的流量,請使用下列網路存取控制清單 (網路 ACL) 組態:
- 與負載平衡器子網路關聯的網路 ACL 必須允許臨時連接埠 (1024-65535) 和接聽程式連接埠上的傳入流量。
- 網路 ACL 必須允許運作狀態檢查和暫時性連接埠上的傳出流量。
- 對於與容器執行個體的子網路或 awsvpc 的任務網路介面關聯的網路 ACL,必須允許運作狀態檢查連接埠上的傳入流量。
- 網路 ACL 必須允許暫時性連接埠上的傳出流量。
如需有關網路 ACL 的詳細資訊,請參閱使用網路存取控制清單控制子網路流量。
檢查目標群組的運作狀態檢查設定
若要檢查您是否正確設定了目標群組的運作狀態檢查設定,請完成以下步驟:
- 開啟 Amazon EC2 主控台。
- 在導覽窗格的 Load balancing (負載平衡) 下,選擇 Target groups (目標群組)。
- 選取您的目標群組。
重要: 使用新的目標群組。由於 Amazon ECS 會自動向目標群組註冊和取消註冊 ECS 任務,因此請勿手動將目標新增至目標群組。 - 在 Health checks (運作狀態檢查) 索引標籤上,執行下列動作:
檢查您是否正確設定了 Port (連接埠) 和 Path (路徑) 欄位。
注意:如果欄位未正確設定,那麼 Amazon ECS 可能會因為運作狀態檢查失敗,而要求負載平衡器取消註冊該任務。
對於連接埠,選擇流量連接埠。
**注意:**如果您選擇 Override (覆寫),請確認連接埠與任務主機連接埠相符。
對於 Timeout (逾時),請確定已正確設定回應逾時值。
**注意:**如果該值低於回應所需的時間量,運作狀態檢查會失敗。
檢查 ECS 容器中應用程式的狀態和組態
確認應用程式會回應負載平衡器運作狀態檢查
請執行下列動作:
- 檢查您是否已正確設定目標群組的 ping 連接埠和運作狀態檢查路徑。
- 監控 Amazon ECS 服務的 CPU 和記憶體使用率指標。如果應用程式運作緩慢或逾時,請增加任務資源配額、橫向擴充服務、最佳化應用程式,或使用較大的執行個體類型。
- 設定最短運作狀態檢查寬限期,以便服務排程器在您啟動任務後的預先定義時間內,忽略運作狀態檢查。
注意: 您的 Amazon ECS 任務可能需要較長的運作狀態檢查寬限期,才能註冊 Application Load Balancer。 - 檢查應用程式日誌中是否有應用程式錯誤。如需詳細資訊,請參閱將 Amazon ECS 日誌傳送到 CloudWatch。
確認應用程式傳回正確的狀態碼
當負載平衡器向運作狀態檢查路徑傳送 HTTP GET 請求時,ECS 容器中的應用程式將傳回預設的 200 OK 狀態碼。如果您收到非 HTTP 的錯誤訊息,表示您的應用程式未接聽 HTTP 流量。您收到的 HTTP 狀態碼可能會與比對器設定中指定的有所不同。如果您收到其他狀態碼,則表示您的應用程式正在接聽 HTTP 流量,但未傳回運作狀態良好目標的狀態碼。
**注意:**如果您使用 Application Load Balancer,可以將 Matcher (比對器) 設定更新為 200 以外的狀態碼。如需詳細資訊,請參閱 Application Load Balancer 目標群組的運作狀態檢查。
若要確認 ECS 容器中應用程式傳回正確的狀態碼,請完成以下步驟:
-
使用 SSH、Session Manager (AWS Systems Manager 的功能) 或 EC2 執行個體連線來連線到容器執行個體。
-
(選用) 執行以下命令為作業系統 (OS) 安裝 curl。
Amazon Linux 和其他 RPM 型的發行版:sudo yum -y install curlDebian 型系統,例如 Ubuntu:
sudo apt-get install curl -
執行以下命令來取得容器 ID:
docker ps**注意:**本機接聽程式的連接埠會顯示在序列結尾 PORTS 下方的命令輸出中。
-
如果使用的是 BRIDGE 網路模式,請執行 docker inspect 命令以取得容器的 IP 位址:
IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)注意: 容器的 IP 位址儲存在 IPADDR 中。將 112233445566 替換為 docker ps 命令輸出中的容器 ID 號碼。如果您使用的是 awsvpc,請使用指派給任務網路介面的任務 IP 位址。如果您使用 HOST 網路模式,請使用任務公開通過的主機容器執行個體的 IP 位址。
-
若要取得狀態碼,請執行 curl 命令,其中包括 IPADDR 和本機接聽程式的連接埠:
curl -I http://${IPADDR}:8080/health注意: 在上述範例命令中,將 8080 替換為接聽程式的連接埠。
檢查容器執行個體的狀態
如果您從 Amazon ECS 服務事件中收到下列事件訊息,請檢查容器執行個體的狀態:
「(服務 AWS-Service) (執行個體 i-1234567890abcdefg) (連接埠 443) 在 (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) 中的運作狀態不良,原因在於 (運作狀態檢查失敗的原因)」
檢查 Amazon EC2 主控台上容器執行個體的狀態。如果執行個體的系統狀態檢查失敗,請停止並啟動執行個體。
暫時啟動 Application Load Balancer 存取日誌
暫時啟動Application Load Balancer 存取日誌以檢查以下問題:
- 確定 Application Load Balancer 是否將運作狀態檢查傳送到正確的路徑或端口,以及目標是否正確回應。
- 分析目標傳回的 HTTP 狀態碼以識別應用程式層級問題,例如設定錯誤的路由或伺服器端錯誤。
- 檢查運作狀態檢查是否達到目標,以確定是否存在與網路相關的問題。
- 判斷回應時間是否超出設定的運作狀態檢查逾時。
對其他原因進行疑難排解
如果上述解決方案未能解決您的問題,請參閱對 Amazon ECS 中的服務負載平衡器進行疑難排解。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 2 年前
