Blog de Amazon Web Services (AWS)

Presentando los controles de registro avanzados para las funciones de AWS Lambda

Esta publicación está escrita por Nati Goldberg, arquitecta sénior de soluciones, y Shridhar Pandey, gerente sénior de productos de AWS Lambda

Hoy AWS lanza controles de registro avanzados para AWS Lambda, que ofrecen a los desarrolladores y operadores un mayor control sobre la forma en que se capturan, procesan y consumen los registros de funciones.

Este lanzamiento presenta tres nuevas capacidades para proporcionar una experiencia de registro predeterminada simplificada y mejorada en Lambda.

En primer lugar, puede capturar los registros de funciones de Lambda en formato estructurado JSON sin tener que usar sus propias bibliotecas de registro. Los registros estructurados de JSON facilitan la búsqueda, el filtrado y el análisis de grandes volúmenes de entradas de registro.

En segundo lugar, puede controlar la granularidad a nivel de registro de los registros de funciones de Lambda sin realizar cambios en el código, lo que permite depurar y solucionar problemas de forma más eficaz.

En tercer lugar, también puede establecer el grupo de registros de Amazon CloudWatch al que envía Lambda los registros, lo que facilita la agregación y la administración de los registros a escala.

Descripción general

Ser capaz de identificar y filtrar los mensajes de registro relevantes es esencial para solucionar y solucionar problemas críticos. Para ayudar a los desarrolladores y operadores a supervisar y solucionar los errores, el servicio de Lambda captura y envía automáticamente los registros a CloudWatch Logs.

Anteriormente Lambda emitía los registros en formato de texto sin formato, también conocido como formato de registro no estructurado. Este formato no estructurado podía dificultar la consulta o el filtrado de los registros. Por ejemplo, usted tenía que buscar y correlacionar los registros manualmente utilizando identificadores de cadena conocidos, como «START», «END», «REPORT» o el identificador de solicitud de la invocación de la función. Al no disponer de una forma nativa de enriquecer los registros de las aplicaciones, se necesitaba un trabajo personalizado para extraer los datos de los registros para su análisis automatizado o para crear paneles de análisis.

Anteriormente los operadores no podían controlar el nivel de detalle del registro generado por las funciones. Confiaban en los equipos de desarrollo de aplicaciones para realizar cambios en el código y emitir registros con el nivel de granularidad requerido, como INFO, DEBUG o ERROR.

Las aplicaciones basadas en Lambda suelen estar compuestas por microservicios, en los que un único microservicio está compuesto por varias funciones de Lambda de un solo propósito. Antes de este lanzamiento, Lambda enviaba los registros a un grupo de registros predeterminado de CloudWatch creado con la función Lambda sin la opción de seleccionar un grupo de registros. Ahora puede agregar registros de varias funciones en un solo lugar para aplicar políticas de seguridad, gobierno y retención a sus registros de manera uniforme.

Capturar registros de Lambda en formato estructurado JSON

Lambda ahora admite de forma nativa la captura de registros estructurados en formato JSON como una serie de pares clave-valor, lo que facilita la búsqueda y el filtrado de los registros.

JSON también permite añadir etiquetas personalizadas e información contextual a los registros, lo que permite el análisis automatizado de grandes volúmenes de registros para ayudar a comprender el rendimiento de la función. El formato sigue el modelo de datos de registros de OpenTelemetry (Otel), un popular estándar de registro de código abierto, que permite utilizar herramientas de código abierto para supervisar las funciones.

Para configurar el formato de registro en la consola de Lambda, seleccione la pestaña Configuración, elija Herramientas de supervisión y operaciones en el panel izquierdo y, a continuación, cambie la propiedad del formato de registro:

Actualmente, Lambda admite de forma nativa la captura de registros de aplicaciones (registros generados por el código de la función) y registros del sistema (registros generados por el servicio de Lambda) en formato estructurado JSON.

Esto se aplica a las funciones que utilizan versiones no obsoletas de los entornos de ejecución gestionados por Lambda de Python, Node.js y Java. Si utilizan los métodos de registro recomendados por Lambda, como la biblioteca de registro para Python, el objeto de consola para Node.js y LambdaLogger o Log4j para Java.

Para otros entornos de ejecución gestionados, Lambda actualmente solo admite la captura de registros del sistema en formato estructurado JSON. Sin embargo, puede seguir capturando los registros de las aplicaciones en formato estructurado JSON para estos entornos de ejecución configurando manualmente las bibliotecas de registro. Consulte la sección sobre configuración de controles de registro avanzados en la Guía para desarrolladores de Lambda para obtener más información. También puede usar Powertools para AWS Lambda para capturar registros en formato estructurado JSON.

Cambiar el formato de registro de texto a JSON puede suponer un cambio radical si se analizan los registros en una canalización de telemetría. AWS recomienda probar cualquier canalización de telemetría existente después de cambiar el formato de registro a JSON.

Trabajar con el formato estructurado JSON para las funciones Lambda de Node.js

Puede utilizar el formato estructurado JSON con el formato de métricas integradas (EMF) de CloudWatch para integrar métricas personalizadas en los mensajes de registro estructurados de JSON, y CloudWatch extrae automáticamente las métricas personalizadas para visualizarlas y generar alarmas. Sin embargo, para usar el formato de registro JSON junto con las bibliotecas EMF para las funciones Lambda de Node.js, debe usar la última versión de la biblioteca cliente de EMF para Node.js o la última versión de la biblioteca Powertools para AWS Lambda (TypeScript).

Configuración de la granularidad a nivel de registro para la función Lambda

Ahora puede filtrar los registros de Lambda por nivel de registro, como ERROR, DEBUG o INFO, sin cambiar el código. El filtrado simplificado a nivel de registro le permite elegir el nivel de granularidad de registro necesario para las funciones de Lambda, sin tener que filtrar grandes volúmenes de registros para depurar errores.

Puede especificar filtros de nivel de registro independientes para los registros de las aplicaciones (que son los registros generados por el código de la función) y los registros del sistema (que son los registros generados por el servicio Lambda, como los mensajes de registro START y REPORT). Tenga en cuenta que los controles a nivel de registro solo están disponibles si el formato de registro de la función está configurado en JSON.

La consola de Lambda permite configurar las propiedades del nivel de registro de la aplicación y del nivel de registro del sistema:

Puede definir el nivel de granularidad de cada evento de registro en su código de función. La siguiente sentencia imprime la entrada de eventos de la función, que se emite como un mensaje de registro DEBUG:

console.debug(event);

Una vez configurados, los eventos de registro emitidos con un nivel de registro inferior al seleccionado no se publican en el flujo de registro de CloudWatch de la función. Por ejemplo, si se establece el nivel de registro de la función en INFO, se ignoran los eventos del registro DEBUG.

Esta capacidad le permite elegir la cantidad adecuada de registros emitidos por las funciones. Por ejemplo, puede establecer un nivel de registro más alto para mejorar la relación señal/ruido en los registros de producción, o establecer un nivel de registro más bajo para capturar eventos de registro detallados con fines de prueba o solución de problemas.

Personalización del grupo de registros de CloudWatch de la función Lambda

Anteriormente, no se podía especificar un grupo de registros de CloudWatch personalizado para las funciones, por lo que no se podían transmitir los registros de varias funciones a un grupo de registros compartido. Además, para establecer una política de retención personalizada para varios grupos de registros, tenía que crear cada grupo de registros por separado con un nombre predefinido (por ejemplo,  /aws/lambda/<function name>).

Ahora puede seleccionar un grupo de registros de CloudWatch personalizado para agregar automáticamente los registros de varias funciones dentro de una aplicación en un solo lugar. Puede aplicar políticas de seguridad, gobernanza y retención a nivel de aplicación, en lugar de aplicarlas individualmente a cada función.

Para distinguir los registros de las distintas funciones de un grupo de registros compartido, cada flujo de registros contiene el nombre y la versión de la función de Lambda.

Puede compartir el mismo grupo de registros entre varias funciones para agregar registros. La política de IAM de la función debe incluir los permisos logs:CreateLogStream y logs:PutLogEventspara que Lambda pueda crear registros en el grupo de registros especificado. El servicio Lambda puede crear estos permisos de forma opcional al configurar las funciones en la consola de Lambda.

Puede configurar el grupo de registros personalizado en la consola de Lambda introduciendo el nombre del grupo de registros de destino. Si el grupo de registros introducido no existe, Lambda lo crea automáticamente.

Los controles de registro avanzados para Lambda se pueden configurar mediante la API de Lambda, la consola de administración de AWS, la interfaz de línea de comandos (CLI) de AWS y herramientas de infraestructura como código (IaC), como AWS Serverless Application Model (AWS SAM) y AWS CloudFormation.

Ejemplo de controles de registro avanzados de Lambda

En esta sección se demuestra cómo utilizar los nuevos controles de registro avanzados para Lambda mediante AWS SAM para crear e implementar los recursos en su cuenta de AWS.

Descripción general

El siguiente diagrama muestra las funciones de Lambda que procesan los objetos recién creados dentro de un bucket de Amazon S3, donde ambas funciones emiten registros en el mismo grupo de registros de CloudWatch:

La arquitectura incluye los siguientes pasos:

  1. Se crea un objeto nuevo dentro de un bucket de S3.
  2. S3 publica un evento mediante las notificaciones de eventos de S3 en Amazon EventBridge.
  3. EventBridge activa dos funciones de Lambda de forma asíncrona.
  4. Cada función procesa el objeto para extraer etiquetas y texto mediante Amazon Rekognition y Amazon Textract.
  5. A continuación, ambas funciones emiten registros en el mismo grupo de registros de CloudWatch.

Utiliza AWS SAM para definir las funciones de Lambda y configurar los controles de registro necesarios. La política de IAM permite a la función crear un flujo de registros y emitir registros al grupo de registros seleccionado:

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 

Deploying the example

Implementación del ejemplo

Para implementar el ejemplo:

1. Clona el repositorio de GitHub y explora la aplicación.

git clone https://github.com/aws-samples/advanced-logging-controls-lambda/

cd advanced-logging-controls-lambda

2. Utilice AWS SAM para crear e implementar los recursos en su cuenta de AWS. Esto compila y crea la aplicación mediante npm y, a continuación, rellena la plantilla necesaria para implementar los recursos:

sam build

3. Implemente la solución en su cuenta de AWS mediante una implementación guiada, mediante el flujo interactivo de la CLI de AWS SAM

sam deploy --guided
4. Introduzca los siguientes valores:
    • Nombre de la pila: advanced-logging-controls-lambda
    • Región: tu región preferida (por ejemplo us-east-1)
    • Parámetro UploadsBucketName: introduce un nombre de bucket único.
    • Acepte el resto de los valores predeterminados iniciales.

5. Para probar la aplicación, utilice la CLI de AWS para copiar la imagen de muestra en el bucket de S3 que creó.

aws s3 cp samples/skateboard.jpg s3://example-s3-images-bucket

Explore CloudWatch Logs para ver los registros emitidos en el grupo de registros creado, AggregatedLabelsLogGroup:

La función Lambda DetectLabels emite eventos de registro DEBUG en formato JSON al flujo de registro. Se omiten los eventos de registro con el mismo nivel de registro de la función ExtractText Lambda. Esto se debe a los diferentes ajustes de nivel de registro de la aplicación para cada función (DEBUG y INFO).

También puede usar CloudWatch Logs Insights para buscar, filtrar y analizar los registros en formato JSON mediante esta consulta de ejemplo:

Puede ver los resultados:

Conclusión

Los controles de registro avanzados para Lambda le proporcionan un mayor control sobre el registro. Utilice controles de registro avanzados para controlar el nivel y el formato de registro de la función de Lambda, lo que le permitirá buscar, consultar y filtrar los registros para solucionar problemas de forma más eficaz.

También puede elegir el grupo de registros de CloudWatch al que Lambda envía los registros. Esto le permite agregar registros de varias funciones en un solo grupo de registros, aplicar retenciones, seguridad, políticas de gobernanza y administrar fácilmente los registros a escala.

Para empezar, especifique los ajustes necesarios en la configuración de registro para cualquier función de Lambda nueva o existente.

Los controles de registro avanzados para Lambda están disponibles en todas las regiones de AWS en las que Lambda esté disponible sin coste adicional. Obtenga más información sobre los controles de registro avanzados de AWS Lambda.

Para obtener más recursos de aprendizaje sobre sistemas sin servidor, visite Serverless Land

Este blog en español es una traducción de la publicación original del blog en inglés (Enlace aquí).
Traductor: Diego Casas | Senior Solutions Architect en AWS – Bogotá, Colombia