Wie analysiere ich meine Application Load Balancer-Zugriffsprotokolle mit Amazon Athena?

Lesedauer: 7 Minute
0

Ich möchte meine Application Load Balancer-Zugriffsprotokolle mit Amazon Athena analysieren.

Ich möchte meine Application Load Balancer-Zugriffsprotokolle mit Amazon Athena analysieren.

Kurze Beschreibung

Elastic Load Balancing aktiviert ](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html)die Zugriffsprotokollierung[ standardmäßig nicht. Wenn Sie die Zugriffsprotokollierung aktivieren, geben Sie einen Amazon Simple Storage Service (Amazon S3) -Bucket an. Alle Zugriffsprotokolle von Application Load Balancer und Classic Load Balancer werden im Amazon S3-Bucket gespeichert. Verwenden Sie Athena, um Probleme zu beheben oder die Leistung Ihres Load Balancers zu analysieren, um die Zugriffsprotokolle in Amazon S3 zu analysieren.

**Hinweis:**Sie können Athena zwar verwenden, um Zugriffsprotokolle für Application Load Balancers und Classic Load Balancers zu analysieren, diese Lösung gilt jedoch nur für Application Load Balancers.

Auflösung

Erstellen Sie eine Datenbank und eine Tabelle für Application Load Balancer-Logs

Um die Zugriffsprotokolle in Athena zu analysieren, erstellen Sie eine Datenbank und eine Tabelle mit den folgenden Schritten:

1.Öffnen Sie die Athena-Konsole.

2.Um eine Datenbank zu erstellen, führen Sie den folgenden Befehl im Abfrage-Editor aus. Es hat sich bewährt, die Datenbank in derselben AWS-Region wie der S3-Bucket zu erstellen.

create database alb_db

3.Erstellen Sie in der Datenbank, die Sie in Schritt 2 erstellt haben, eine Tabelle alb\ _logs für die Application Load Balancer-Logs. Weitere Informationen finden Sie unter Erstellen der Tabelle für Application Load Balancer-Logs.

**Hinweis:**Für eine bessere Abfrageleistung können Sie eine Tabelle mit Partitionsprojektion erstellen. Bei der Partitionsprojektion berechnet Athena Partitionswerte und Speicherorte anhand der Konfiguration, anstatt sie aus einem Repository wie dem AWS Glue-Datenkatalog zu lesen. Weitere Informationen finden Sie unter Partitionsprojektion mit 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}"
            )

**Hinweis:**Ersetzen Sie den Tabellennamen und die S3-Speicherorte entsprechend Ihrem Anwendungsfall.

Oder Sie verwenden die folgende Abfrage, um eine Tabelle mit Partitionen zu erstellen:

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/'

Verwenden Sie dann den Befehl ALTER TABLE ADD PARTITION, um die Partitionen zu laden:

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/'

**Hinweis:**Es ist keine bewährte Methode, einen AWS Glue-Crawler für die Application Load Balancer-Protokolle zu verwenden.

4.Wählen Sie im Navigationsbereich unter Tabellen im Menü die Option Tabellenvorschau aus. Sie können die Daten aus den Application Load Balancer-Zugriffsprotokollen im Ergebnis-Fenster einsehen.

5.Verwenden Sie den Abfrage-Editor, um SQL-Anweisungen für die Tabelle auszuführen. Sie können Abfragen speichern, frühere Abfragen anzeigen oder Abfrageergebnisse im CSV-Dateiformat herunterladen.

Beispielabfragen

Achten Sie in den folgenden Beispielen darauf, den Tabellennamen, die Spaltenwerte und andere Variablen so zu ändern, dass sie zu Ihrer Abfrage passen:

Die ersten 100 Zugriffsprotokolleinträge in chronologischer Reihenfolge anzeigen

Verwenden Sie diese Query für Analysen und Problembehebungen:

SELECT *  
FROM alb_logs  
ORDER by time ASC  
LIMIT 100

**Listet alle Client-IP-Adressen auf, die auf den Application Load Balancer zugegriffen haben, und wie oft sie auf den Application Load Balancer zugegriffen haben **

Verwenden Sie diese Query für Analysen und Problembehebungen:

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

Führen Sie die durchschnittliche Datenmenge (in Kilobyte) auf, die den Application Load Balancer in Anforderungs- oder Antwortpaaren durchläuft

Verwenden Sie diese Query für Analysen und Problembehebungen:

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

Listet alle Ziele auf, an die der Application Load Balancer Traffic weiterleitet, sowie die Anzahl der weitergeleiteten Anfragen pro Ziel, nach prozentualer Verteilung

Verwenden Sie diese Abfrage, um potenzielle Ungleichgewichte im Zielverkehr zu ermitteln:

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;

Listet die Zeiten auf, zu denen ein Client eine Anfrage an den Application Load Balancer gesendet und dann die Verbindung geschlossen hat, bevor das Leerlauf-Timeout abgelaufen ist (HTTP 460-Fehler)

Verwenden Sie diese Abfrage, um HTTP 460-Fehler zu beheben:

SELECT * from alb_logs where elb_status_code = '460';

Listet die Zeiten auf, in denen eine Clientanfrage nicht weitergeleitet wurde, weil die Listener-Regel die Anfrage an eine leere Zielgruppe weitergeleitet hat (HTTP 503-Fehler)

Verwenden Sie diese Abfrage, um HTTP 503-Fehler zu beheben:

SELECT * from alb_logs where elb_status_code = '503';

Listet Kunden in absteigender Reihenfolge nach der Häufigkeit auf, mit der jeder Kunde eine bestimmte URL besucht hat

Verwenden Sie diese Abfrage, um Verkehrsmuster zu analysieren:

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

Listen Sie die 10 URLs auf, auf die Firefox-Benutzer am häufigsten zugegriffen haben, in absteigender Reihenfolge

Verwenden Sie diese Abfrage, um die Verkehrsverteilung und -muster zu analysieren:

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;

Listen Sie die Clients in absteigender Reihenfolge nach der Datenmenge (in Megabyte) auf, die jeder Client in seinen Anfragen an den Application Load Balancer gesendet hat

Verwenden Sie diese Abfrage, um die Verkehrsverteilung und -muster zu analysieren:

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;

Listet jedes Mal in einem bestimmten Zeitraum auf, wenn die Zielverarbeitungszeit mehr als 5 Sekunden betrug

Verwenden Sie diese Abfrage, um die Latenz in einem bestimmten Zeitraum zu beheben:

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);

Zählen Sie die Anzahl der vom Load Balancer empfangenen HTTP-GET-Anfragen, gruppiert nach der Client-IP-Adresse

Verwenden Sie diese Abfrage, um die Verteilung des eingehenden Traffics zu analysieren:

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 OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr