如何疑難排解 AWS Glue 中的 "Unable to execute HTTP request.... connect timed out" (無法執行 HTTP 請求... 連線逾時) 錯誤?

3 分的閱讀內容
0

我的 AWS Glue 任務失敗,並顯示 "Unable to execute HTTP request.... connect timed out (無法執行 HTTP 請求... 連線逾時)" 錯誤。

簡短描述

當您執行連接連線的 AWS Glue 任務時,其可能會在嘗試連接到另一個服務端點時失敗。例如,其可能會嘗試連接到 Amazon Simple Storage Service (Amazon S3) 和 AWS Key Management Service (KMS) 之類的服務端點。如果在 AWS Glue 連線中使用的子網路中缺少連到此服務端點的聯網路由,則任務會失敗。AWS Glue 任務日誌中會出現 "Unable to execute HTTP request (無法執行 HTTP 請求)" 或 "failed: connect timed out (失敗:連線逾時)" 錯誤訊息。

您收到此錯誤的原因如下:

  • AWS Glue 連線中設定的子網路包含網際網路閘道,或在失敗服務端點的路由表中沒有路由。
  • 當您執行 AWS Glue 任務時,其會與 AWS Glue API 互動。如果您使用任何需要列出 AWS Glue Data Catalog 資料表、建立新資料表或讀取資料表的操作,就會發生這種情況。當您的任務需要存取 AWS Glue API 時,其會傳送 HTTP REST API 請求。同樣地,您也可能對 Amazon S3、Amazon Simple Notification Service (Amazon SNS) 或 AWS Secret Manager 進行其他服務 API 呼叫。當您進行 API 呼叫時,任務嘗試與這些服務端點連線,但請求失敗並顯示逾時錯誤。發生這種情況是因為儘管任務能夠傳送請求,但在逾時期間內未收到回應。

AWS Glue 會在 AWS Glue 連線中指定的子網路中建立彈性網路介面。如需詳細資訊,請參閱設定對資料存放區的網路存取權

AWS Glue 任務中的資源只有私有 IP 地址。這表示任務無法使用網際網路閘道連線至其他資源。AWS Glue 任務嘗試將請求傳送到公有 AWS 服務端點,但這些請求來自私有 IP 地址。因此,端點無法傳送回應,任務失敗並顯示 "connect timed out" (連線逾時) 錯誤訊息。

解決方案

根據您的使用案例,您在日誌中找到的錯誤訊息類似下列其中一項:

AWS Glue REST API:

AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to glue.ap-southeast-1.amazonaws.com:443

Amazon S3 請求:

Unable to execute HTTP request: Connect to s3BucketName.us-east-1.amazonaws.com:443 [s3BucketName.s3.us-east-1.amazonaws.com/xx.xxx.xx.xxx ] failed: connect timed out

AWS KMS 請求:

Unable to execute HTTP request: Connect to kms.us-east-1.amazonaws.com:443 [kms.us-east-1.amazonaws.com/xx.xxx.xx.xxx ] failed: connect timed out

確認 AWS Glue 任務和任務嘗試向其發出 API 請求的服務之間的流量獲得允許。您可以使用虛擬私有雲端 (VPC) 端點或使用 NAT 閘道來檢查此項。

使用 VPC 端點

使用 Amazon Virtual Private Cloud (Amazon VPC) 主控台為您收到錯誤訊息的服務建立介面 VPC 端點。例如,在嘗試存取 AWS Glue API 時,AWS Glue 任務可能會失敗並擲回錯誤。在為 AWS Glue 連線設定的相同 VPC 子網路中,為 AWS Glue 建立介面端點。這樣可確認應該連接到 AWS Glue 端點的流量使用此介面進行連接。

  1. 開啟 Amazon VPC 主控台
  2. 在導覽窗格中,選擇 Endpoints (端點)。
  3. 選擇 Create endpoint (建立端點)。
  4. 針對 Service category (服務類別),選擇 AWS services (AWS 服務)。
  5. Service name (服務名稱) 中,選擇您要連線的服務。如需詳細資訊,請參閱與 AWS PrivateLink 整合的 AWS 服務
  6. 對於 VPC,選擇您要從中存取 AWS 服務的 VPC。
  7. 若要為 Amazon S3 建立介面端點,您必須清除 Additional settings (其他設定) 和Enable DNS name (啟用 DNS 名稱)。這是因為 Amazon S3 不支援連接 VPC 端點的私有 DNS。
  8. 對於 Subnets (子網路),請為每個要從中存取 AWS 服務的可用區域 (AZ) 選擇一個子網路。
  9. Security group (安全群組) 中,選擇要與端點網路介面關聯的安全群組。安全群組規則必須允許將使用 VPC 端點的資源。VPC 端點會與 AWS 服務通訊,然後 AWS 服務再與端點網路介面通訊。
  10. 針對 Policy (政策),選擇 Full access (完整存取權)。這會允許所有主體透過 VPC 端點對所有資源進行所有操作。或者,選擇 Custom (自訂) 以連結 VPC 端點政策。此政策控制主體必須透過 VPC 端點對資源執行動作的許可。只有在服務支援 VPC 端點政策時,才能使用此選項。如需詳細資訊,請參閲 VPC 端點政策
  11. (選擇性) 若要新增標籤,請選擇 Add new tag (新增標籤),然後輸入標籤鍵和標籤值。
  12. 選擇 Create endpoint (建立端點)。

使用 NAT 閘道

AWS NAT 閘道使用私有網際網路以私密且安全的方式連接資源。建立私有子網路,並將 AWS Glue 連線指向私有子網路。同時,在 AWS Glue VPC 的其中一個公用子網路中建立 NAT 閘道。設定 AWS Glue 連線子網路的路由表,以便在將流量路由到網際網路時使用此 NAT 閘道進行路由。如需詳細資訊,請參閱如何在 Amazon VPC 中針對私有子網路設定 NAT 閘道?以及NAT 閘道

注意:如果您使用的是 NAT 閘道,則連至您服務的流量會透過網際網路傳輸。

其他疑難排解

  1. 檢查連線安全群組和子網路 ACL 是否允許 AWS Glue 在發出 API 請求時傳送流量。
  2. 若要測試連線問題,請在建立 AWS Glue 連線時使用的相同 VPC、子網路和安全群組中啟動 EC2 執行個體。然後執行下列命令,以確認與服務端點的連線:
telnet <glue endpoint url> 443
dig <glue endpoint url>

範例:

$ telnet glue.us-east-1.amazonaws.com 443
$ dig glue.us-east-1.amazonaws.com

相關資訊

疑難排解 AWS Glue 中的錯誤

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