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

Última atualização: 9/9/2021

Eu uso uma instância do Amazon Elastic Compute Cloud (Amazon EC2) ou o AWS Instance Scheduler com uma função do 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 da seção Prevenir tempo limite da função.
  • Uma regra do Amazon EventBridge não foi iniciada. Para resolver esse problema, conclua as etapas da seção Verificar se a regra programada 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 EventBridge para agendar a função Lambda. Isso resulta em uma invocação assíncrona da função Lambda, o que afeta o modo 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á repetido até mais duas vezes, por padrão. Em seguida, o evento será descartado. Se houver controle de utilização, o evento poderá ficar na fila por até seis horas antes de ser descartado.

Resolução

Corrigir tempo limite do SDK

O tempo limite padrão do SDK não é substituído em versões anteriores do programador de instâncias da AWS. 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 Why can't I start or launch my EC2 instance? (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 poderá 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 (cinco minutos) no modelo do AWS CloudFormation. É necessário que haja tempo suficiente para a instância ser iniciada antes que a função atinja o 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 programada foi invocada

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

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 tiver recebido um grande número de invocações assíncronas, a fila de eventos poderá 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?