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

Date de la dernière mise à jour : 29/06/2021

Je souhaite 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 S3. Lorsque vous souhaitez 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_log_partition_projection (
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(year int, month int, day int)
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/'
TBLPROPERTIES (
'has_encrypted_data'='false',
'projection.day.digits'='2',
'projection.day.range'='01,31',
'projection.day.type'='integer',
'projection.enabled'='true',
'projection.month.digits'='2',
'projection.month.range'='01,12',
'projection.month.type'='integer',
'projection.year.digits'='4',
'projection.year.range'='2020,2021',
'projection.year.type'='integer',
"storage.location.template" = "s3://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/${year}/${month}/${day}"
)

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

Vous pouvez 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(year int, month int, day int)
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 (year = '2020', month ='05', day= '21')
  LOCATION's3://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/2020/05/21/'

Remarque : Il n'est pas recommandé d'utiliser un analyseur AWS Glue dans les journaux d'Application Load Balancer.

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 ci-dessous, assurez-vous de modifier le nom de la table, les valeurs de colonne et les autres variables, en fonction de votre requête.

Action Requê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èmes

SELECT *
FROM alb_log
ORDER by time ASC
LIMIT 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èmes

SELECT distinct client_ip, count() as count from alb_log
GROUP by client_ip
ORDER 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èmes

SELECT (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 cible

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

Listez le nombre de fois où un client a envoyé une demande à Application Load Balancer et a ensuite mis fin à la connexion à Application Load Balancer avant la fin du délai d'inactivité (erreur HTTP 460).

Cas d'utilisation : résolution des erreurs HTTP 460

SELECT * 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 503

SELECT * 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 trafic

SELECT client_ip, elb, request_url, count(*) as count from alb_log
GROUP by client_ip, elb, request_url
ORDER 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 trafic

SELECT request_url, user_agent, count(*) as count
FROM alb_log
WHERE user_agent LIKE '%Firefox%'
GROUP by request_url, user_agent
ORDER by count(*) DESC
LIMIT 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 trafic

SELECT client_ip, sum(received_bytes/1000000.0) as client_datareceived_megabytes
FROM alb_log
GROUP by client_ip
ORDER 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ée

SELECT * from alb_log
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 l'adresse IP du client.

Cas d'utilisation : analyser la distribution du trafic entrant

SELECT COUNT (request_verb) AS count, request_verb, client_ip FROM alb_log_partition_projection WHERE année = '2020' ET mois = '05' ET jour = '21' GROUP BY request_verb, client_ip ;

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?