Interrogation des journaux de l'Application Load Balancer - Amazon Athena

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Interrogation des journaux de l'Application Load Balancer

Application Load Balancer est une option de répartition de charge pour Elastic Load Balancing qui permet la distribution du trafic dans un déploiement de microservices à l'aide de conteneurs. L'interrogation des journaux de l'Application Load Balancer vous permet de connaître la source du trafic et la latence, ainsi que les octets transférés vers et depuis les instances Elastic Load Balancing et les applications backend. Pour plus d'informations, consultez les journaux d'accès de votre Application Load Balancer et les journaux de connexion de votre Application Load Balancer dans le Guide de l'utilisateur des Application Load Balancers.

Prérequis

Création de la table pour les journaux d'accès ALB

  1. Copiez et collez l'CREATE TABLEinstruction suivante dans l'éditeur de requêtes de la console Athena, puis modifiez-la selon vos propres exigences en matière de saisie dans le journal. Pour plus d'informations sur le démarrage avec la console Athena, veuillez consulter la rubrique Mise en route. Remplacez le chemin indiqué dans la LOCATION clause par l'emplacement de votre dossier de journal d'accès Amazon S3. Pour plus d'informations sur l'emplacement des fichiers journaux d'accès, consultez la section Fichiers journaux d'accès dans le Guide de l'utilisateur des équilibreurs de charge d'application.

    Pour plus d'informations sur chaque champ du fichier journal, consultez les entrées du journal d'accès dans le guide de l'utilisateur pour les équilibreurs de charge d'application.

    Note

    L'exemple d'CREATE TABLEinstruction suivant inclut les colonnesclassification,classification_reason, et conn_trace_id (« ID de traçabilité », ou TID) récemment ajoutées. Pour créer une table pour les journaux d'accès à Application Load Balancer qui ne contiennent pas ces entrées, supprimez les colonnes correspondantes de l'CREATE TABLEinstruction et modifiez l'expression régulière en conséquence.

    CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_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, conn_trace_id 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://DOC-EXAMPLE-BUCKET/access-log-folder-path/'
  2. Exécutez la requête dans la console Athena. Une fois que la requête est terminée, Athena enregistre la table alb_access_logs, de telle sorte que les données soient prêtes pour que vous puissiez émettre des requêtes.

Création de la table pour les journaux d'accès ALB dans Athena à l'aide de la projection de partitions

Les journaux d'accès ALB ayant une structure connue dont vous pouvez spécifier le schéma de partition à l'avance, vous pouvez réduire le temps d'exécution des requêtes et automatiser la gestion des partitions en utilisant la fonction de projection de partition Athena. La projection des partitions ajoute automatiquement de nouvelles partitions à mesure que de nouvelles données sont ajoutées. Vous n'avez donc plus besoin d'ajouter manuellement des partitions à l'aide de la commande ALTER TABLE ADD PARTITION.

L'exemple d'CREATE TABLEinstruction suivant utilise automatiquement la projection de partition sur les journaux d'accès ALB à partir d'une date spécifiée jusqu'à aujourd'hui pour une seule AWS région. L'instruction se base sur l'exemple de la section précédente, mais ajoute les clauses PARTITIONED BY et TBLPROPERTIES pour activer la projection de partition. Dans les storage.location.template clauses LOCATION et, remplacez les espaces réservés par des valeurs identifiant l'emplacement du compartiment Amazon S3 de vos journaux d'accès ALB. Pour plus d'informations sur l'emplacement des fichiers journaux d'accès, consultez la section Fichiers journaux d'accès dans le Guide de l'utilisateur des équilibreurs de charge d'application. Pour projection.day.range, remplacez 2022/01/01 par la date de début que vous souhaitez utiliser. Après avoir exécuté la requête avec succès, vous pouvez interroger la table. Vous n'avez pas besoin d'exécuter ALTER TABLE ADD PARTITION pour charger les partitions. Pour plus d'informations sur chaque champ du fichier journal, consultez la section Entrées du journal d'accès.

CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_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, conn_trace_id 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://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/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://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}" )

Pour plus d'informations sur la projection de partition, voir Projection de partition avec Amazon Athena.

Exemples de requêtes pour les journaux d'accès ALB

La requête suivante compte le nombre de demandes HTTP GET reçues par l'équilibreur de charge et regroupées par l'adresse IP du client:

SELECT COUNT(request_verb) AS count, request_verb, client_ip FROM alb_access_logs GROUP BY request_verb, client_ip LIMIT 100;

Une autre requête affiche les URL visitées par les utilisateurs du navigateur Safari:

SELECT request_url FROM alb_access_logs WHERE user_agent LIKE '%Safari%' LIMIT 10;

La requête suivante montre les enregistrements dont les valeurs de code d'état ELB sont supérieures ou égales à 500.

SELECT * FROM alb_access_logs WHERE elb_status_code >= 500

L'exemple suivant montre comment analyser les journaux par datetime :

SELECT client_ip, sum(received_bytes) FROM alb_access_logs WHERE parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') BETWEEN parse_datetime('2018-05-30-12:00:00','yyyy-MM-dd-HH:mm:ss') AND parse_datetime('2018-05-31-00:00:00','yyyy-MM-dd-HH:mm:ss') GROUP BY client_ip;

La requête suivante interroge la table qui utilise la projection de partition pour tous les journaux d'accès ALB à partir du jour spécifié.

SELECT * FROM alb_access_logs WHERE day = '2022/02/12'

Création de la table pour les journaux de connexion ALB

  1. Copiez et collez l'exemple d'CREATE TABLEinstruction suivant dans l'éditeur de requêtes de la console Athena, puis modifiez-le selon vos propres exigences en matière de saisie dans le journal. Pour plus d'informations sur le démarrage avec la console Athena, veuillez consulter la rubrique Mise en route. Remplacez le chemin indiqué dans la LOCATION clause par l'emplacement du dossier de votre journal de connexion Amazon S3. Pour plus d'informations sur l'emplacement des fichiers journaux de connexion, consultez la section Fichiers journaux de connexion dans le Guide de l'utilisateur des équilibreurs de charge d'application. Pour plus d'informations sur chaque champ du fichier journal, consultez la section Entrées du journal des connexions.

    CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs ( time string, client_ip string, client_port int, listener_port int, tls_protocol string, tls_cipher string, tls_handshake_latency double, leaf_client_cert_subject string, leaf_client_cert_validity string, leaf_client_cert_serial_number string, tls_verify_status string, conn_trace_id string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?') LOCATION 's3://DOC-EXAMPLE-BUCKET/connection-log-folder-path/'
  2. Exécutez la requête dans la console Athena. Une fois que la requête est terminée, Athena enregistre la table alb_connection_logs, de telle sorte que les données soient prêtes pour que vous puissiez émettre des requêtes.

Création de la table pour les journaux de connexion ALB dans Athena à l'aide de la projection de partitions

Comme les journaux de connexion ALB ont une structure connue dont vous pouvez spécifier le schéma de partition à l'avance, vous pouvez réduire le temps d'exécution des requêtes et automatiser la gestion des partitions en utilisant la fonction de projection de partition Athena. La projection des partitions ajoute automatiquement de nouvelles partitions à mesure que de nouvelles données sont ajoutées. Vous n'avez donc plus besoin d'ajouter manuellement des partitions à l'aide de la commande ALTER TABLE ADD PARTITION.

L'exemple d'CREATE TABLEinstruction suivant utilise automatiquement la projection de partition sur les journaux de connexion ALB à partir d'une date spécifiée jusqu'à aujourd'hui pour une seule AWS région. L'instruction se base sur l'exemple de la section précédente, mais ajoute les clauses PARTITIONED BY et TBLPROPERTIES pour activer la projection de partition. Dans les storage.location.template clauses LOCATION et, remplacez les espaces réservés par des valeurs identifiant l'emplacement du compartiment Amazon S3 de vos journaux de connexion ALB. Pour plus d'informations sur l'emplacement des fichiers journaux de connexion, consultez la section Fichiers journaux de connexion dans le Guide de l'utilisateur des équilibreurs de charge d'application. Pourprojection.day.range, remplacez 2023/01/01 par la date de début que vous souhaitez utiliser. Après avoir exécuté la requête avec succès, vous pouvez interroger la table. Vous n'avez pas besoin d'exécuter ALTER TABLE ADD PARTITION pour charger les partitions. Pour plus d'informations sur chaque champ du fichier journal, consultez la section Entrées du journal des connexions.

CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs ( time string, client_ip string, client_port int, listener_port int, tls_protocol string, tls_cipher string, tls_handshake_latency double, leaf_client_cert_subject string, leaf_client_cert_validity string, leaf_client_cert_serial_number string, tls_verify_status string, conn_trace_id 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]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?') LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.day.type" = "date", "projection.day.range" = "2023/01/01,NOW", "projection.day.format" = "yyyy/MM/dd", "projection.day.interval" = "1", "projection.day.interval.unit" = "DAYS", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}" )

Pour plus d'informations sur la projection de partition, voir Projection de partition avec Amazon Athena.

Exemples de requêtes pour les journaux de connexion ALB

Les requêtes suivantes comptent les occurrences pour lesquelles la valeur de n'tls_verify_statusétait pas'Success', groupées par adresse IP du client :

SELECT DISTINCT client_ip, count() AS count FROM alb_connection_logs WHERE tls_verify_status != 'Success' GROUP BY client_ip ORDER BY count() DESC;

La requête suivante recherche les occurrences pour lesquelles la valeur de tls_handshake_latency était supérieure à 2 secondes dans la plage de temps spécifiée :

SELECT * FROM alb_connection_logs WHERE ( parse_datetime(time, 'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') BETWEEN parse_datetime('2024-01-01-00:00:00', 'yyyy-MM-dd-HH:mm:ss') AND parse_datetime('2024-03-20-00:00:00', 'yyyy-MM-dd-HH:mm:ss') ) AND (tls_handshake_latency >= 2.0);

Ressources supplémentaires