如何使用 Amazon EC2 啟動類型執行我的 Amazon ECS 任務,以通過 Amazon ECS 中的 Application Load Balancer 運作狀態檢查?

3 分的閱讀內容
0

Amazon Elastic Container Service (Amazon ECS) 中 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的 Application Load Balancer 運作狀態檢查傳回運作狀態不良。我想要我的 EC2 執行個體通過運作狀態檢查。

簡短描述

當您的 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)"
  • "(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)"

您還可能會從 Amazon ECS 任務主控台收到下列錯誤:

"Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)"

如果您收到錯誤 "(service AWS-Service) (task c13b4cb40f1f4fe4a2971f76ae5a47ad) failed container health checks",請參閱如何對 Amazon ECS 失敗任務的容器運作狀態檢查進行疑難排解?

**注意:**Amazon ECS 任務可以傳回很多原因的運作狀態不良。如果下列步驟無法解決您的問題,請參閱對服務負載平衡器進行疑難排解。若要了解 ECS 任務停止的原因,請參閱檢查已停止的任務是否發生錯誤

解決方法

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

若要對 Amazon ECS 任務的負載平衡器運作狀態檢查問題進行疑難排解,並通過 Application Load Balancer 運作狀態檢查,請檢查下列內容:

  • 負載平衡器與 Amazon ECS 任務之間的連線
  • 目標群組的運作狀態檢查設定
  • ECS 容器中應用程式的狀態和組態
  • 容器執行個體的狀態

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

為了確保您的負載平衡器已獲准對 Amazon ECS 任務執行運作狀態檢查,請檢閱下列資訊。

系統已正確設定連接至負載平衡器和容器執行個體,或是 awsvpc 網路模式之 ECS 任務彈性網路介面的安全群組

最佳實務是為負載平衡器和容器執行個體或任務彈性網路介面,分別設定不同的安全群組。透過此方法,您可以允許負載平衡器和容器執行個體或任務彈性網路介面之間的所有流量。您還可以讓容器執行個體在為任務指定的連接埠上接受流量。

  • 確認與負載平衡器關聯的安全群組允許將流量輸出至您的容器執行個體,或是已註冊連接埠上的任務彈性網路介面。確認與容器執行個體關聯的運作狀態檢查連接埠也是如此 (如果適用)。
  • 確認與您的容器執行個體或任務彈性網路介面關聯的安全群組,允許與負載平衡器關聯的安全群組在任務主機連接埠範圍內的所有輸入流量。若要檢查與負載平衡器關聯的安全群組,請參閱 Application Load Balancer 的安全群組

**重要:**當您使用動態連接埠對應時,服務會公開在動態連接埠 (通常是連接埠 32768 - 65535),而非在主機連接埠上。在此情況下,確認您的容器執行個體安全群組將負載平衡器輸入規則中的暫時連接埠範圍做為來源。

您的負載平衡器與容器執行個體或針對 awsvpc 網路模式的 ECS 任務彈性網路介面,設定在相同的可用區域中

當您為負載平衡器啟用可用區域時,Elastic Load Balancing 會在可用區域中建立負載平衡器節點。如果您在可用區域中註冊目標,但未開啟可用區域,則註冊的目標不會接收流量。如需詳細資訊,請參閱可用區域和負載平衡器節點

若要了解負載平衡器設定的可用區域,請完成下列步驟:

  1. 開啟 Amazon EC2 主控台
  2. 在導覽窗格的負載平衡下,選擇負載平衡器
  3. 選取您要用於 Amazon ECS 服務的負載平衡器。
  4. 說明標籤上,您可以檢視可用區域欄位下方的可用區域。

**注意:**若為 Application Load Balancer,您可以隨時啟用或停用可用區域。若為 Network Load Balancer,您啟用可用區域後便無法停用,但您可以啟用其他可用區域。

如果您使用 Application Load Balancer,系統一律會開啟跨區域負載平衡。如果您使用 Network Load Balancer,依預設會關閉跨區域負載平衡。建立 Network Load Balancer 之後,您可以隨時開啟或關閉跨區域負載平衡。如需詳細資訊,請參閱 Elastic Load Balancing 的運作方式

若要了解容器執行個體設定的可用區域,請完成下列步驟:

  1. 開啟 Amazon EC2 主控台
  2. 在導覽窗格的 Auto Scaling 下,選擇 Auto Scaling 群組
  3. 選取與叢集關聯的容器執行個體 Auto Scaling 群組。
  4. 詳細資料標籤的網路下方,確認已列出的可用區域與負載平衡器列出的可用區域相符。

若要修改叢集的可用區域,請開啟 AWS CloudFormation 主控台,為您的叢集選擇 CloudFormation 堆疊,然後更新子網路組態。若要了解您為 awsvpc 的任務彈性網路介面所設定的可用區域,請完成下列步驟:

  1. 開啟 Amazon ECS 主控台
  2. 在導覽窗格中,選擇叢集,然後選取包含服務的叢集。
  3. 在叢集頁面的服務標籤的服務名稱中,選取您要檢查的服務。
  4. 選擇詳細資料,然後選擇允許的子網路,以檢視為服務啟用的子網路。
  5. 您可以在 Amazon VPC 主控台中檢視子網路。
  6. 確認子網路的可用區域與負載平衡器列出的可用區域相符。

**注意:**您無法從 Amazon ECS 主控台變更 Amazon ECS 服務的子網路組態。您可以使用 AWS CLI update-service 命令來變更子網路組態。

系統已正確設定與負載平衡器和 ECS 容器執行個體的子網路,或與 awsvpc 網路模式的 ECS 任務彈性網路介面的子網路關聯的網路存取控制清單 (ACL)

負載平衡器和容器執行個體或任務彈性網路介面的子網路可能不同。若要確定這些子網路之間允許流量,請檢查下列內容:

  • 請確定與負載平衡器子網路關聯的網路 ACL 允許暫時連接埠 (1024 - 65535) 和接聽程式連接埠上的輸入流量。確認網路 ACL 也允許運作狀態檢查和暫時連接埠上的輸出流量。
  • 針對與容器執行個體的子網路或 awsvpc 模式的任務彈性網路介面關聯的網路 ACL,請確定其允許運作狀態檢查連接埠上的輸入流量。確認網路 ACL 允許暫時連接埠上的輸出流量。

如需有關網路 ACL 的詳細資訊,請參閱使用網路 ACL

檢查目標群組的運作狀態檢查設定

若要確定目標群組的運作狀態檢查設定已正確設定,請完成下列步驟:

  1. 開啟 Amazon EC2 主控台
  2. 在導覽窗格的「負載平衡」下,選擇目標群組
  3. 選取您的目標群組。
    **重要:**使用新的目標群組。請避免將目標手動新增至目標群組,因為 Amazon ECS 會自動為目標群組的容器進行註冊和取消註冊。
  4. 運作狀態檢查標籤上,輸入下列資訊:
    檢查連接埠路徑欄位是否已正確設定。如果「連接埠」欄位未正確設定,負載平衡器可能會取消註冊容器。
    對於連接埠,選擇流量連接埠
    注意:如果您選擇覆寫,請確認指定的連接埠符合任務主機連接埠。
    對於逾時,確定已正確設定回應逾時值。
    **注意:**回應逾時是指容器必須將回應傳回運作狀態檢查 ping 的時間量。如果此值低於回應所需的時間量,運作狀態檢查會失敗。

檢查 ECS 容器中應用程式的狀態和組態

確認 ECS 容器中的應用程式會回應負載平衡器運作狀態檢查

若要確定 ECS 容器中的應用程式會正確回應負載平衡器運作狀態檢查,請完成下列任務:

  • 檢查目標群組的 ping 連接埠和運作狀態檢查路徑是否均已正確設定。
  • 監控 ECS 服務的 CPU 和記憶體使用率指標。例如,高度佔用 CPU 可能使您的應用程式沒有回應,並造成 502 錯誤或逾時。
  • 定義運作狀態檢查寬限期的下限。此設定會指示服務排程器在列舉工作之後,忽略預先定義時段內的 Elastic Load Balancing 運作狀態檢查。您的 Amazon ECS 任務可能需要較長的運作狀態檢查寬限期,才能註冊 Network Load Balancer。
  • 檢查應用程式日誌中是否有應用程式錯誤。如需詳細資訊,請參閱在 CloudWatch Logs 中檢視 awslogs 容器日誌

確認 ECS 容器中的應用程式傳回正確的回應碼

當負載平衡器將 HTTP GET 請求傳送至運作狀態檢查路徑時,ECS 容器中的應用程式預期會傳回預設的 200 OK 回應碼。

注意:如果您使用 Application Load Balancer,可以將比對器設定更新為 200 以外的回應碼。如需詳細資訊,請參閱您的目標群組運作狀態檢查

  1. 使用 SSH 連接至容器執行個體。

  2. (選用) 使用適合您系統的命令來安裝 curl。
    若為 Amazon Linux 和其他 RPM 型的發行版,請執行下列命令:

    sudo yum -y install curl

    若為 Debian 型系統 (例如 Ubuntu),請執行下列命令:

    sudo apt-get install curl
  3. 若要取得容器 ID,請執行下列命令:

    docker ps

    **注意:**本機接聽程式的連接埠會顯示在序列結尾 PORTS 下方的命令輸出中。

  4. 若要取得容器的 IP 位址,請執行 docker inspect 命令:

    $ IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)

    **注意:**容器的 IP 位址儲存在 IPADDR 中。如果您使用 BRIDGE 網路模式,請使用此命令。將 112233445566 取代為容器的 ID 號碼。
    如果您使用 awsvpc 網路模式,請使用指派給任務彈性網路介面的任務 IP 位址。如果您使用 HOST 網路模式,請使用任務公開通過的主機 IP 位址。

  5. 若要取得狀態碼,請執行 curl 命令,其中包括 IPADDR 和本機接聽程式的連接埠。例如,如果您透過運作狀態檢查路徑 /health,在接聽連接埠 8080 的容器上執行 curl 命令,則該命令必須傳回 200 OK 的回應碼:

    curl -I http://${IPADDR}:8080/health

    如果您收到非 HTTP 的錯誤訊息,表示您的應用程式未接聽 HTTP 流量。如果您收到的 HTTP 狀態碼與您在比對器設定中指定的不同,表示您的應用程式正在接聽 HTTP 流量,但並未傳回運作狀態良好目標的狀態碼。

檢查容器執行個體的狀態

假設您從 AWS ECS 服務事件收到下列事件訊息:

"(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)"

在 Amazon EC2 主控台上檢視狀態檢查,以檢查容器執行個體的狀態。如果執行個體未通過系統狀態檢查,請嘗試停止並啟動執行個體

相關資訊

設定路由的目標群組

服務負載平衡

AWS 官方
AWS 官方已更新 2 年前