如何解决 AWS Glue 中的“Unable to execute HTTP request.... connect timed out(无法执行 HTTP 请求...连接超时)”错误?

2 分钟阅读
0

我的 AWS Glue 任务失败,出现错误“Unable to execute HTTP request.... connect timed out(无法执行 HTTP 请求...连接超时)”。

简短描述

当您在连接的情况下运行 AWS Glue 任务时,它在尝试连接到另一个服务端点时可能会失败。例如,它可能会尝试连接到诸如 Amazon Simple Storage Service(Amazon S3)和 AWS Key Management Service(AWS 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 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(子网),为每个可用区(AZ)选择一个子网,以便从中访问 AWS 服务。
  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 年前