Como soluciono problemas de tempo-limite de invocação de função do Lambda?
Última atualização: 11/01/2022
Minha função do AWS Lambda está expirando intermitentemente, mesmo que eu não tenha implantado alguma alteração de código. Como soluciono problemas de tempo-limite de função do Lambda e como evito que as funções do Lambda atinjam o tempo-limite?
Resolução
As funções do Lambda podem atingir o tempo-limite por vários motivos. Para solucionar problemas de tempo-limite de função do Lambda, primeiro determine o que está causando o problema usando um dos serviços e recursos da AWS listados neste artigo. Em seguida, corrija o problema com base no seu caso de uso.
Para evitar que a função do Lambda atinja o tempo-limite, consulte a seção Práticas recomendadas para evitar que as funções do Lambda atinjam o tempo-limite deste artigo.
Verificar se a função do Lambda está atingindo o tempo-limite
Recupere os IDs de solicitação de qualquer invocação que tenha atingido o tempo-limite procurando a frase Task timed out (A tarefa atingiu o tempo-limite) no grupo de logs do Amazon CloudWatch referentes à função. Em seguida, use os IDs de solicitação das invocações associadas que atingiram o tempo-limite para recuperar os logs completos de cada tempo-limite de invocação.
Para obter instruções, consulte Como determino se minha função do Lambda está atingindo o tempo-limite?
Identificar o que faz a função do Lambda atingir o tempo-limite
Use um ou mais dos seguintes métodos para identificar o ponto de falha que faz a sua função atingir o tempo-limite:
Analisar seus Amazon CloudWatch Logs para Lambda
É possível usar o CloudWatch para visualizar todos os logs gerados pelo código da sua função e identificar possíveis problemas. Para obter mais informações, consulte Acesso aos Amazon CloudWatch Logs para AWS Lambda.
Se sua função retorna um rastreamento de pilha, a respectiva mensagem de erro especifica o que causa o erro.
Importante: o Lambda gera três linhas de log para cada invocação automaticamente (START, END e REPORT). Essas três linhas são as únicas que aparecerão nos CloudWatch Logs da sua função se uma das seguintes situações for verdadeira:
- Não há outro registro explícito configurado no código personalizado da função do Lambda.
- O limite de duração da função é atingido antes que o Lambda possa executar o código da função que gera logs.
Se, depois de analisar os logs, você não conseguir determinar o que faz o tempo-limite expirar, tente um ou mais dos seguintes procedimentos:
- Verifique se a contagem de novas tentativas e as configurações de tempo-limite no AWS SDK que você está usando permitem tempo suficiente para a inicialização da sua função.
- Aumente temporariamente a configuração de tempo-limite da função do Lambda para permitir tempo suficiente para que o código da função gere dados de log.
- Aumente a memória configurada da função para ajudar a reduzir a latência de duração da invocação.
Para adicionar mais saída de log ao código da sua função, consulte a seguinte documentação referente ao tempo de execução do Lambda que você está usando:
- Registro de logs da função do AWS Lambda em Node.js
- Registro de logs da função do AWS Lambda em Python
- Registro de logs da função do AWS Lambda em Ruby
- Registro de logs da função do AWS Lambda em Java
- Registro de logs da função do AWS Lambda em Go
- Registro de logs da função do AWS Lambda em C#
- Registro de logs da função do AWS Lambda em PowerShell
Usar o AWS X-Ray para identificar quaisquer gargalos de performance do código
Se a função do Lambda usar recursos da AWS downstream, microsserviços, bancos de dados ou APIs da web HTTP, você poderá usar o AWS X-Ray para ajudar a solucionar problemas de performance de código.
Para obter mais informações, consulte Uso do AWS Lambda com o AWS X-Ray.
Usar o Lambda Insights para coletar métricas no nível do sistema para sua função
O Lambda Insights coleta métricas no nível do sistema, incluindo tempo de CPU, memória, disco e métricas de rede. Ele também coleta informações de diagnóstico, incluindo partidas a frio e desligamentos de operador do Lambda para ajudar a isolar problemas nas suas funções do Lambda.
Para obter mais informações, consulte Uso do Lambda Insights.
Nota: o uso do Lambda Insights incorre em cobranças na sua conta da AWS. Você é cobrado pelo tempo de invocação consumido pela extensão do Lambda em incrementos de 1 ms.
Usar os VPC Flow Logs para determinar por que uma solicitação de invocação específica foi negada ou não encaminhada
VPC Flow Logs permitem que você veja todo o tráfego de rede que flui de e para uma Amazon Virtual Private Cloud (Amazon VPC).
Para obter mais informações, consulte Solucionar problemas de rede no Lambda.
Nota: se você optar por configurar os VPC Flow Logs, lembre-se do seguinte:
- Cobranças por ingestão e arquivamento de dados de logs vendidos incorrem quando você publica logs de fluxo em um destes:
CloudWatch Logs
Amazon Simple Storage Service (Amazon S3) - Quando você configura uma função do Lambda para acessar recursos em uma Amazon VPC, o Lambda atribui a função a uma interface de rede elástica. Para identificar o tráfego de rede associado à função do Lambda, você deve localizar a interface de rede da função. Para obter instruções, consulte Por que não consigo desvincular ou excluir uma interface de rede elástica criada pelo Lambda?
Use ligações seguras HTTP para registrar o log detalhado de solicitações de rede que são geradas pelo código da função durante uma invocação
Para obter mais informações, consulte Registro de log de ligações seguras HTTP.
Práticas recomendadas para evitar atingir o tempo-limite da função do Lambda
Certificar-se de que sua função do Lambda seja idempotente
As chamadas de API podem demorar mais do que o esperado quando ocorrem problemas de conexão de rede. Problemas de rede também podem causar novas tentativas e solicitações de API duplicadas. Para se preparar para essas ocorrências, verifique se a função do Lambda é idempotente.
Para obter mais informações, consulte Como faço para tornar minha função do Lambda idempotente?
Inicializar a lógica estática da sua função fora do manipulador de função
Quando você inicializa uma função do Lambda, ele aloca até 10 segundos para que a fase de inicialização da invocação seja concluída. Devido a essa restrição de tempo, é uma prática recomendada fazer o seguinte fora do manipulador de função no código de inicialização:
- Importar bibliotecas e dependências
- Ajustar a configuração
- Inicializar conexões com outros serviços e recursos downstream
Essa inicialização estática permite que esses recursos sejam inicializados uma vez por sandbox e, em seguida, reutilizados para todas as invocações futuras no ambiente do tempo de execução.
Para obter mais informações, consulte Otimização da inicialização estática. Há também a indisponibilidade de downstream no Guia do operador do Lambda e o código da função no Guia do desenvolvedor do Lambda.
Nota: o Lambda remove conexões ociosas para recursos downstream. Para permitir que sua função mantenha uma conexão persistente, use a variável tcp_keepalive associada ao tempo de execução do Lambda que você está usando.
Verifique se as configurações de contagem e tempo-limite de repetição no AWS SDK que você está usando permitem tempo suficiente para que sua função seja inicializada.
Se você fizer uma chamada de API usando um AWS SDK e a chamada falhar, o AWS SDK repetirá a chamada automaticamente. A quantidade de vezes que o AWS SDK tenta novamente e por quanto tempo são determinados pelas configurações, que variam para cada AWS SDK. Sua função pode precisar de mais tempo para inicializar do que as configurações padrão do AWS SDK permitem.
Para obter mais informações, consulte Como soluciono problemas de repetição e tempo-limite ao invocar uma função do Lambda usando um AWS SDK?
(Opcional) Configurar a simultaneidade provisionada para sua função do Lambda
A simultaneidade provisionada inicializa um número solicitado de ambientes do tempo de execução para que eles estejam preparados para responder imediatamente às invocações da sua função. Para configurar a simultaneidade provisionada para sua função, siga as instruções em Configuração da simultaneidade provisionada.
Para obter mais informações, consulte Gerenciamento de simultaneidade para uma função do Lambda.
Nota: a configuração da simultaneidade provisionada incorre em cobranças na sua conta da AWS. É possível configurar a simultaneidade provisionada em uma versão de uma função ou em um alias de função do Lambda.
Verificar se a função do Lambda tem recursos de sistema suficientes
A quantidade de largura de banda de rede e CPU alocada para uma invocação de função do Lambda é determinada pela configuração de memória da função.
Para obter mais informações, consulte Memória e capacidade de computação no Guia do operador do Lambda.
Certifique-se de que todos os processos em segundo plano que sua função do Lambda usa sejam concluídos antes que o manipulador de função retorne uma string
Para obter mais informações, consulte Noções básicas sobre a reutilização de contêineres no AWS Lambda.
Verificar se a função do Lambda está configurada para funcionar dentro das configurações de tempo-limite máximo de qualquer serviço integrado da AWS
Embora o limite máximo de tempo-limite de invocação de uma função do Lambda seja de 15 minutos, outros serviços da AWS podem ter tempos-limite diferentes.
Por exemplo, o Amazon API Gateway aguarda no máximo 29 segundos pela conclusão de uma invocação de proxy de função do Lambda. Para obter mais informações, consulte Como faço para resolver os erros que recebo ao integrar o API Gateway a uma função Lambda? Há também Uso do AWS Lambda com outros serviços.
Confirmar se há um caminho de rede válido para o endpoint que sua função está tentando alcançar
Para revisar suas configurações de rede, siga as instruções em Como soluciono problemas de tempo-limite de uma função do Lambda que está em uma Amazon VPC?
Este artigo ajudou?
Precisa de ajuda com faturamento ou suporte técnico?