Querys logs de ELB (Elastic Load Balancing) usando Amazon Athena
Tags: aws, athena, spanish, awselb
Published: 2021-06-20 19:12:17

Cuando requerimos revisar los logs provenientes de los **ELB (Elastic Load Balancing)** contamos con la opción de poder exportar los logs hacia **Amazon S3**, sin embargo, si también buscamos verlos y contar con la opción de realizar querys, existen la opción de usar **Amazon Athena**.

###Definiciones  

**Amazon Athena**

*“Amazon Athena es un servicio de consultas interactivo que facilita el análisis de datos en Amazon S3 con SQL estándar. Athena no tiene servidor, de manera que no es necesario administrar infraestructura y solo paga por las consultas que ejecuta.”* [1]

**Amazon S3**

*“Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos que ofrece escalabilidad, disponibilidad de datos, seguridad y rendimiento líderes en el sector.”* [2]

**Elastic Load Balancing**

*“Elastic Load Balancing distribuye automáticamente el tráfico de aplicaciones entrante a través de varios destinos, tales como las instancias de Amazon EC2, los contenedores, las direcciones IP, las funciones Lambda y los dispositivos virtuales.”* [3]

Lo primero es revisar si tenemos activado en nuestro ELB en la sección: **EC2 > Load Balancing -> Load Balancers -> Basic Configuration -> Attributes** el registro de logs y que el mismo esta hacia un Bucket de **Amazon S3**. Si no tenemos activado, en la imagen a continuación, tenemos las opciones a configurar.
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/34bh2g054d2m6yt2bv8m.png)
 
Luego, vamos a **Amazon Athena** y procedemos a crear una base de datos y una tabla donde tendremos el acceso a los logs del ELB (Elastic Load Balancing) que se están almacenando y registrando continuamente.

En la siguiente imagen, creamos la base de datos llamada: demo_elb_logs 

**CREATE DATABSE demo_elb_logs**
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/teropjhx8zc8xxr0hun2.png)
 
Nota: Si tienes base de datos existentes en **Amazon Athena**, puedes usarlas también y solo crearías la tabla de los logs que requieres consultar provenientes de **Amazon S3**.
 

Ahora creamos mediante el siguiente query la tabla **elb_logs** que estará en la base de datos **demo_elb_logs** y tendrá la información proveniente de **Amazon S3**:

CREATE EXTERNAL TABLE IF NOT EXISTS elb_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 string,
            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
            )
            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://web-elb-logs/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/us-east-1/';

**Importante**: la opción **LOCATION** se refiere a la ubicación donde están los logs, el mismo lo podemos obtener ingresando en el bucket de **Amazon S3** que estamos usando para almacenar los logs de ELB como lo muestra la siguiente imagen:
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzhkz516brtivssl2h8h.png)
 

En la siguiente imagen vemos el resultado de la ejecución del query anterior.
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ct0mj6kaw0xm82ne0zw2.png)
 
Verificamos que la tabla tenga los datos realizando el siguiente query

**SELECT * FROM "demo_elb_logs"."elb_logs" limit 10;**
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/meh7enryqgcqiwbey4qd.png)
 
Podemos realizar búsquedas personalizadas como lo vemos en la imagen a continuación

**SELECT * FROM "demo_elb_logs"."elb_logs" where target_status_code_list= '200' limit 10;**
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7r1zjqb2sqm4mt74f711.png)
 



**Referencia**
https://docs.aws.amazon.com/athena/latest/ug/application-load-balancer-logs.html#create-alb-table
[1]: https://aws.amazon.com/es/athena/
[2]: https://aws.amazon.com/es/s3/
[3]: https://aws.amazon.com/es/elasticloadbalancing/