Cómo implementar la agregación de registros para AWS Lambda

Envíe los registros para sus funciones de Lambda a un servicio de agregación de registros como Logz.io

Durante la ejecución de una función Lambda, lo que escriba en stdout (por ejemplo, usando console.log en Node.js) será capturado por Lambda y enviado a CloudWatch Logs de forma asíncrona en segundo plano. Y lo hace sin agregar ninguna sobrecarga al tiempo de ejecución de su función.

Puede encontrar todos los registros para sus funciones de Lambda en CloudWatch Logs. Hay un grupo de registro único para cada función. Cada grupo de registro consta de muchas secuencias de registro, una para cada instancia de la función que se ejecuta simultáneamente.

Puede enviar registros a CloudWatch Logs usted mismo a través de la operación PutLogEvents. O puede enviarlos a su servicio de agregación de registros preferido, como Splunk o Elasticsearch.

Pero recuerde que todo debe hacerse durante la invocación de una función. Si realiza llamadas de red adicionales durante la invocación, pagará ese tiempo de ejecución adicional. Sus usuarios también tendrían que esperar más para que la API responda.

Estas llamadas de red adicionales solo pueden agregar 10–20 ms por invocación. Pero tiene microservicios, y una sola acción del usuario puede involucrar varias llamadas a la API. Esos 10-20ms por llamada API pueden aumentar y agregar más de 100ms a su latencia de cara al usuario, lo cual es suficiente para reducir las ventas en un 1% según Amazon.

¡Entonces, no hagas eso!

En su lugar, procese los registros de CloudWatch Logs después del hecho.

En la consola de CloudWatch Logs, puede seleccionar un grupo de registro y elegir transmitir los datos directamente al servicio Elasticsearch alojado en Amazon.

Esto es muy útil si ya está utilizando el servicio alojado Elasticsearch. Pero si aún está evaluando sus opciones, lea esta publicación antes de decidirse por Elasticsearch alojado en AWS.

También puede transmitir los registros a una función Lambda en su lugar. Incluso hay una serie de planos de la función Lambda para enviar CloudWatch Logs a otros servicios de agregación de registros.

Claramente, esto es algo que muchos clientes de AWS han pedido.

Puede encontrar planos para enviar CloudWatch Logs a Sumologic, Splunk y Loggly de forma inmediata.

Puede usar estos planos para ayudarlo a escribir una función Lambda que envíe CloudWatch Logs a su servicio de agregación de registros preferido. Pero aquí hay algunas cosas más a tener en cuenta.

Cada vez que cree una nueva función Lambda, creará un nuevo grupo de registro en los registros de CloudWatch. Desea evitar un proceso manual para suscribir grupos de registros a su función de envío de registros.

En su lugar, habilite CloudTrail y luego configure un patrón de evento en CloudWatch Events para invocar otra función Lambda cada vez que se cree un grupo de registro.

Puede hacer esta configuración única en la consola de CloudWatch.

Haga coincidir la llamada a la API CreateLogGroup en CloudWatch Logs y active una función Lambda subscribe-log-group. Esta función suscribiría el nuevo grupo de registro a la función de envío de registros.

Si está trabajando con varias cuentas de AWS, debe evitar que la configuración sea un proceso manual. Con el marco Serverless, puede configurar el origen del evento para esta función subscribe-log-group en serverless.yml.

Otra cosa a tener en cuenta es que debe evitar suscribirse al grupo de registro para la función de registros de envío. Creará un ciclo de invocación infinito y esa es una lección dolorosa que debes evitar.

Una cosa más.

De forma predeterminada, cuando Lambda crea un nuevo grupo de registro para su función, la política de retención se establece en Nunca caduca. Esto es excesivo, ya que el costo de almacenamiento de datos puede aumentar con el tiempo. ¡También es innecesario si ya está enviando los registros a otro lugar!

De manera predeterminada, los registros de sus funciones de Lambda se mantienen en CloudWatch Logs para siempre.

Podemos aplicar la misma técnica anterior y agregar otra función de Lambda para actualizar automáticamente la política de retención a algo más razonable.

Aquí hay una función Lambda para actualizar automáticamente la política de retención de registros a 30 días.

Si ya tiene muchos grupos de registro existentes, considere escribir scripts únicos para actualizarlos a todos. Puede hacerlo recurriendo a todos los grupos de registro con la llamada a la API DescribeLogGroups.

Si está interesado en aplicar estas técnicas usted mismo, he preparado un proyecto de demostración simple para usted. Si sigue las instrucciones en el archivo README e implementa las funciones, todos los registros de sus funciones Lambda se enviarán a Logz.io.