詳細検索

AWS Lambda e S3 Ficaram Mais Inteligentes: Como a AWS Previne Loops Recursivos Automaticamente

Avatar
por Jatin Mehrotra
5 min de leitura

AWS Lambda e S3 Ficaram Mais Inteligentes: Como a AWS Previne Loops Recursivos Automaticamente
Traduzido do English • Ver original

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?

Você sempre pode entrar em contato comigo no Linkedin, X.

Related Articles