跳至內容

如何對 Amazon ECS 中的 Service Connect 問題進行疑難排解?

3 分的閱讀內容
0

我的 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 區域中的可用命名空間。

若要確認您已在執行個體命名空間中註冊任務,請完成下列步驟:

  1. 若要取得命名空間 ID,請執行下列 list-namespaces 命令:

    aws servicediscovery list-namespaces
  2. 使用 AWS Cloud Map 主控台或 AWS CLI 列出命名空間中的服務

  3. 若要查看服務的註冊執行個體,請執行以下 list-instances 命令:

    aws servicediscovery list-instances --service-id srv-serviceID

    注意:serviceID 替換為您的服務 ID。

  4. 如果您沒有註冊執行個體,請執行下列 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 之間的流量。

檢查服務任務之間的連線性

請完成以下步驟:

  1. 如果您在 AWS Fargate 上執行任務,請啟動 ECS Exec。如果您在 Amazon Elastic Compute Cloud (Amazon EC2) 上執行任務,請繼續執行步驟 3。

  2. 執行以下 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 替換為您的容器執行個體。

  3. 若要確定您的連線使用 Service Connect Proxy,請執行下列命令:

    curl -I http://$IPaddress:portnumber/healthcheck

    注意:IPaddress 替換為任務的私有 IP 位址,將 portnumber 替換為容器執行個體連接埠,將 healthcheck 替換為容器運作狀態檢查路徑。

    檢查 server: envoy 標頭的命令輸出,以確認連線使用 Proxy。如果您的連線不使用 Proxy,請確定您的 Service Connect 組態正確。

  4. 若要開啟 /etc/hosts 檔案,請執行以下命令:

    cat /etc/hosts

    檢查命令的輸出,以確定您可以看到其他服務的端點。如果您沒有看到服務端點,請確定您的 Service Connect 組態正確。

  5. 如果您變更了 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。

相關資訊

Amazon ECS Service Connect 元件

AWS 官方已更新 2 年前