跳至内容

如何对 AWS Glue 中的"Unable to execute HTTP request... connect timed out"错误进行故障排除?

2 分钟阅读
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 作业在尝试访问 AWS Glue API 时可能会失败并抛出错误。在为 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 官方已更新 3 年前