Blog de Amazon Web Services (AWS)

Envío de registros estándar de CloudFront a CloudWatch Logs para su análisis

Amazon CloudFront es un servicio de red de distribución de contenido (CDN) rápido que entrega de forma segura datos, vídeos, aplicaciones y API a clientes de todo el mundo con baja latencia y altas velocidades de transferencia, todo ello en un entorno fácil de usar para los desarrolladores.

Los Registros estándar de CloudFront  (también conocidos como registros de acceso) le dan visibilidad de las solicitudes que se realizan a una distribución de CloudFront. Estos  registros se pueden analizar para una variedad de casos de uso, como determinar qué objetos son los más solicitados o qué ubicaciones de borde (edge) reciben la mayor cantidad de tráfico. También puede utilizar los registros para solucionar errores u obtener información sobre el rendimiento.

Puede obtener esta información utilizando estas características de Amazon CloudWatch Logs:

En esta publicación del blog, mostraré cómo puede enviar los logs de acceso de CloudFront a Amazon CloudWatch Logs. También hablaré de las herramientas que puede utilizar con CloudWatch Logs para generar información significativa y crear paneles de control a partir de los logs de CloudFront.

Descripción General

Muchos servicios de AWS escriben registros en CloudWatch Logs de forma nativa, mientras que otros escriben en Amazon Simple Storage Service (Amazon S3) o en ambos, CloudWatch Logs y Amazon S3. Para obtener una lista de servicios, consulte Servicios de AWS que publican registros en CloudWatch Logs en la Guía del usuario de Amazon CloudWatch Logs

En el caso de un servicio que solo publica sus logs en S3, una práctica común es utilizar una función de AWS Lambda que se activa por una notificación de evento de Amazon S3 para escribir los logs en sus grupos de logs de CloudWatch. En este post, te guiaré a través de este proceso y  mostraé algunos ejemplos de filtros de métricas, reglas de Contributor Insights y consultas de CloudWatch Logs Insights. Combinaré estos datos con las métricas de CloudWatch emitidas desde CloudFront para elaborar un panel de control operativo de CloudWatch para una distribución de CloudFront determinada.

Nota: En los casos en los que hay una alta frecuencia de eventos de escritura en S3, es posible que desee enviar las notificaciones de eventos de S3 a una cola de Amazon Simple Queue Service y, a continuación, hacer que la función Lambda consulte la cola. Con este  enfoque Amazon SQS permite que  con una sola invocación de la función recupere muchos objetos de S3.

Figura 1: Arquitectura para el envío de logs de CloudFront a CloudWatch Logs

Para utilizar la plantilla de CloudFormation en este post, necesita lo siguiente:

Enfoque

Utilizará una plantilla de CloudFormation para implementar los siguientes recursos:

  • Una notificación de eventos de S3 para activar los eventos de creación de nuevos objetos para sus registros de CloudFront.
  • Un grupo de registros de CloudWatch para almacenar sus registros de CloudFront.
  • Un recurso personalizado respaldado por Lambda para configurar la notificación de eventos de S3.
  • Una función de Lambda para escribir los logs de CloudFront en S3 en un grupo de logs de CloudWatch.
  • Varios filtros de métricas para su grupo de registros.
  • Varias reglas de Contributor Insights para su grupo de registros.
  • Una consulta de CloudWatch Logs Insights para el grupo de registros.
  • Un panel de CloudWatch que incluye métricas de servicio, filtros de métricas, informes de reglas de Contributor Insights y resultados de consultas de CloudWatch Logs Insights.

La plantilla de CloudFormation toma los siguientes parámetros:

  • Nombre del bucket de registro de S3

Este es el nombre del bucket de S3 donde se entregan los registros de CloudFront. El bucket de S3 debe estar en la misma región de AWS en la que se está implementando la plantilla de CloudFormation. El paquete para implementación de la función Lambda está alojado en un bucket de S3 en us-east-1. Si el bucket de registro está en una región diferente, deberá alojar el paquete de implementación de la función en un bucket de esa región y editar la plantilla de CloudFormation para que haga referencia a esa ubicación.

  • Prefijo de S3 para los registros de CloudFront

Este es el prefijo en el bucket de S3 donde se están escribiendo los registros de CloudFront. Este parámetro se utiliza para el filtro de notificación de eventos de S3.

  • ID (identificador) de distribución de CloudFront

Este es el ID de distribución de CloudFront. Este parámetro se utiliza para agregar métricas de CloudFront a su panel de control y determinar el nombre del grupo de registros y el espacio de nombres de las métricas para sus filtros de métricas.

  • Estado de la regla de Contributor Insights

Este parámetro se configura para habilitar o deshabilitar las reglas de Contributor Insights en la creación.

Figura 2: Parámetros configurados para la pila de CloudFormation

Si desea utilizar una plantilla de CloudFormation para crear estos recursos, lance la siguiente pila (stack).

Para crear la pila de CloudFormation

  1. Abra la consola de CloudFormation en https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/.
  2. En el panel de navegación, seleccione Pilas.
  3. En Crear pila, seleccione Con nuevos recursos (estándar).
  4. En Especificar plantilla, utilice la siguiente URL de S3: https://mng-blog-solutions.s3.amazonaws.com/cloudfront-to-cloudwatch-blog/CFtoCWLogs.yaml
  5. Introduzca los parámetros de su ID de distribución de CloudFront, el bucket de S3 donde se escriben sus registros de CloudFront y el prefijo de S3 para sus registros y, a continuación, seleccione Siguiente.
  6. Deje todos los demás campos en sus valores predeterminados y, a continuación, seleccione Crear pila.

Analizar los registros de CloudFront en CloudWatch

Después de que sus logs de CloudFront estén en CloudWatch, puede utilizar Contributor Insights, filtros de métricas y consultas de CloudWatch Logs Insights para analizarlos. Cuando se combinan con las métricas de CloudWatch emitidas desde CloudFront, puede crear valiosos paneles para su distribución de CloudFront.

Reglas de Contributor Insights para su grupo de registros

El uso de Contributor Insights con los registros de CloudFront le permite ver las solicitudes realizadas a su distribución desde varias dimensiones. Aquí hay algunos ejemplos de estas reglas, junto con un enlace a las definiciones de reglas con formato JSON en GitHub.

Nombre de la regla Descripción de la regla
CF-Bytes-Out-By-POP Esta regla realiza un seguimiento del número de bytes enviados por cada ubicación de borde de CloudFront. Esto puede ayudarle a ver qué ubicación de borde es responsable de servir la mayor parte del tráfico a lo largo del tiempo.
CF-Cache-Miss-by-URI Esta regla muestra los URIs más solicitados que han dado lugar a una pérdida de caché. La regla se filtra sólo para las solicitudes GET y HEAD, porque las solicitudes PUT, POST y DELETE no pueden dar lugar a un éxito en la caché. Esta regla es útil para identificar objetos que podrían ser buenos candidatos para el almacenamiento en caché.
CF-Edge-Status-by-POP Esta regla muestra el estado de los bordes para cada solicitud por ubicación de borde. Esto puede ser útil para identificar qué ubicaciones de borde están produciendo la mayor cantidad de errores o solicitudes fallidas o acertadas.
CF-Errors-By-POP-and-Path Esta regla muestra los principales contribuyentes de errores por ruta URI y ubicación de borde. Esto puede ser útil para identificar qué URI o ubicación de borde es responsable de una tasa de error superior a la esperada.
CF-Requests-by-HTTP-Method Esta regla muestra el número total de peticiones por el método HTTP utilizado (GET, POST, PUT, OPTIONS, HEAD, DELETE). Esto puede ayudarle a comprender mejor el tipo de peticiones que se están realizando a su distribución. Puede reunir este mismo punto de datos utilizando un filtro de métrica de CloudWatch Logs.
CF-Requests-by-URI Esta regla muestra los URI más solicitados en su distribución de CloudFront a lo largo del tiempo.
CF-Requests-by-URI-and-UserAgent Una modificación de la regla anterior, esta regla rastrea las principales solicitudes por URI y el campo Agente de Usuario. Esta regla puede ayudarle a entender si algunos objetos son más solicitados por diferentes agentes de usuario.
CF-Status-by-POP Esta regla realiza un seguimiento de los códigos de respuesta HTTP por ubicación de borde de CloudFront. Esto puede ayudarle a ver qué ubicaciones de borde están produciendo el mayor número de solicitudes que dan lugar a un error o a un 200 OK.

Filtros de métricas para el grupo de registros

Puede utilizar los filtros de métricas de CloudWatch para extraer métricas significativas de sus registros de CloudFront. En algunos casos se conoce el número de resultados posibles para un campo de registro, como el método HTTP o el código de respuesta HTTP. En estos casos puede crear expresiones de filtros de métricas para recopilar estos datos. Para obtener más información, consulte Sintaxis de filtros y patrones en la Guía del usuario de Amazon CloudWatch Logs.

Formato de filtro de métricas para los logs de CloudFront:

Puede utilizar el siguiente formato para sus logs de CloudFront. Este patrón de filtro identificará todos los campos de registro disponibles. A continuación, puede utilizar un operador numérico o de igualdad para que coincida con un campo de registro determinado.

[CloudWatch Metric Filter Syntax]

 [date, time, x_edge_location, sc_bytes, c_ip, cs_method, Host, cs_uri_stem, sc_status, cs_referer, cs_User_Agent, us_uri_query, Cookie, x_edge_result_type=CapacityExceeded, x_edge_request_id, x_host_header, cs_protocol, cs_bytes, time_taken, x_forwarded_for, ssl_protocol, ssl_cipher, x_edge_response_result_type, cs_protocol_version, fle_status, fle_encrypted_fields, c_port, time_to_first_byte, x_edge_detailed_result_type, sc_content_type, sc_content_len, sc_range_start, sc_range_end ]

Filtros de métrica para colectar el protocolo HTTP:

Cuando un evento de registro coincide con una expresión de filtro, puede decidir tomar un valor del campo de registro y publicarlo como valor de la métrica. En estos ejemplos, utilizo una combinación de bytes out o time taken. Puede utilizar la estadística de recuento de muestras para la métrica para ver cuántas veces un evento coincidió con el patrón. Puede utilizar las estadísticas de suma y media para ver los bytes reales descargados o el tiempo empleado. Por ejemplo, cuando se observan los dos filtros de métricas para solicitudes HTTP y HTTPs uso el campo bytes out. Cuando se utiliza la estadística de suma para ver las métricas HTTP y HTTPs se ve el número total de bytes enviados. Sin embargo, si sólo quiere comparar el número total de solicitudes HTTP y HTTPs puede utilizar la estadística de recuento de muestras.

  • HTTP Requests
  • HTTPS-Requests

Filtros de métrica de latencia:

En estos filtros de métricas, se hace coincidir cada evento de registro en el grupo de registro. Cada filtro produce una métrica diferente a partir de un campo diferente del evento de registro. En este caso estoy rastreando los valores de los campos time to first byte y time taken, respectivamente.

  • Origin Latency (time to first byte)
  • Latency-Filter

Filtros métricos para recoger el tipo de resultado de arista:

Los siguientes filtros métricos le proporcionan una métrica de cada valor potencial del campo de registro x-edge-result-type. Puede recopilar este mismo punto de datos desde una regla de Contributor Insights.

  • Hit-Requests
  • RefreshHit-Requests
  • OriginShieldHit-Requests
  • Redirect-Requests
  • Miss-Requests
  • Error-Requests
  • LimitExceeded-Requests
  • CapacityExceeded-Requests

Consulta de CloudWatch Logs Insights

Puede utilizar la siguiente plantilla de consulta de CloudWatch Logs Insights para analizar todos los campos de registro disponibles en sus registros de CloudFront. A continuación, puede utilizar fácilmente expresiones de filtro y de grupo haciendo referencia al nombre del campo directamente.

La siguiente consulta se incluye como ejemplo en el panel de CloudWatch que se crea con la plantilla de CloudFormation adjunta a esta publicación. Puede guardar esta consulta en CloudWatch Logs Insights para utilizarla como plantilla para construir consultas más avanzadas. Para obtener más información consulte Sintaxis de consulta de CloudWatch Logs Insights en la Guía del usuario de Amazon CloudWatch Logs.

[CloudWatch Logs Insights Query Syntax]

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" as date, time, x_edge_location, sc_bytes, c_ip, cs_method, host, cs_uri_stem, sc_status, referer, useragent, cs_uri_query, cookie, x_edge_result_type, x_edge_request_id, x_host_header, cs_protocol, cs_bytes, time_taken, x_forwarded_for, ssl_protocol, ssl_cipher, x_edge_response_result_type, cs_protocol_version, fle_status, fle_encrypted_fields, c_port, time_to_first_byte, x_edge_detailed_result_type, sc_content_type, sc_content_len, sc_range_start, sc_range_end

| limit 20

| sort @timestamp desc

Encuentre los eventos de registro que contengan un error:

Aquí hay un ejemplo de consulta que sólo le mostrará las solicitudes en las que el campo x-edge-result-type estaba en error.

[CloudWatch Logs Insights Query Syntax]

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" as date, time, x_edge_location, sc_bytes, c_ip, cs_method, host, cs_uri_stem, sc_status, referer, useragent, cs_uri_query, cookie, x_edge_result_type, x_edge_request_id, x_host_header, cs_protocol, cs_bytes, time_taken, x_forwarded_for, ssl_protocol, ssl_cipher, x_edge_response_result_type, cs_protocol_version, fle_status, fle_encrypted_fields, c_port, time_to_first_byte, x_edge_detailed_result_type, sc_content_type, sc_content_len, sc_range_start, sc_range_end

| limit 20

| sort @timestamp desc

| filter x_edge_result_type like "Error"

A continuación se presenta un ejemplo de consulta que producirá una serie temporal que muestra los valores mínimos, medios y máximos del campo time_to_first_byte durante un período de un minuto.

[CloudWatch Logs Insights Query Syntax]
Parse @message “* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *” as date, time, x_edge_location, sc_bytes, c_ip, cs_method, host, cs_uri_stem, sc_status,  eferrer, useragent, cs_uri_query, cookie, x_edge_result_type,x_edge_request_id, x_host_header, cs_protocol, cs_bytes, time_taken, x_forwarded_for, ssl_protocol, ssl_cipher, x_edge_response_result_type, cs_protocol_version, fle_status, fle_encrypted_fields, c_port, time_to_first_byte, x_edge_detailed_result_type, sc_content_type, sc_content_len, sc_range_start, sc_range_end

| stats avg(time_to_first_byte), min(time_to_first_byte), max(time_to_first_byte) by bin(60s)

Utilizando las métricas predeterminadas junto con las métricas emitidas desde sus filtros de métricas y los datos de informes de sus reglas de Contributor Insights puede crear un panel de control operativo para su distribución de CloudFront.

Figura 3: Tablero de CloudFront Insights

Consideraciones sobre los costos

A la hora de evaluar los costos, tenga en cuenta el volumen de registros ingeridos en CloudWatch. Un mayor volumen de registros repercute en el costo de la ingestión de registros, el número de eventos de registro respectivos en Contributor Insights y la cantidad total de datos consultados en CloudWatch Logs Insights. Para más información consulte la página de precios de CloudWatch.

Limpieza del ambiente

Para limpiar este panel y las reglas asociadas, simplemente elimine la pila de CloudFormation. Para obtener instrucciones, consulte Eliminar una pila en la consola de AWS CloudFormation en la Guía del usuario de AWS CloudFormation.

Conclusión

En esta publicación, lo guié a través del envío de registros estándar de CloudFront a CloudWatch Logs a través de una notificación de eventos de S3 y una función de Lambda. He demostrado algunas de las formas en las que puede utilizar Contributor Insights, CloudWatch Logs Insights y filtros de métricas para crear potentes paneles de control para sus distribuciones de CloudFront, sin necesidad de utilizar un producto de un socio o de terceros. Puede extraer muchos otros datos de los registros de CloudFront utilizando CloudWatch. Los ejemplos de esta publicación están diseñados para ayudarle a empezar. Pruebe crear sus propias consultas de CloudWatch Logs Insights, reglas de Contributor Insights, filtros de métricas y paneles para añadir valor a su estrategia de observabilidad para CloudFront.


Sobre el autor

Bobby Hallahan es un arquitecto de soluciones especialista sénior en el equipo de AWS Observability. Le apasiona ayudar a los clientes a encontrar soluciones innovadoras a problemas difíciles. Trabaja con los clientes de AWS para ayudarles a alcanzar sus objetivos de observabilidad. Durante su estancia en AWS, Bobby ha apoyado a clientes empresariales con sus cargas de trabajo de misión crítica.

 

 

 

 

Sobre el traductor

Christian Castro es Arquitecto de Soluciones Senior para Gobierno Federal de México en Sector Público. Christian es responsable de establecer y mantener arquitecturas de soluciones en AWS para clientes del Gobierno Federal Mexicano, además forma parte de la comunidad técnica de contenedores (TFC) dentro de AWS.

 

 

Revisores Técnicos

Gabriel Gasca es Arquitecto de Soluciones para para Gobiernos estatales y locales en AWS México, donde colabora con estas instituciones para diseñar soluciones para innovar  en el servicio al ciudadano, Gabriel es parte la comunidad técnica (TFC) de Analítica  en AWS.

 

 

 

 

Ulises Jiménez es Arquitecto de Soluciones en AWS México, con experiencia previa en diferentes industrias actualmente apoya a clientes del Sector Público en acelerar su entrega de soluciones.

 

 

 


Blog Post original

https://aws.amazon.com/es/blogs/mt/sending-cloudfront-standard-logs-to-cloudwatch-logs-for-analysis/