Todos nós amamos o serverless, especialmente quando se trata de funções AWS LAMBDA.
Existem bons motivos para isso para eventos orientados, desacoplamento, automação e muitos outros motivos para o lançamento do AWS Lambda.
Mas pode haver situações em que nosso querido amigo LAMBDA pode se transformar em inimigo e nos custar dinheiro, tempo de inatividade, e esses momentos são Loops recursivos não intencionais.
Neste blog, vamos falar sobre um recurso muito simples, mas poderoso: detecção de loop recursivo entre AWS Lambda e S3 Bucket.
Motivação
O que é a detecção de loops e loops recursivos lambda AWS?
- Ao configurar uma função Lambda para interagir com o mesmo serviço ou recurso que a aciona, há o risco de criar um loop recursivo infinito.
- Por exemplo, uma função Lambda pode enviar uma mensagem para uma fila do Amazon Simple Queue Service (SQS), que então aciona a mesma função novamente.
- Isso leva a um ciclo de invocações repetidass.
O que isso significa para você?
- Ciclos recursivos não intencionais podem levar a custos disparados, já que sua conta AWS sofre cobranças inesperadas.
- Pior ainda, esses loops podem fazer com que suas funções Lambda escalem rapidamente fora de controle, consumindo toda a concorrência disponível da sua conta. Isso não afeta apenas a função atual, mas também pode derrubar outros processos críticos, deixando todo o seu sistema sobrecarregado e sem resposta. É um erro caro que você não quer enfrentar!
*ESSE É EXATAMENTE O PROBLEMA QUE A DETECÇÃO DE LOOPS LAMBDA DA AWS TENTA RESOLVER. *
O que essa atualização significa para você?
- Até agora, a detecção de loops Lambda do AWS era suportada apenas para Amazon SQS e Amazon SNS e , a partir de hoje, o s3 também se junta a este grupo.
Como Lambda detecta loop
- Lambda detecta loops recursivos usando cabeçalhos de rastreamento de raios X AWS. Quando suportados, os serviços AWS enviam eventos para Lambda
- Eles incluem metadados que rastreiam quantas vezes o evento invocou a função.
- Se o mesmo evento acionar a função cerca de 16 vezes seguidas, o Lambda automaticamente para novas invocações e te alerta. Outros gatilhos para a função não são afetados por esse limite.
Você pode saber mais sobre isso aqui.
Vamos ver em ação.
- Criar um bucket de s3, mantendo tudo padrão.

- Crie uma função lambda que envie um arquivo txt para o bucket do s3 sempre que o lambda for invocado.
- Nota: O timeout padrão do Lambda é 3 segundos e o upload de um arquivo leva mais que isso, então aumente o timeout para 10 segundos, caso contrário você verá erro de timeout.
Importação BOTO3
Importação de SO
importar aleatório
Importar string
Def lambda_handler(evento, contexto):
# Defina o balde S3
s3_bucket = 'seu-nome-de-balde-s3' # Substitua pelo nome do seu balde S3
# Gerar uma string aleatória para adicionar ao nome do arquivo
random_string = ''.join(random.choices(string.ascii_lowercase + string.digits, k=6))
# Defina o conteúdo e a chave do arquivo (com string aleatória adicionada)
s3_key = f'your-file-{random_string}.txt' # A chave (caminho) do arquivo em S3
file_content = "Olá, este é um arquivo de texto de exemplo criado pela Lambda com um sufixo aleatório!"
# Criar o arquivo localmente no diretório /tmp
local_file_path = '/tmp/sample_file.txt'
# Escreva conteúdo no arquivo
com open(local_file_path, 'w') como arquivo:
file.write(file_content)
# Inicializar cliente S3
s3 = boto3.client('s3')
# Envie o arquivo para a S3
Tente:
s3.upload_file(local_file_path, s3_bucket, s3_key)
return {
'statusCode': 200,
'body': f"Arquivo enviado com sucesso para {s3_bucket}/{s3_key}"
}
exceto a exceção como e:
return {
'statusCode': 500,
'body': f"Erro carregando arquivo: {str(e)}"
}
- Adicionar gatilho à função lambda como gatilho S3.

- Adicionar permissão S3 à função Lambda IAM. Essas permissões permitirão que a função lambda do AWS faça upload do arquivo para o bucket S3
- Para a brevidade do blog, anexarei a Política gerenciada 'AmazonS3FullAccess'

- Faça upload de qualquer arquivo para o bucket do S3. Depois de alguns segundos, você verá arquivos sendo enviados automaticamente para o bucket.
- Você verá que o Lambda é invocado exatamente 16 vezes em outros amigos, o Lambda enviará exatamente 16 arquivos e então a detecção de loop será ativada.

Maneiras de Receber Notificações para Detecção de Loop
- De acordo com o documento, existem várias formas de receber notificações do loop recursivo, como notificações do AWS Health Dashboard, alertas por e-mail que podem levar até 3 horas para serem recebidos após o Lambda interromper uma invocação recursiva antes de você receber esse alerta por e-mail.
- Atualizarei meu blog assim que receber. (notificação por e-mail adicionada)
- Mas a maneira mais rápida e confiável é verificar as métricas de visualização na nuvem para a função 'RecursiveInvocationsDropped'
A métrica CloudWatch RecursiveInvocationsDropped registra o número de invocações de funções que o Lambda parou porque sua função foi invocada mais de aproximadamente 16 vezes em uma única cadeia de requisições.
Do ponto de vista do Solutions Architect
- Saber que existe um loop recursivo é importante, mas é ainda mais importante entender como responder de forma que loops não ocorram seja ainda mais improente:
- Como o loop recursivo faz o Lambda escalar e usar toda a concorrência disponível da sua conta, defina a concorrência disponível para zero para restringir invocações futuras.
- A maneira mais simples de parar a invocação ou, em outras palavras, remover o gatilho que invoca o lambda
- Corrigir sua configuração/código que causou o loop recursivo no meu código, é o mesmo nome do bucket.
- Também há a opção de permitir lambda em loop recursivo se o projeto da sua arquitetura exigir isso.
- É muito importante entender que a detecção de loop Lambda é suportada para SQL, SNS e agora S3. Serviços AWS como Amazon DynamoDB fazem parte do loop, o Lambda atualmente não consegue detectar e parar.
Neste blog, vimos como podemos economizar dinheiro e evitar o tempo de inatividade do lambda da nossa conta quando é acionado com o S3, levando a um ciclo recursivo.
Você também concorda que essa atualização só deixou o Lambda ainda melhor?