Comment analyser mes journaux d’accès à l’Application Load Balancer à l’aide d’Amazon Athena ?

Lecture de 7 minute(s)
0

Je souhaite analyser mes journaux d’accès à l’Application Load Balancer avec Amazon Athena.

Je souhaite analyser mes journaux d’accès à l’Application Load Balancer avec Amazon Athena.

Brève description

L’Elastic Load Balancing n’active pas la journalisation des accès par défaut. Lorsque vous activez la journalisation des accès, vous indiquez un compartiment Amazon Simple Storage Service (Amazon S3). Tous les journaux d’accès à l’Application Load Balancer et au Classic Load Balancer sont stockés dans le compartiment Amazon S3. Pour résoudre des problèmes ou analyser les performances de votre équilibreur de charge, utilisez Athena pour analyser les journaux d’accès dans Amazon S3.

**Remarque :**Bien que vous puissiez utiliser Athena pour analyser les journaux d’accès aux Application Load Balancers et aux Classic Load Balancers, cette solution s’applique uniquement aux Application Load Balancers.

Résolution

Création d’une base de données et d’une table pour les journaux de l’Application Load Balancer

Pour analyser les journaux d’accès dans Athena, créez une base de données et une table en procédant comme suit :

1.    Ouvrez la console Athena.

2.    Pour créer une base de données, exécutez la commande suivante dans l’Éditeur de requêtes. Il est recommandé de créer la base de données dans la même Région AWS que le compartiment S3.

create database alb_db

3.    Dans la base de données que vous avez créée à l’étape 2, créez une table alb_logs pour les journaux de l’Application Load Balancer. Pour plus d’informations, reportez-vous à la section Création de la table pour les journaux de l’Application Load Balancer.

**Remarque :**Pour améliorer les performances des requêtes, vous pouvez créer une table avec une projection des partitions. Dans la projection des partitions, Athena calcule les valeurs et les emplacements des partitions à partir de la configuration plutôt que de les lire depuis un référentiel, tel que le Catalogue de données AWS Glue. Pour plus d’informations, reportez-vous à la section Projection de partitions avec 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}"
            )

**Remarque :**Remplacez le nom de la table et les emplacements S3 en fonction de votre cas d’utilisation.

Vous pouvez également utiliser la requête suivante pour créer une table avec des partitions :

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

Utilisez ensuite la commande ALTER TABLE ADD PARTITION pour charger les partitions :

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

**Remarque :**Il n’est pas recommandé d’utiliser un crawler AWS Glue dans les journaux de l’Application Load Balancer.

4.    Sous Tableaux dans le volet de navigation, choisissez Aperçu du tableau dans le menu. Vous pouvez consulter les données des journaux d’accès à l’Application Load Balancer dans la fenêtre Résultats.

5.    Utilisez l’Éditeur de requêtes pour exécuter des instructions SQL sur le tableau. Vous pouvez enregistrer des requêtes, afficher des requêtes précédentes ou télécharger les résultats des requêtes au format de fichier .csv.

Exemples de requêtes

Dans les exemples suivants, veillez à modifier le nom de la table, les valeurs des colonnes et les autres variables en fonction de votre requête :

Affichez les 100 premières entrées du journal d’accès par ordre chronologique

Utilisez cette requête à des fins d’analyse et de résolution des problèmes :

SELECT *  
FROM alb_logs  
ORDER by time ASC  
LIMIT 100

Répertoriez toutes les adresses IP des clients qui ont accédé à l’Application Load Balancer et le nombre de fois où ils ont accédé à l’Application Load Balancer 

Utilisez cette requête à des fins d’analyse et de résolution des problèmes :

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

Répertoriez la quantité moyenne de données (en kilo-octets) qui transite par l’Application Load Balancer sous forme de paires de requêtes ou de réponses

Utilisez cette requête à des fins d’analyse et de résolution des problèmes :

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

Répertoriez toutes les cibles vers lesquelles l’Application Load Balancer achemine le trafic et le nombre de requêtes acheminées par cible, par distribution en pourcentage   

Utilisez cette requête pour identifier les déséquilibres potentiels du trafic cible :

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;

Répertoriez les fois où un client a envoyé une requête à l’Application Load Balancer puis a interrompu la connexion avant que le délai d’inactivité ne soit écoulé (erreur HTTP 460)

Utilisez cette requête pour résoudre les erreurs HTTP 460 :

SELECT * from alb_logs where elb_status_code = '460';

Répertoriez les fois où une requête client n’a pas été acheminée parce que la règle de l’écouteur a transmis la requête à un groupe cible vide (erreur HTTP 503)

Utilisez cette requête pour résoudre les erreurs HTTP 503 :

SELECT * from alb_logs where elb_status_code = '503';

Répertoriez les clients, par ordre décroissant, selon le nombre de fois que chaque client a visité une URL indiquée

Utilisez cette requête pour analyser les modèles de trafic :

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

Répertoriez les 10 URL les plus fréquemment consultées par les utilisateurs de Firefox, par ordre décroissant

Utilisez cette requête pour analyser la distribution et les modèles de trafic :

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;

Répertoriez les clients, par ordre décroissant, en fonction de la quantité de données (en mégaoctets) que chaque client a envoyée dans ses requêtes à l’Application Load Balancer

Utilisez cette requête pour analyser la distribution et les modèles de trafic :

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;

Répertoriez, dans une période indiquée, les fois où le temps de traitement cible était supérieur à 5 secondes

Utilisez cette requête pour résoudre les problèmes de latence dans un laps de temps indiqué :

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

Comptez le nombre de requêtes HTTP GET reçues par l’équilibreur de charge, regroupées par adresse IP du client

Utilisez cette requête pour analyser la distribution du trafic entrant :

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 OFFICIEL
AWS OFFICIELA mis à jour il y a un an