O blog da AWS

Apresentando os controles avançados de logging para funções do AWS Lambda

Esta publicação foi escrita por Nati Goldberg, arquiteto sênior de soluções e Shridhar Pandey, gerente sênior de produtos do AWS Lambda e adaptado para o português pela Bianca Mota, arquiteta de soluções do segmento de startups

Hoje, a AWS está lançando controles avançados de logging para o AWS Lambda, oferecendo aos desenvolvedores e operadores maior controle sobre como os logs de funções são capturados, processados e consumidos.

Este lançamento apresenta três novos recursos para fornecer uma experiência de logging padrão simplificada e aprimorada no Lambda.

Primeiro, você pode capturar logs de funções do Lambda no formato estruturado JSON sem precisar usar suas próprias bibliotecas de logging. Os logs estruturados em JSON facilitam a pesquisa, a filtragem e a análise de grandes volumes de entradas de logs.

Em segundo lugar, você pode controlar a granularidade dos logs de funções do Lambda sem fazer nenhuma alteração no código, permitindo depuração e solução de problemas mais eficazes.

Em terceiro lugar, você também pode definir para qual grupo de logs do Amazon CloudWatch o Lambda envia os logs, facilitando a agregação e o gerenciamento em grande escala.

Visão geral

Ser capaz de identificar e filtrar mensagens de log relevantes é essencial para solucionar e corrigir problemas críticos. Para ajudar desenvolvedores e operadores a monitorar e solucionar falhas, o serviço Lambda captura e envia automaticamente os logs para o CloudWatch Logs.

Anteriormente, o Lambda emitia logs em formato de texto simples, também conhecido como formato de log não estruturado. Esse formato não estruturado pode tornar os registros difíceis de consultar ou filtrar. Por exemplo, você precisava pesquisar e correlacionar os logs manualmente usando identificadores de string conhecidos, como “START”, “END”, “REPORT” ou o id da solicitação da invocação da função. Sem uma forma nativa de enriquecer os logs de aplicação, você precisava de um trabalho personalizado para extrair dados dos logs para análise automatizada ou para criar painéis de análise.

Anteriormente, os operadores não podiam controlar o nível de detalhes dos logs gerados pelas funções. Eles confiavam nas equipes de desenvolvimento de aplicações para fazer alterações no código para emitir logs com o nível de granularidade necessário, como INFO, DEBUG ou ERROR.

As aplicações baseadas em Lambda geralmente incluem microsserviços, em que um único microsserviço é composto por várias funções Lambda de propósito único. Antes desse lançamento, o Lambda enviava logs para um grupo de logs padrão do CloudWatch, criado com a função Lambda sem a opção de selecionar um grupo de logs específico. Agora você pode agregar logs de várias funções em um só lugar para poder aplicar uniformemente políticas de segurança, governança e retenção aos seus registros.

Capturando logs do Lambda em formato estruturado JSON

O Lambda agora oferece suporte nativo à captura de logs estruturados no formato JSON como uma série de pares de valores-chave, facilitando a pesquisa e a filtragem de logs com mais facilidade.

O JSON também permite que você adicione tags personalizadas e informações contextuais aos logs, permitindo a análise automatizada de grandes volumes de logs para ajudar a entender o desempenho da função. O formato segue o Modelo de Dados de Registros OpenTelemetry (OTel), um popular padrão de logging de código aberto, permitindo que você use ferramentas de código aberto para monitorar funções.

Para definir o formato do log no console Lambda, selecione a aba Configuração, escolha Ferramentas de monitoramento e operações no painel esquerdo e altere a propriedade do Formato do log:

Atualmente, o Lambda oferece suporte nativo à captura de logs de aplicações (logs gerados pelo código da função) e logs do sistema (logs gerados pelo serviço Lambda) no formato estruturado JSON.

Isso é para funções que usam versões não obsoletas de runtimes gerenciadas do Lambda para Python, Node.js e Java, ao usar os métodos de logging recomendados para Lambda, como usar a biblioteca de logging para Python, objeto de console para Node.js e LambdaLogger ou Log4j para Java.

Para outras runtimes gerenciadas, o Lambda atualmente só oferece suporte à captura de logs do sistema no formato estruturado JSON. No entanto, você ainda pode capturar logs de aplicações no formato estruturado JSON para essas runtimes configurando manualmente as bibliotecas de logging. Consulte a seção Configuração de controles avançados de registro no Lambda Developer Guide para saber mais. Você também pode usar o Powertools for AWS Lambda para capturar logs no formato estruturado JSON.

Alterar o formato dos logs de texto para JSON pode ser uma alteração significativa se você analisa logs em um pipeline de telemetria. A AWS recomenda testar qualquer pipeline de telemetria existente depois de mudar o formato de log para JSON.

Trabalhando com o formato estruturado JSON para funções Lambda em Node.js

Você pode usar o formato estruturado JSON com o CloudWatch Embedded Metric Format (EMF) para incorporar métricas personalizadas junto com mensagens de log estruturadas em JSON, e o CloudWatch extrai automaticamente as métricas personalizadas para visualização e alarme. No entanto, para usar o formato de log JSON junto com as bibliotecas EMF para funções em Node.js do Lambda, você precisa usar a versão mais recente da biblioteca EMF client para Node.js ou a versão mais recente da biblioteca Powertools for AWS Lambda (TypeScript).

Configurando a granularidade em nível de log para a função Lambda

Agora você pode filtrar logs do Lambda por nível de log, como ERROR, DEBUG ou INFO, sem alterações no código. A filtragem simplificada em nível de log permite que você escolha o nível de granularidade de log necessário para as funções do Lambda, sem vasculhar grandes volumes de registros para depurar erros.

Você pode especificar filtros de nível de log separados por logs de aplicação (que são logs gerados pelo código da função) e logs do sistema (que são logs gerados pelo serviço Lambda, como mensagens de log START e REPORT). Observe que os controles em nível de log só estão disponíveis se o formato de log da função estiver definido como JSON.

O console do Lambda permite definir as propriedades do nível de logs de aplicação e do nível de logs do sistema:

Você pode definir o nível de granularidade de cada evento de log no código de sua função. O comando a seguir imprime o input do evento da função, emitida como uma mensagem de registro DEBUG:

console.debug (event);

Depois de configurados, os eventos de log emitidos com um nível de log inferior ao selecionado não são publicados no stream de log do CloudWatch da função. Por exemplo, definir o nível de log da função como INFO faz com que os eventos de log DEBUG sejam ignorados.

Esse recurso permite que você escolha a quantidade apropriada de logs emitidos pelas funções. Por exemplo, você pode definir um nível de log mais alto para melhorar a relação sinal/ruído nos logs de produção ou definir um nível de log mais baixo para capturar eventos de logs detalhados para fins de teste ou solução de problemas.

Personalizando o grupo de logs de funções Lambda no CloudWatch

Anteriormente, não era possível especificar um grupo de logs personalizado do CloudWatch para funções, portanto, não era possível transmitir logs de várias funções para um grupo de logs compartilhado. Além disso, para definir uma política de retenção personalizada para vários grupos de logs, era preciso criar cada grupo de logs separadamente usando um nome predefinido (por exemplo, /aws/lambda/<function name>).

Agora você pode selecionar um grupo de logs personalizado do CloudWatch para agregar automaticamente logs de várias funções dentro de uma aplicação em um só lugar. Você pode aplicar políticas de segurança, governança e retenção a nível de aplicação, em vez de individualmente em cada função.

Para distinguir entre logs de diferentes funções em um grupo de logs compartilhado, cada fluxo de logs contém o nome e a versão da função Lambda.

Você pode compartilhar o mesmo grupo de logs entre várias funções para agregar logs. A política de IAM da função deve incluir as permissões logs:createLogstream e logs:putLogEvents para que o Lambda crie logs no grupo de logs especificado. O serviço Lambda pode, opcionalmente, criar essas permissões quando você configura funções no console do Lambda.

Você pode definir o grupo de logs personalizado no console do Lambda inserindo o nome do grupo de logs de destino. Se o grupo de logs inserido não existir, o Lambda o cria automaticamente.

Os controles avançados de logging do Lambda podem ser configurados usando a API do Lambda, o AWS Management Console, a Command Line Interface (CLI) da AWS e ferramentas de infraestrutura como código (IaC), como o AWS Serverless Application Model (AWS SAM) e o AWS CloudFormation.

Exemplo de controles de logging avançados do Lambda

Esta seção demonstra como usar os novos controles avançados de registro em log do Lambda usando o AWS SAM para criar e implantar os recursos em sua conta da AWS.

Visão geral

O diagrama a seguir mostra as funções do Lambda processando objetos recém-criados dentro de um bucket do Amazon S3, onde ambas as funções emitem logs no mesmo grupo de logs do CloudWatch:

A arquitetura inclui as seguintes etapas:

  1. Um novo objeto é criado dentro de um bucket do S3.
  2. O S3 publica um evento usando S3 Event Notifications para o Amazon EventBridge.
  3. O EventBridge aciona duas funções do Lambda de forma assíncrona.
  4. Cada função processa o objeto para extrair rótulos e texto usando o Amazon Rekognition e o Amazon Textract.
  5. Ambas as funções então emitem logs no mesmo grupo de logs do CloudWatch.

O AWS SAM é usado para definir as funções do Lambda e configurar os controles de logging necessários. A política do IAM permite que a função crie um fluxo de logs e emita logs para o grupo de logs selecionado:

DetectLabelsFunction:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: detect-labels/
      Handler: app.lambdaHandler
      Runtime: nodejs18.x
      Policies:
        ...
        - Version: 2012-10-17
          Statement:
            - Sid: CloudWatchLogGroup
              Action: 
                - logs:CreateLogStream
                - logs:PutLogEvents
              Resource: !GetAtt CloudWatchLogGroup.Arn
              Effect: Allow
      LoggingConfig:
        LogFormat: JSON 
        ApplicationLogLevel: DEBUG 
        SystemLogLevel: INFO 
        LogGroup: !Ref CloudWatchLogGroup 

Implantando o exemplo

Para implantar esse exemplo:

  1. Clone o repositório do GitHub e explore a aplicação.
    git clone https://github.com/aws-samples/advanced-logging-controls-lambda/ 
    cd advanced-logging-controls-lambda
  2. Use o AWS SAM para criar e implantar os recursos na sua conta da AWS. Isso compila e cria a aplicação usando npm e, em seguida, preenche o template necessário para implantar os recursos:
    sam build
  3. Faça do deploy da solução em sua conta da AWS com um deploy guiado, usando o fluxo interativo da CLI do AWS SAM:
    sam deploy --guided
  4. Insira os seguintes valores:
    • Stack Name: advanced-logging-controls-lambda
    • Region: a Região de sua preferência (por exemplo, us-east-1)
    • Parameter UploadsBucketName: digite um nome único para seu bucket.
    • Aceite o restante dos valores padrões iniciais.
  5. Para testar a aplicação, use o AWS CLI para copiar a imagem de amostra no bucket do S3 que você criou.
    aws s3 cp samples/skateboard.jpg s3://example-s3-images-bucket

Explore o CloudWatch Logs para visualizar os logs emitidos no grupo de logs criado, AggregatedLabelsLogGroup:

A função do Lambda DetectLabels emite eventos de log DEBUG no formato JSON para o fluxo de log. Eventos de log com o mesmo nível de log da função ExtractText Lambda são omitidos. Isso é resultado das diferentes configurações de nível de log da aplicação para cada função (DEBUG e INFO).

Você também pode usar o CloudWatch Logs Insights para pesquisar, filtrar e analisar os logs no formato JSON usando este exemplo de consulta:

Você pode ver os resultados:

Conclusão

Os controles avançados de logging para o Lambda oferecem maior controle sobre logging. Use controles de logging avançados para controlar o nível e o formato dos logs da sua função Lambda, permitindo pesquisar, consultar e filtrar logs para solucionar problemas com mais eficiência.

Você também pode escolher o grupo de logs do CloudWatch para o qual o Lambda envia seus logs. Isso permite agregar logs de várias funções em um único grupo de logs, aplicar políticas de retenção, segurança e governança e gerenciar facilmente os logs em grande escala.

Para começar, especifique as configurações necessárias em Logging Configurations para qualquer função nova ou existente do Lambda.

Os controles avançados de logging para o Lambda estão disponíveis em todas as regiões da AWS onde o Lambda está disponível sem custo adicional. Saiba mais sobre os controles de logs avançados do AWS Lambda.

Para obter mais recursos de aprendizado sem servidor, visite Serverless Land.

Este blog em português é uma tradução do blog original em inglês (link aqui).

Biografia dos autores

 Nati Goldberg é arquiteto sênior de soluções
 Shridhar Pandey é gerente sênior de produtos do AWS Lambda

Biografia da tradutora

Bianca Mota é arquiteta de soluções para o segmento de startups e iniciou sua jornada na AWS em 2019 ajudando clientes em suas jornadas na nuvem. Além disso, Bianca é parte da comunidade Serverless na AWS e já apresentou sobre o assunto em diversos eventos, como o AWS Summit São Paulo e o AWS re:Invent.