Comment puis-je analyser les journaux d'accès de mon Application Load Balancer à l'aide d'Amazon Athena ?

Lecture de 7 minute(s)
0

Je veux analyser les journaux d'accès de mon Application Load Balancer.à l'aide d'Amazon Athena

Brève description

Par défaut, Elastic Load Balancing n'active pas la journalisation d'accès. Lorsque vous activez la journalisation d'accès, vous devez spécifier un compartiment Amazon Simple Storage Service (Amazon S3). Tous les journaux d'accès d'Application Load Balancer et de Classic Load Balancer sont stockés dans ce compartiment Amazon S3. Lorsque vous voulez analyser les performances ou résoudre les problèmes de votre équilibreur de charge, vous pouvez utiliser Athena pour analyser les journaux d'accès dans S3.

Remarque : bien que vous puissiez utiliser Athena pour analyser les journaux d'accès pour les Application Load Balancers et les Classic Load Balancers, seuls les Application Load Balancers sont traités ici.

Solution

Créer une base de données et une table pour les journaux d'Application Load Balancers

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

1.    Ouvrez la console Athena.

2.    Dans l'Éditeur de requête, exécutez une commande similaire à ce qui suit pour créer une base de données. Une bonne pratique consiste à 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 précédente, créez une table alb_log pour les journaux des Application Load Balancers. Pour plus d'informations, voir Création de la table pour les journaux d’Application Load Balancers.

Remarque : Pour de meilleures performances de requête, vous pouvez choisir de créer une table avec projection de partition. Dans une projection de partition, les valeurs et les emplacements de la partition sont calculés à partir de la configuration plutôt que lus à partir d'un référentiel, tel que le catalogue de données AWS Glue. Pour plus d'informations, consultez Projection de partition 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/<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://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing/<REGION>/${day}"
            )

Veillez à remplacer le nom de la table et les emplacements S3 en fonction de votre cas d'utilisation.

Vous pouvez également créer une table avec des partitions à l'aide de la requête suivante et charger les partitions à l'aide de la commande ALTER TABLE ADD PARTITION.

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/'
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 : l'utilisation d'un crawler AWS Glue dans les journaux d'Application Load Balancer n'est pas une bonne pratique.

4.    Sous Tables dans le panneau de navigation, choisissez Aperçu de la table avec le bouton de menu situé à côté du nom de la table. Les données des journaux d'accès de l’Application Load Balancer sont visibles dans la fenêtre Résultats.

5.    Utilisez l'Éditeur de requête pour exécuter des instructions SQL sur la table. Vous pouvez enregistrer les requêtes, afficher les requêtes précédentes ou télécharger les résultats de requêtes au format CSV.

Exemples de requêtes

Dans les exemples suivants, assurez-vous de modifier le nom de la table, les valeurs de colonne et les autres variables, en fonction de votre requête.

ActionRequête
Afficher les 100 premières entrées de journal d'accès par ordre chronologique. Cas d'utilisation : analyse et résolution de problèmesSELECT *FROM alb_logORDER by time ASCLIMIT 100;
Lister toutes les adresses IP client qui ont accédé à l'équilibreur de charge d'application et combien de fois ils ont accédé à l'équilibreur de charge d'application. Cas d'utilisation : analyse et résolution de problèmesSELECT distinct client_ip, count() as count from alb_logGROUP by client_ipORDER by count() DESC;
Lister la quantité moyenne de données (en kilo-octets) passant par l'équilibreur de charge d'application dans des paires requête/réponse. Cas d'utilisation : analyse et résolution de problèmesSELECT (avg(sent_bytes)/1000.0 + avg(received_bytes)/1000.0)comme prewarm_kilobytes de alb_log;
Lister toutes les cibles vers lesquelles l’Application Load Balancer achemine le trafic, ainsi que le nombre de fois où il a acheminé des demandes vers chaque cible, par distribution de pourcentage. Cas d'utilisation : identification de déséquilibre potentiel du trafic cibleSELECT target_ip, (Count(target_ip)* 100.0 / (Select Count(*) From alb_log))as backend_traffic_percentageFROM alb_logGROUP by target_ipORDER By count() DESC;
Liste le nombre de fois où un client a envoyé une demande à Application Load Balancer et a ensuite fermé la connexion à Application Load Balancer avant la fin du délai d'inactivité (erreur HTTP 460). Cas d'utilisation : résolution des erreurs HTTP 460SELECT * from alb_log where elb_status_code = '460';
Lister le nombre de fois où une demande client n'a pas été acheminée car la règle d'écouteur a transmis la demande à un groupe cible vide (erreur HTTP 503). Cas d'utilisation : résolution des erreurs HTTP 503SELECT * from alb_log where elb_status_code = '503';
Lister les clients par ordre décroissant, selon le nombre de fois où chaque client a visité une URL spécifiée. Cas d'utilisation : analyse des modèles du traficSELECT client_ip, elb, request_url, count(*) as count from alb_logGROUP by client_ip, elb, request_urlORDER by count DESC;
Lister les 10 URL auxquelles les utilisateurs de Firefox ont accédé le plus souvent, par ordre décroissant. Cas d'utilisation : analyse des modèles et de la distribution du traficSELECT request_url, user_agent, count(*) as countFROM alb_logWHERE user_agent LIKE '%Firefox%'GROUP by request_url, user_agentORDER by count(*) DESCLIMIT 10;
Lister les clients par ordre décroissant, selon la quantité de données (en méga-octets) envoyée dans les demandes à l’équilibreur de charge d'application par chaque client. Cas d'utilisation : analyse des modèles et de la distribution du traficSELECT client_ip, sum(received_bytes/1000000.0) as client_datareceived_megabytesFROM alb_logGROUP by client_ipORDER by client_datareceived_megabytes DESC;
Lister chaque fois où, dans une plage de dates spécifiée, le temps de traitement cible a été supérieur à 5 secondes. Cas d'utilisation : résolution des erreurs de latence pour une période spécifiéeSELECT * from alb_logWHERE (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 l'adresse IP du client. Cas d'utilisation : analyser la distribution du trafic entrantSELECT COUNT(request_verb) AS count, request_verb, client_ip FROM alb_log_partition_projection WHERE day = '2022/05/21' GROUP BY request_verb, client_ip;

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 7 mois