Consulta de los registros de Application Load Balancer - Amazon Athena

Consulta de los registros de Application Load Balancer

Un Application Load Balancer aplicaciones es una opción de equilibro de carga de Elastic Load Balancing que permite la distribución del tráfico en una implementación de microservicios con contenedores. La consulta de los registros del Equilibrador de carga de aplicación le permite ver el origen del tráfico, la latencia y los bytes transferidos a instancias de Elastic Load Balancing y desde dichas instancias y las aplicaciones de backend. Para obtener más información, consulte Registros de acceso para el equilibrador de carga de aplicación y Registros de conexión para el equilibrador de carga de aplicación en la Guía del usuario para equilibradores de carga de aplicación.

Requisitos previos

Creación de la tabla para los registros de acceso de ALB

  1. Copie y pegue la siguiente instrucción CREATE TABLE en el editor de consultas de la Consola de Athena y, a continuación, modifíquela según sea necesario para sus propios requisitos de entrada de registros. Para obtener más información acerca de cómo empezar a usar la consola de Athena, consulte Introducción. Sustituya la ruta de la cláusula LOCATION por la ubicación de la carpeta de registro de acceso de Amazon S3. Para obtener más información sobre la ubicación del archivo de registro de acceso, consulte Archivos de registro de acceso en la Guía del usuario para equilibradores de carga de aplicación.

    Para obtener información sobre cada campo del archivo de registro, consulte Entradas de registro de acceso en la Guía del usuario de los equilibradores de carga de aplicaciones.

    nota

    La siguiente instrucción CREATE TABLE de ejemplo incluye las columnas classification, classification_reason y conn_trace_id (“ID de trazabilidad”, o TID) agregadas recientemente. Para crear una tabla para los registros de acceso al equilibrador de carga de aplicaciones que no contenga estas entradas, elimine las columnas correspondientes de la instrucción CREATE TABLE y modifique la expresión regular en consecuencia.

    CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs ( type string, time string, elb string, client_ip string, client_port int, target_ip string, target_port int, request_processing_time double, target_processing_time double, response_processing_time double, elb_status_code int, target_status_code string, received_bytes bigint, sent_bytes bigint, request_verb string, request_url string, request_proto string, user_agent string, ssl_cipher string, ssl_protocol string, target_group_arn string, trace_id string, domain_name string, chosen_cert_arn string, matched_rule_priority string, request_creation_time string, actions_executed string, redirect_url string, lambda_error_reason string, target_port_list string, target_status_code_list string, classification string, classification_reason string, conn_trace_id string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\s]+?)\" \"([^\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)?( .*)?') LOCATION 's3://DOC-EXAMPLE-BUCKET/access-log-folder-path/'
  2. Ejecute la consulta en la consola de Athena. Cuando la consulta finaliza, Athena registra la tabla alb_access_logs, dejando los datos que contiene listos para efectuar consultas.

Creación de la tabla para los registros de acceso del ALB en Athena mediante la proyección de particiones

Dado que los registros de acceso del ALB tienen una estructura conocida, cuyo esquema de partición puede especificarse de antemano, es posible reducir el tiempo de ejecución de las consultas y automatizar la administración de particiones mediante la característica de proyección de particiones de Athena. La proyección de particiones agrega de forma automática nuevas particiones a medida que se agregan nuevos datos. Esto hace que no sea necesario agregar particiones manualmente mediante ALTER TABLE ADD PARTITION.

El siguiente ejemplo de instrucción CREATE TABLE utiliza de manera automática la proyección de particiones en registros de acceso del ALB desde una fecha especificada hasta el presente para una sola región de AWS. La instrucción se basa en el ejemplo de la sección anterior, pero agrega las cláusulas PARTITIONED BY y TBLPROPERTIES para habilitar la proyección de la partición. En las cláusulas LOCATION y storage.location.template, reemplace los marcadores de posición por valores que identifiquen la ubicación del bucket de Amazon S3 de los registros del ALB. Para obtener más información sobre la ubicación del archivo de registro de acceso, consulte Archivos de registro de acceso en la Guía del usuario para equilibradores de carga de aplicación. En projection.day.range, reemplace 2022/01/01 por la fecha de inicio que desee utilizar. Una vez ejecutada la consulta correctamente, puede consultar la tabla. No tiene que ejecutar ALTER TABLE ADD PARTITION para cargar las particiones. Para obtener información sobre cada campo del archivo de registro, consulte Acceso a las entradas del registro.

CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs ( type string, time string, elb string, client_ip string, client_port int, target_ip string, target_port int, request_processing_time double, target_processing_time double, response_processing_time double, elb_status_code int, target_status_code string, received_bytes bigint, sent_bytes bigint, request_verb string, request_url string, request_proto string, user_agent string, ssl_cipher string, ssl_protocol string, target_group_arn string, trace_id string, domain_name string, chosen_cert_arn string, matched_rule_priority string, request_creation_time string, actions_executed string, redirect_url string, lambda_error_reason string, target_port_list string, target_status_code_list string, classification string, classification_reason string, conn_trace_id string ) PARTITIONED BY ( day STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\s]+?)\" \"([^\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)?( .*)?') LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.day.type" = "date", "projection.day.range" = "2022/01/01,NOW", "projection.day.format" = "yyyy/MM/dd", "projection.day.interval" = "1", "projection.day.interval.unit" = "DAYS", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}" )

Para obtener más información sobre la proyección de particiones, consulte Proyección de particiones con Amazon Athena.

Consultas de ejemplo para registros de acceso del ALB

La siguiente consulta cuenta el número de solicitudes HTTP GET que el equilibrador de carga ha recibido, agrupadas en función de la dirección IP del cliente:

SELECT COUNT(request_verb) AS count, request_verb, client_ip FROM alb_access_logs GROUP BY request_verb, client_ip LIMIT 100;

Otra consulta muestra las direcciones URL visitadas por los usuarios del navegador Safari:

SELECT request_url FROM alb_access_logs WHERE user_agent LIKE '%Safari%' LIMIT 10;

En la siguiente consulta, se muestran registros que tienen valores de código de estado de ELB superiores o iguales a 500.

SELECT * FROM alb_access_logs WHERE elb_status_code >= 500

En el siguiente ejemplo, se muestra cómo analizar los registros por datetime:

SELECT client_ip, sum(received_bytes) FROM alb_access_logs WHERE parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') BETWEEN parse_datetime('2018-05-30-12:00:00','yyyy-MM-dd-HH:mm:ss') AND parse_datetime('2018-05-31-00:00:00','yyyy-MM-dd-HH:mm:ss') GROUP BY client_ip;

La siguiente consulta examina la tabla que utiliza la proyección de particiones en busca de todos los registros de acceso al equilibrador de carga de aplicaciones del día especificado.

SELECT * FROM alb_access_logs WHERE day = '2022/02/12'

Creación de la tabla para los registros de conexión del ALB

  1. Copie y pegue la siguiente instrucción CREATE TABLE de ejemplo en el editor de consultas de la Consola de Athena y, a continuación, modifíquela según sea necesario para satisfacer sus propios requisitos de entrada de registros. Para obtener más información acerca de cómo empezar a usar la consola de Athena, consulte Introducción. Sustituya la ruta de la cláusula LOCATION por la ubicación de la carpeta del registro de conexiones de Amazon S3. Para obtener más información sobre la ubicación del archivo de registro de conexión, consulte Archivos de registro de conexión en la Guía del usuario para equilibradores de carga de aplicación. Para obtener información sobre cada campo del archivo de registro, consulte Entradas del registro de conexión.

    CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs ( time string, client_ip string, client_port int, listener_port int, tls_protocol string, tls_cipher string, tls_handshake_latency double, leaf_client_cert_subject string, leaf_client_cert_validity string, leaf_client_cert_serial_number string, tls_verify_status string, conn_trace_id string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?') LOCATION 's3://DOC-EXAMPLE-BUCKET/connection-log-folder-path/'
  2. Ejecute la consulta en la consola de Athena. Cuando la consulta finaliza, Athena registra la tabla alb_connection_logs, dejando los datos que contiene listos para efectuar consultas.

Creación de la tabla para los registros de conexión del ALB en Athena mediante la proyección de particiones

Dado que los registros de conexión del ALB tienen una estructura conocida, cuyo esquema de partición puede especificarse de antemano, es posible reducir el tiempo de ejecución de las consultas y automatizar la administración de particiones mediante la característica de proyección de particiones de Athena. La proyección de particiones agrega de forma automática nuevas particiones a medida que se agregan nuevos datos. Esto hace que no sea necesario agregar particiones manualmente mediante ALTER TABLE ADD PARTITION.

El siguiente ejemplo de instrucción CREATE TABLE utiliza de manera automática la proyección de particiones en registros de conexión del ALB desde una fecha especificada hasta el presente para una sola región de AWS. La instrucción se basa en el ejemplo de la sección anterior, pero agrega las cláusulas PARTITIONED BY y TBLPROPERTIES para habilitar la proyección de la partición. En las cláusulas LOCATION y storage.location.template, reemplace los marcadores de posición por valores que identifiquen la ubicación del bucket de Amazon S3 de los registros de conexión del ALB. Para obtener más información sobre la ubicación del archivo de registro de conexión, consulte Archivos de registro de conexión en la Guía del usuario para equilibradores de carga de aplicación. Para projection.day.range, reemplace 2023/01/01 por la fecha de inicio que quiere utilizar. Una vez ejecutada la consulta correctamente, puede consultar la tabla. No tiene que ejecutar ALTER TABLE ADD PARTITION para cargar las particiones. Para obtener información sobre cada campo del archivo de registro, consulte Entradas del registro de conexión.

CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs ( time string, client_ip string, client_port int, listener_port int, tls_protocol string, tls_cipher string, tls_handshake_latency double, leaf_client_cert_subject string, leaf_client_cert_validity string, leaf_client_cert_serial_number string, tls_verify_status string, conn_trace_id string ) PARTITIONED BY ( day STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?') LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.day.type" = "date", "projection.day.range" = "2023/01/01,NOW", "projection.day.format" = "yyyy/MM/dd", "projection.day.interval" = "1", "projection.day.interval.unit" = "DAYS", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}" )

Para obtener más información sobre la proyección de particiones, consulte Proyección de particiones con Amazon Athena.

Consultas de ejemplo para registros de conexión del ALB

El siguiente recuento de consultas se produce cuando el valor de tls_verify_status no era 'Success', agrupadas por dirección IP del cliente:

SELECT DISTINCT client_ip, count() AS count FROM alb_connection_logs WHERE tls_verify_status != 'Success' GROUP BY client_ip ORDER BY count() DESC;

La siguiente consulta busca los incidentes en los que el valor de tls_handshake_latency fuera superior a 2 segundos en el intervalo de tiempo especificado:

SELECT * FROM alb_connection_logs WHERE ( parse_datetime(time, 'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') BETWEEN parse_datetime('2024-01-01-00:00:00', 'yyyy-MM-dd-HH:mm:ss') AND parse_datetime('2024-03-20-00:00:00', 'yyyy-MM-dd-HH:mm:ss') ) AND (tls_handshake_latency >= 2.0);

Recursos adicionales de