如何對 Amazon ECS 中的 Service Connect 問題進行疑難排解?
我的 Amazon Elastic Container Service (Amazon ECS) 服務無法連線到其他服務。
解決方法
注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
組態錯誤或網路問題會導致服務間的通訊問題。若要解決這些問題,請執行下列疑難排解動作。
檢查您的服務連線組態
確認您是否啟動了 Service Connect
先決條件: 若要使用 Amazon ECS Service Connect,請您符合 Service Connect 要求。
若要檢查您是否為 Amazon ECS 服務啟動了 Service Connect,請執行下列 describe-services AWS CLI 命令:
aws ecs describe-services --cluster cluster-name --services service-name
注意: 將 cluster-name 替換為您的叢集名稱,將 service-name 替換為您的服務名稱。
輸出範例:
"serviceConnectConfiguration": { "enabled": true,
注意: 如果 Amazon ECS 服務必須允許來自其他服務的網路流量,請確定將 Service Connect 組態設定為用戶端伺服器服務。若要檢查此組態,請查看**「serviceConnectionConfiguration」下「services」**的命令輸出。
檢查服務的命名空間
若要使用 Service Connect,您必須在相同命名空間中設定 Amazon ECS 服務。另外,請確定您的用戶端服務和用戶端伺服器服務位於相同命名空間。若要檢查服務的命名空間,請執行以下 describe-services 命令:
aws ecs describe-services --cluster cluster-name --services service-name | grep namespace
注意: 將 cluster-name 替換為您的叢集名稱,將 service-name 替換為您的服務名稱。
在輸出中,檢查命名空間的值。若要更新服務的命名空間,請使用 Amazon ECS 主控台更新 Service Connect 組態設定。或者,執行以下 update-service 命令:
aws ecs update-service --cluster cluster-name --service service-name --service-connect-configuration enabled=true,namespace=Namespace-name --force-new-deployment
**注意:**將 cluster-name 替換為您的叢集名稱,將 service-name 替換為您的服務名稱,並將 Namespace-name 替換為您的命名空間。
如果用戶端服務無法解析用戶端伺服器服務 DNS,您將收到下列其中一個錯誤訊息:
- 「伺服器找不到 DNS: NXDOMAIN」
- 「伺服器找不到 example.core.staging.local: NXDOMAIN」
若要解決此問題,請執行下列 get-namespace 命令,以確認您是否在 AWS Cloud Map 中註冊了命名空間:
aws servicediscovery get-namespace --id namespace
注意: 將 namespace 替換為您的命名空間 ID。
檢查命令的輸出,以查看 AWS 帳戶和 AWS 區域中的可用命名空間。
若要確認您已在執行個體命名空間中註冊任務,請完成下列步驟:
-
若要取得命名空間 ID,請執行下列 list-namespaces 命令:
aws servicediscovery list-namespaces -
若要查看服務的註冊執行個體,請執行以下 list-instances 命令:
aws servicediscovery list-instances --service-id srv-serviceID注意: 將 serviceID 替換為您的服務 ID。
-
如果您沒有註冊執行個體,請執行下列 update-service 命令以重新部署任務:
aws ecs update-service --cluster cluster-name --service service-name --region region-name --force-new-deployment注意: 將 cluster-name 替換為您的叢集名稱,將 service-name 替換為您的服務名稱,將 Region-name 替換為您的區域。
或者,使用 Amazon ECS 主控台更新服務,並選擇強制執行新部署。
檢查您的連接埠對應名稱
如果您未在任務定義中設定連接埠對應名稱,則會收到下列錯誤訊息:
「找不到連接埠別名。選取其他任務定義系列和修訂版本,將連接埠對應設定為使用用戶端和伺服器模式。」
若要解決此問題,請更新任務定義,並為 portMappings 下的 name 參數新增值。
任務定義範例:
"portMappings": [ { "name": "portmappingnameexample", "containerPort": 3000, "hostPort": 3000, "protocol": "tcp" }
檢查您的網路 ACL 和安全群組設定
確定您的網路存取控制清單 (網路 ACL) 和安全群組使用下列組態:
- 用戶端服務允許傳出流量到達用戶端伺服器服務安全群組的連接埠。
- 用戶端伺服器服務安全群組允許用戶端服務連接埠上的傳入流量。
- 虛擬私有網路 (VPC) 網路 ACL 允許 containerPort 和 ingressPortOverride 連接埠上的流量。
- 如果服務任務在不同的 VPC 中執行,則您的 VPC 對等互連或傳輸閘道必須允許 VPC 之間的流量。
檢查服務任務之間的連線性
請完成以下步驟:
-
如果您在 AWS Fargate 上執行任務,請啟動 ECS Exec。如果您在 Amazon Elastic Compute Cloud (Amazon EC2) 上執行任務,請繼續執行步驟 3。
-
執行以下 execute-command 命令以遠端連線到容器:
aws ecs execute-command --cluster cluster-name \ --task task-id \ --container container-name \ --interactive \ --command "/bin/sh"注意: 將 cluster-name 替換為您的叢集名稱,將 task-id 替換為您的任務 ID,將 container-name 替換為您的容器執行個體。
-
若要確定您的連線使用 Service Connect Proxy,請執行下列命令:
curl -I http://$IPaddress:portnumber/healthcheck注意: 將 IPaddress 替換為任務的私有 IP 位址,將 portnumber 替換為容器執行個體連接埠,將 healthcheck 替換為容器運作狀態檢查路徑。
檢查 server: envoy 標頭的命令輸出,以確認連線使用 Proxy。如果您的連線不使用 Proxy,請確定您的 Service Connect 組態正確。
-
若要開啟 /etc/hosts 檔案,請執行以下命令:
cat /etc/hosts檢查命令的輸出,以確定您可以看到其他服務的端點。如果您沒有看到服務端點,請確定您的 Service Connect 組態正確。
-
如果您變更了 Service Connect 組態,請執行下列 update-service 命令以重新部署任務:
aws ecs update-service --cluster cluster-name --service service-name --region region-name --force-new-deployment注意: 將 cluster-name 替換為您的叢集名稱,將 service-name 替換為您的服務名稱,將 Region-name 替換為您的區域。
或者,使用 Amazon ECS 主控台更新服務,並選擇強制執行新部署。
重新部署您的用戶端服務任務
如果您收到「無法解析主機」錯誤訊息,則您的任務無法解析服務端點。您可能會收到「ping:錯誤位址 ‘DNS’」錯誤訊息。
若要解決這些問題,請重新部署現有的用戶端服務任務。
查看您的應用程式日誌
檢查應用程式日誌中的連線或執行時期錯誤。Amazon ECS 會根據您的日誌驅動程式,將日誌匯出到不同的目的地。如果您使用 awslogs 驅動程式,則 Amazon ECS 會將日誌匯出到 Amazon CloudWatch。
相關資訊
- 語言
- 中文 (繁體)

相關內容
已提問 2 年前
已提問 3 年前
已提問 2 年前