跳至內容

如何對 AWS Glue 中的 "Unable to execute HTTP request... connect timed out" 錯誤進行疑難排解?

3 分的閱讀內容
0

我的 AWS Glue 作業失敗並發生錯誤"Unable to execute HTTP request... connect timed out"。

簡短描述

當您執行附加了連線的 AWS Glue 作業,它在嘗試連線到另一個服務端點時可能會失敗。例如,它可能會嘗試連線到服務端點,如 Amazon Simple Storage Service (Amazon S3) 和 AWS Key Management Service (AWS KMS)。如果 AWS Glue 連線中使用的子網路中缺少通往此服務端點的網路路由,則工作將會失敗。AWS Glue 作業日誌中出現 "Unable to execute HTTP request" 或 "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 console (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 官方已更新 3 年前