Como soluciono problemas de conectividade com URI usando uma função do Lambda?

Data da última atualização: 08/07/2022

Tenho problemas de conectividade com minha função do AWS Lambda baseada na Amazon VPC que gera erro. Como solucionar esse problema?

Breve descrição

Você recebe um erro de conexão ao tentar executar a função do Lambda da Amazon Virtual Private Cloud (Amazon VPC) direcionada a um endpoint ou serviço remoto. Isso pode ser devido a um problema de conectividade de rede que gera uma mensagem de erro. Por exemplo, você tenta criar uma tabela do DynamoDB, mas a operação atinge o tempo limite.

Resolução

Crie uma função de teste que replique a configuração de rede da função de destino que você deseja testar. Isso é útil quando você não pode editar a função de destino para adicionar lógica de solução de problemas. Consulte Configurar uma função do Lambda para acessar recursos em uma VPC para obter mais informações sobre como configurar o Lambda para acesso à VPC.

Este é um exemplo de uma função de teste definida:

import socket

def connect_tcp(event, context):
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sock.settimeout(8)
  hostname = "www.amazon.com"
  port = 443
  server_address = (hostname, port) # Server address and port
  try:
    IPAddr = socket.gethostbyname(hostname)
    print("Hostname: " + hostname)
    print("Host IP:" + IPAddr)
    print("Attempting to connect ..")
    sock.connect(server_address)
    sock.shutdown(socket.SHUT_RDWR)
    print("connected")
  except Exception as e:
    print("-- Error --")
    print(e)
  finally:
    sock.close()

Neste exemplo, o tempo limite do soquete é definido como 8 segundos, o que requer que a conexão seja estabelecida dentro desse tempo, caso contrário, ela falhará. Você pode ajustar esse valor, se necessário.

A biblioteca de soquetes é uma dependência de tempo de execução que não é empacotada por padrão com o tempo de execução do Python. Inclua-a como parte do pacote de implantação ou em uma camada associada à função. Consulte Implantar funções do Lambda em Python com arquivos .zip para obter informações sobre como implantar dependências com arquivos zip. Consulte Usar camadas com sua função do Lambda para obter informações sobre como implantar dependências como camadas.

Observação: é prática recomendada tentar replicar o tempo de execução da função de destino. A função de teste é escrita no Python, mas pode ser portada para outros tempos de execução.

Com a função de teste implementada, solucione o problema usando estas etapas:
  1. Defina as variáveis hostname e port para corresponder àquelas com as quais a função de destino está tentando estabelecer uma conexão.
  2. Espelhe a configuração de rede (sub-rede e grupo de segurança) da função de destino.
  3. Defina um valor de tempo limite de função para acomodar qualquer sobrecarga. É prática recomendada garantir que o tempo limite da função seja maior do que o tempo limite da conexão do soquete para permitir uma conexão.
  4. Execute o teste.

Se o teste falhar, provavelmente há um problema de conectividade que deve ser investigado. Se o teste for bem-sucedido, provavelmente existe conectividade entre o ambiente da Amazon VPC do Lambda (incluindo o grupo de segurança) para o endpoint. Nesse caso, provavelmente há um problema com a função de destino e alguma de suas dependências.

Observação: é prática recomendada verificar se a função de teste é iniciada em uma sub-rede semelhante à função de destino com falha, na qual várias sub-redes com diferentes perfis de roteamento estão envolvidas.

Se a sub-rede com falha não for conhecida, faça o rodízio entre as sub-redes para identificar a sub-rede com falha seguindo estas etapas:

  1. Especifique a primeira sub-rede e ignore o aviso de disponibilidade, pois você não implantará isso em uma plataforma de produção.
  2. Teste a função.
  3. Especifique a próxima sub-rede e teste novamente.
  4. Repita a etapa anterior até que todas as sub-redes sejam verificadas.

Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?