Índice de contenidos
- Introducción
- Entorno
- Creación Lambda AWS y Configuración con CloudWatch Logs
- Consultas con CloudWatch Logs Insights
- Precios
- Recursos
Introducción
Amazon CloudWatch provee un conjunto de herramientas para monitorizar recursos en la nube. Dentro de ellas, destaca CloudWatch Logs, dedicada al almacenamiento y visualización de logs. A través de este instrumento los logs de un recurso se almacenan por defecto de forma indefinida ordenados por fecha y hora, pudiendo consultarlos y ordenarlos en función de otro parámetros.
Dependiendo del recurso de AWS que se esté utilizando, la configuración de CloudWatch Logs en el mismo será de una manera u otra. En este tutorial vamos a centrarnos en cómo enviar los logs de una función Lambda desarrollada en Java a CloudWatch, ver esos logs desde AWS y analizarlos mediante CloudWatch Insights, que es la herramienta proporcionada por AWS para realizar consultas sobre los logs. Finalmente, se expondrá un análisis de precios para ver hasta qué punto podemos exprimir la capa gratuita y cuánto coste supondrían las tarifas de pago.
Entorno
Este tutorial está escrito usando el siguiente entorno:
- Hardware: MacBook Pro 15’ (2,5 GHz Intel Core i7, 16GB DDR3)
- Sistema operativo: macOS Catalina 10.15
- AWS CLI versión
- AWS Lambda
- Amazon S3
- Terraform versión 0.13.5
Creación Lambda AWS y Configuración con CloudWatch Logs
Para la realización de este tutorial utilizaremos como base el tutorial Crear con Terraform una Lambda llamada por S3, en el cual se crea una función Lambda AWS encargada de comprimir una imagen y subirla a una carpeta en un bucket S3. En dicho tutorial ya se añade un recurso en Terraform para ver los logs de la Lambda en CloudWatch, pero vamos a profundizar más en esto y crear nuestro propio recurso con nuestra propia configuración. La parte final del archivo Lambda_config.tf, donde se indica el recurso de CloudWatch, quedaría de la siguiente manera:
resource "aws_cloudwatch_log_group" "lambda_log_group" { name = "/aws/lambda/${aws_lambda_function.image_resizer_lambda.function_name}" } resource "aws_iam_policy" "lambda_logging" { name = "lambda_logging" path = "/" description = "IAM policy for logging from a lambda" policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*", "Effect": "Allow" } ] } EOF } resource "aws_iam_role_policy_attachment" "lambda_logs" { role = aws_iam_role.role_for_lambda.name policy_arn = aws_iam_policy.lambda_logging.arn }
Con esto ya tendríamos creado el recurso de CloudWatch Logs. Ahora, el siguiente paso es enlazar los logs incluidos en el código de la función Lambda a través de Log4j2 con CloudWatch. Para ello podemos seguir distintas estrategias, decantándonos finalmente por incluir el módulo aws-lambda-java-log4j2, el cual posibilita la gestión de logs con Log4j2 en CloudWatch. Incluimos las dependencias necesarias en el pom.xml de nuestro proyecto Java y creamos el archivo de configuración log4j2.xml, que va a especificar la estructura de los logs que se envían a CloudWatch.
<Configuration status="WARN"> <Appenders> <Lambda name="Lambda"> <PatternLayout> <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n</pattern> </PatternLayout> </Lambda> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="Lambda"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> </Loggers> </Configuration
La etiqueta <PatternLayout> especifica la estructura del mensaje que se muestra en el log. En nuestro caso, vamos a indicar la fecha y hora del evento seguido del identificador de la petición AWS. Como <Appender> indicamos Lambda ya que va a ser el objeto responsable de imprimir los logs.
Tras esto, compilamos el proyecto Java y ejecutamos:
terraform apply
Una vez se han creado todos los recursos bien, para poder ver los logs de la Lambda previamente ha de ser ejecutada, subiendo una imagen a la carpeta original-images del bucket S3. En el panel de CloudWatch, si vamos a Registros > Grupos de Registros, podemos ver el grupo de registro en el que se incluyen los logs de la Lambda.
Finalmente, vemos el contenido de los logs. Todos los mensajes que contienen “INFO Handler” son los incluidos en el código Java mediante Log4j2.
Consultas con CloudWatch Logs Insights
Una vez que se tiene acceso a los logs de los recursos de AWS, también es muy importante poder filtrar la información que contienen. Si nos encontramos en un escenario con un montón de logs que provienen de distintos recursos, debemos poder buscar exactamente la información que queremos. Por ello existe la herramienta CloudWatch Logs Insights.
CloudWatch Logs Insights permite buscar y analizar de forma interactiva los datos de logs en Amazon CloudWatch Logs. Las consultas se hacen mediante queries, disponiendo de su propio lenguaje de consultas. Expiran después de 15 minutos si no se han completado y los resultados de las mismas están disponibles durante 7 días. Se pueden guardar las consultas creadas.
CloudWatch Logs Insights es compatible con todo tipo de registros. Para cada evento del log enviado a CloudWatch Logs, se generan automáticamente cinco campos del sistema. Por ejemplo, queremos filtrar el mensaje por región AWS y nos encontramos que nuestro log ha almacenado mensajes con el siguiente cuerpo:
Para obtener los resultados esperados, debemos escoger el campo @message y filtrar según los campos que tenga el JSON. Escribimos la siguiente consulta:
fields @message | filter records.0.awsRegion=”eu-west-1”
Y obtenemos los mensajes cuyo evento del bucket S3 se ha lanzado desde la región de AWS eu-west-1.
Precios
CloudWatchLogs ofrece servicio gratuito hasta la utilización de 5GB de datos. No sólo cuentan los datos incorporados y almacenados, si no también los datos resultantes de las consultas de CloudWatch Insight.
Una vez que nos salimos de la capa gratuita, estas son las tarifas:
Si ya hablamos específicamente de CloudWatch Logs Insights, los precios son por consulta y los cargos se basan en la cantidad de datos de registros ingresados escaneados por la misma.
Un detalle a tener en cuenta si hablamos de precio es la creación de alarmas. No podemos crear una alerta que nos avise como tal de que “nuestro plan gratuito ha finalizado”, pero podemos tener un control de la cantidad de logs almacenados por si algún valor se escapa de lo habitual. En “Alarmas”, seleccionamos la métrica “Incoming Bytes” de nuestro grupo de recursos y le indicamos la configuración de la alarma. En nuestro caso, la alarma se activará cuando los bytes recibidos superen 5GB. Podemos seleccionar el medio por el que queremos que nos llegue la notificación de que la alarma se ha activado (e-mail, notificación AWS…).
En el plan gratuito se pueden configurar hasta 10 alarmas para métricas que no sean de alta resolución. Una alarma vigila una métrica durante un período específico de tiempo: si el período es menor que 60 segundos, hablamos de métricas de alta resolución.
Recursos
- Configuración Log4j2: https://logging.apache.org/log4j/2.x/manual/configuration.html
- Precios CloudWatch: https://aws.amazon.com/es/cloudwatch/pricing/
Buenos días, quisiera saber una vez que extraemos la información util de los logs, que herramientas nos permiten exportar dichos datos a una BD para ser consultada por un Power BI por ejemplo.
Muchas gracias!