Come posso analizzare i log di accesso di Application Load Balancer utilizzando Amazon Athena?

7 minuti di lettura
0

Desidero analizzare i log di accesso del mio Application Load Balancer con Amazon Athena.

Desidero analizzare i log di accesso del mio Application Load Balancer con Amazon Athena.

Descrizione breve

Elastic Load Balancing non attiva la registrazione degli accessi per impostazione predefinita. Quando attivi la registrazione degli accessi, specifichi un bucket Amazon Simple Storage Service (Amazon S3). Tutti i log di accesso di Application Load Balancer e Classic Load Balancer sono archiviati nel bucket Amazon S3. Per risolvere i problemi o analizzare le prestazioni del tuo sistema di bilanciamento del carico, utilizza Athena per analizzare i log di accesso in Amazon S3.

**Nota:**Sebbene sia possibile utilizzare Athena per analizzare i log di accesso per Application Load Balancer e Classic Load Balancer, questa risoluzione si applica solo agli Application Load Balancer.

Risoluzione

Creare un database e una tabella per i log di Application Load Balancer

Per analizzare i log di accesso in Athena, crea un database e una tabella con i seguenti passaggi:

1.    Apri la console Athena.

2.    Per creare un database, esegui il comando seguente nell'Editor di query. È consigliabile creare il database nella stessa regione AWS del bucket S3.

create database alb_db

3.    Nel database creato nel passaggio 2, crea una tabella alb_logs per i log di Application Load Balancer. Per ulteriori informazioni, consulta Creazione della tabella per i log di Application Load Balancer.

Nota: Per migliorare le prestazioni delle query, è possibile creare una tabella con proiezione delle partizioni. Nella proiezione delle partizioni, Athena calcola i valori e le posizioni delle partizioni in base alla configurazione anziché alla lettura da un repository, come AWS Glue Data Catalog. Per ulteriori informazioni, consulta Proiezione delle partizioni con Amazon Athena.

CREATE EXTERNAL TABLE IF NOT EXISTS alb_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
            )
            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://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing//'
            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://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing//${day}"
            )

Nota: Sostituisci il nome della tabella e le posizioni S3 in base al tuo caso d'uso.

In alternativa, utilizza la seguente query per creare una tabella con partizioni:

CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs_partitioned (
            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
            )
            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://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/'

Quindi, usa il comando ALTERA TABELLA AGGIUNGI PARTIZIONE per caricare le partizioni:

ALTER TABLE alb_logs_partitioned ADD
  PARTITION (day = '2022/05/21')
  LOCATION's3://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/2022/05/21/'

**Nota:**Non è una buona pratica utilizzare un crawler AWS Glue nei log di Application Load Balancer.

4.    In Tabelle nel riquadro di navigazione, scegli Anteprima tabella dal menu. È possibile visualizzare i dati dai registri di accesso di Application Load Balancer nella finestra Risultati.

5.    Utilizza l'Editor di query per eseguire istruzioni SQL sulla tabella. È possibile salvare le query, visualizzare quelle precedenti o scaricare i risultati delle query sotto forma di file.csv.

Query di esempio

Negli esempi seguenti, assicurati di modificare il nome della tabella, i valori delle colonne e altre variabili per adattarli alla tua query:

Visualizza le prime 100 voci del registro degli accessi in ordine cronologico

Utilizza questa query per l'analisi e la risoluzione dei problemi:

SELECT *  
FROM alb_logs  
ORDER by time ASC  
LIMIT 100

Elenca tutti gli indirizzi IP dei client che hanno effettuato l'accesso all'Application Load Balancer e il numero di accessi effettuati all'Application Load Balancer

Utilizza questa query per l'analisi e la risoluzione dei problemi:

SELECT distinct client_ip, count() as count from alb_logs  
GROUP by client_ip  
ORDER by count() DESC;

Elenca la quantità media di dati (in kilobyte) che transita attraverso l'Application Load Balancer in coppie di richieste o risposte

Utilizza questa query per l'analisi e la risoluzione dei problemi:

SELECT (avg(sent_bytes)/1000.0 + avg(received_bytes)/1000.0)  
as prewarm_kilobytes from alb_logs;

Elenca tutte le destinazioni verso cui Application Load Balancer indirizza il traffico e il numero di richieste indirizzate per destinazione, in base alla distribuzione percentuale   

Utilizza questa query per identificare potenziali squilibri del traffico target:

SELECT target_ip, (Count(target_ip)* 100.0 / (Select Count(*) From alb_logs))  
as backend_traffic_percentage  
FROM alb_logs  
GROUP by target_ip<  
ORDER By count() DESC;

Elenca le volte in cui un client ha inviato una richiesta all'Application Load Balancer per poi chiudere la connessione prima della scadenza del timeout di inattività (errore HTTP 460)

Utilizza questa query per risolvere gli errori HTTP 460:

SELECT * from alb_logs where elb_status_code = '460';

Elenca le volte in cui una richiesta del client non è stata indirizzata perché la regola dell'ascoltatore ha inoltrato la richiesta a un gruppo target vuoto (errore HTTP 503)

Utilizza questa query per risolvere gli errori HTTP 503:

SELECT * from alb_logs where elb_status_code = '503';

Elenca i client, in ordine decrescente, in base al numero di volte in cui ogni client ha visitato un URL specificato

Utilizza questa query per analizzare i modelli di traffico:

SELECT client_ip, elb, request_url, count(*) as count from alb_logs  
GROUP by client_ip, elb, request_url  
ORDER by count DESC;

Elenca i 10 URL a cui gli utenti di Firefox accedono più frequentemente, in ordine decrescente

Utilizza questa query per analizzare la distribuzione e i modelli del traffico:

SELECT request_url, user_agent, count(*) as count  
FROM alb_logs  
WHERE user_agent LIKE '%Firefox%'  
GROUP by request_url, user_agent  
ORDER by count(*) DESC  
LIMIT 10;

Elenca i client, in ordine decrescente, in base alla quantità di dati (in megabyte) che ogni client ha inviato nelle proprie richieste all'Application Load Balancer

Utilizza questa query per analizzare la distribuzione e i modelli del traffico:

SELECT client_ip, sum(received_bytes/1000000.0) as client_datareceived_megabytes  
FROM alb_logs  
GROUP by client_ip  
ORDER by client_datareceived_megabytes DESC;

Elenca ogni volta in un intervallo di date specificato quando il tempo di elaborazione previsto era superiore a 5 secondi

Utilizza questa query per risolvere i problemi di latenza in un intervallo di tempo specificato:

SELECT * from alb_logs  
WHERE (parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')  
    BETWEEN parse_datetime('2018-08-08-00:00:00','yyyy-MM-dd-HH:mm:ss')  
    AND parse_datetime('2018-08-08-02:00:00','yyyy-MM-dd-HH:mm:ss'))  
AND (target_processing_time >= 5.0);

Conta il numero di richieste HTTP GET ricevute dal sistema di bilanciamento del carico raggruppate per l'indirizzo IP del client

Utilizza questa query per analizzare la distribuzione del traffico in entrata:

SELECT COUNT(request_verb)   
AS count, request_verb, client_ip   
FROM alb_logs_partitioned   
WHERE day = '2022/05/21'   
GROUP by request_verb, client_ip;
AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa