Como soluciono o erro “Unable to execute HTTP request... connect timed out” (Não é possível executar a solicitação HTTP... tempo limite de conexão excedido) no AWS Glue?

7 minuto de leitura
0

Meu trabalho do AWS Glue falha com o erro “Unable to execute HTTP request... connect timed out” (Não é possível executar a solicitação HTTP... tempo limite de conexão excedido).

Descrição breve

Quando um trabalho do AWS Glue é executado com uma conexão ligada a ele, ele pode falhar ao tentar se conectar a outro endpoint de serviço. Por exemplo, ele pode tentar se conectar a um endpoint de serviço, como o Amazon Simple Storage Service (Amazon S3) e o AWS Key Management Service (AWS KMS). O trabalho falhará se a rota de rede para esse endpoint de serviço estiver ausente na sub-rede usada na conexão do AWS Glue. A mensagem de erro “Unable to execute HTTP request” (Não é possível executar a solicitação HTTP) ou “failed: connect timed out” (falha: tempo limite de conexão atingido) aparece nos logs de trabalho do AWS Glue.

Esse erro pode ocorrer pelos seguintes motivos:

  • A sub-rede configurada em sua conexão do AWS Glue contém um gateway da Internet ou nenhuma rota na tabela de rotas para o endpoint de serviço que falhou.
  • Quando o trabalho do AWS Glue é executado, ele interage com as APIs do AWS Glue. Isso acontece quando qualquer operação que exija listar tabelas do Catálogo de Dados do AWS Glue, criar novas tabelas ou ler uma delas é usada. Quando o trabalho precisa acessar a API do AWS Glue, ele envia uma solicitação de API REST HTTP. Da mesma forma, é possível fazer outras chamadas de API de serviço para o Amazon S3, o Amazon Simple Notification Service (Amazon SNS) ou o AWS Secret Manager. Quando você faz a chamada de API, o trabalho tenta se conectar a esses endpoints de serviço e a solicitação falha com um erro de tempo limite excedido. Isso acontece porque, embora o trabalho consiga enviar a solicitação, ele não recebeu a resposta dentro do período de tempo limite.

O AWS Glue cria interfaces de rede elásticas na sub-rede especificada na conexão do AWS Glue. Para obter mais informações, consulte Configurar o acesso à rede para os armazenamentos de dados.

Os recursos nos trabalhos do AWS Glue têm somente endereços IP privados. Isso significa que os trabalhos não conseguem se conectar a outros recursos usando um gateway da Internet. O trabalho do AWS Glue tenta enviar solicitações para o endpoint público do serviço da AWS, mas essas solicitações são provenientes de um endereço IP privado. Portanto, o endpoint não consegue enviar uma resposta de volta e o trabalho falha com a mensagem de erro “connect timed out” (tempo limite da conexão excedido).

Resolução

A mensagem de erro encontrada nos logs é semelhante a uma das seguintes, dependendo do seu caso de uso:

API REST do AWS Glue:

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

Solicitação do 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

Solicitação do 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

Confirme se o tráfego entre o trabalho do AWS Glue e o serviço para o qual o trabalho está tentando fazer uma solicitação de API é permitido. Você pode verificar isso usando um endpoint de nuvem privada virtual (VPC) ou um gateway de NAT.

Usar endpoint da VPC

Use o console do Amazon Virtual Private Cloud (Amazon VPC) para criar um endpoint da VPC da interface para o serviço do qual você recebeu o erro. Por exemplo, o trabalho do AWS Glue pode falhar e gerar um erro ao tentar acessar a API do AWS Glue. Crie o endpoint da interface para o AWS Glue na mesma sub-rede VPC configurada para a conexão do AWS Glue. Isso confirma que o tráfego que deveria se conectar ao endpoint do AWS Glue o faz usando essa interface.

  1. Abra o console do Amazon VPC.
  2. No painel de navegação, escolha Endpoints.
  3. Escolha Create endpoint (Criar endpoint).
  4. Em Service category (Categoria do serviço), escolha AWS services (Serviços da AWS).
  5. Em Service name (Nome do serviço), escolha o serviço ao qual você está se conectando. Para obter mais informações, consulte Serviços da AWS que se integram ao AWS PrivateLink.
  6. Em VPC, escolha a VPC da qual você deseja acessar o serviço da AWS.
  7. Para criar um endpoint da interface para o Amazon S3, é necessário desmarcarAdditional settings (Configurações adicionais) e Enable DNS name (Habilitar nome de DNS). Isso ocorre porque o Amazon S3 não oferece suporte a DNS privado para endpoints da VPC da VPC.
  8. Em Subnets (Sub-redes), escolha uma sub-rede por zona de disponibilidade (AZ) da qual você deseja acessar o serviço da AWS.
  9. Em Security group (Grupo de segurança), escolha um grupo de segurança para associar às interfaces de rede do endpoint. As regras do grupo de segurança devem permitir recursos que usarão o endpoint da VPC. O endpoint da VPC se comunica com o serviço da AWS, que então se comunica com a interface de rede do endpoint.
  10. Em Policy (Política), escolha Full access (Acesso total). Isso permite todas as operações de todas as entidades principais em todos os recursos no endpoint da VPC. Ou escolha Custom (Personalizada) para anexar uma política de endpoint da VPC. Essa política controla as permissões das entidades principais para realizar ações em recursos no endpoint da VPC. Esta opção estará disponível somente se o serviço oferecer suporte às políticas de endpoint da VPC. Para obter mais informações, consulte Políticas de endpoint da VPC.
  11. (Opcional) Para adicionar uma tag, escolha Add new tag (Adicionar nova tag) e, em seguida, insira a chave da tag e o valor da tag.
  12. Escolha Create endpoint (Criar endpoint).

Usar um gateway de NAT

Um gateway de NAT da AWS conecta recursos de forma privada e segura usando a Internet privada. Crie uma sub-rede privada e direcione sua conexão do AWS Glue para uma sub-rede privada. Ao mesmo tempo, crie um gateway de NAT em uma das sub-redes públicas da sua VPC do AWS Glue. Configure a tabela de rotas da sua sub-rede de conexão do AWS Glue para que, se o tráfego for roteado para a Internet, ele o faça usando esse gateway de NAT. Para obter mais informações, consulte How do I set up a NAT gateway for a private subnet in Amazon VPC? (Como faço para configurar um gateway NAT para uma sub-rede privada no Amazon VPC?) e NAT gateways (Gateways de NAT).

Observação: se você estiver usando um gateway de NAT, o tráfego para seu serviço passará pela Internet.

Solução de problemas adicionais

  1. Verifique se o grupo de segurança da conexão e a ACL da rede de sub-rede permitem que o AWS Glue envie tráfego ao fazer a solicitação de API.
  2. Para testar o problema de conectividade, execute uma instância do EC2 na mesma VPC, sub-rede e grupo de segurança que você usou ao criar a conexão do AWS Glue. Em seguida, execute o comando a seguir para confirmar a conectividade com o endpoint do serviço:
telnet <glue endpoint url> 443
dig <glue endpoint url>

Exemplos:

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

Informações relacionadas

Solução de problemas de erros no AWS Glue

AWS OFICIAL
AWS OFICIALAtualizada há um ano