Como faço minha função Lambda funcionar corretamente com minha instância do Amazon EC2 ou o AWS Instance Scheduler?

Última atualização: 08-09-2021

Uso uma instância do Amazon Elastic Compute Cloud (Amazon EC2) ou o AWS Instance Scheduler com uma função AWS Lambda. Mas minha função Lambda expira, não é invocada ou gera erros.

Breve descrição

O AWS Instance Scheduler pode fazer com que a função Lambda funcione incorretamente pelos seguintes motivos:

  • O tempo limite do SDK é excedido. Para resolver esse problema, conclua as etapas na seção Corrigir tempo limite do SDK.
  • O tempo limite da função é excedido. Para resolver esse problema, conclua as etapas na seção Prevenir tempo limite da função.
  • Uma regra do Amazon CloudWatch Events não foi acionada. Para resolver esse problema, conclua as etapas na seção Verificar se a regra agendada foi invocada.
  • Sua função está sendo controlada. Para resolver esse problema, conclua as etapas na seção Prevenir controle de utilização da função.
  • Você obtém invocações duplicadas do Lambda. Para resolver esse problema, conclua as etapas na seção Prevenir erros usando idempotência.

Observação: o AWS Instance Scheduler executa funções Lambda em intervalos definidos usando uma regra do CloudWatch Events para agendar a função Lambda. Isso resulta em uma invocação assíncrona da função Lambda, o que afeta a forma como os erros de função são tratados. Se a função falhar devido a um erro durante a execução, o mesmo evento será tentado novamente até mais duas vezes por padrão. Em seguida, o evento é descartado. No caso de controles de utilização, o evento pode ser enfileirado por até seis horas antes de ser descartado.

Resolução

Corrigir tempo limite do SDK

O tempo limite padrão do SDK não é ignorado em versões anteriores do AWS Instance Scheduler. Se a chamada de API para iniciar ou interromper uma instância demorar mais de 60 segundos para responder nas versões anteriores, o tempo limite da solicitação expirará.

Para resolver esse problema, obtenha a versão mais recente do AWS Instance Scheduler ou modifique o valor read_timeout do objeto de Config Boto3 (no site do Boto3). Por exemplo:

import boto3
from botocore.config import Config

client_config = Config(read_timeout=890)

ec2 = boto3.client('ec2', config=client_config)

Prevenir tempo limite da função

Se a função Lambda tiver expirado, confira se a função está aguardando para verificar se a instância do EC2 foi iniciada. Para obter mais informações, consulte Por que não consigo iniciar ou executar minha instância do EC2?

As instâncias podem levar alguns minutos para atingir o estado RUNNING (em execução). A função pode atingir o tempo limite se o tempo para atingir o estado RUNNING for maior que o tempo limite configurado para a função. Para resolver esse problema, aumente o tempo limite para a função modificando o valor de Timeout (tempo limite) de 300 (5 minutos) no modelo do AWS CloudFormation. É necessário que haja tempo suficiente para que a instância seja iniciada antes que a função atinja ao tempo limite. Por exemplo:

"Runtime": "python3.7",
"Timeout": 300,
"TracingConfig": {
    "Mode": "Active"
}

Observação: as funções Lambda têm um valor máximo de tempo limite configurável de 15 minutos.

Se a função estiver em uma nuvem privada virtual, será necessário permitir que ela acesse a Internet para fazer chamadas para a API do Amazon EC2.

Verificar se a regra agendada foi invocada

Para solucionar problemas de uma função Lambda que não está sendo invocada pelo CloudWatch Events, consulte Por que minha função Lambda não foi acionada pela regra do CloudWatch Events?

Prevenir controle de utilização da função

Para prevenir controle de utilização da função, consulte Como soluciono problemas de controle de utilização da função Lambda com os erros “Rate exceeded” e 429 “TooManyRequestsException”?

Para invocações assíncronas, os controles de utilização de Lambda em sua conta podem afetar a capacidade da função ser invocada. Todas as invocações assíncronas são enviadas para uma fila de eventos antes de serem invocadas. Se outra função também recebeu um grande número de invocações assíncronas, a fila de eventos pode ficar com uma lista de pendências. Essa lista de pendências não significa que a função não é invocada. Essa lista de pendências significa que o evento foi atrasado. É possível ver várias invocações depois que a lista de pendências da fila de eventos é limpa. Por padrão, os eventos na fila de eventos assíncronos permanecem na fila de eventos assíncronos por até seis horas.

Prevenir erros usando idempotência

Para evitar erros de invocações duplicadas, torne sua função Lambda idempotente quando ela for configurada com uma invocação assíncrona.

Lembre-se de que as invocações assíncronas do Lambda podem ocorrer mais de uma vez devido à consistência final com a fila de eventos.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?