Comment analyser les journaux d'accès du serveur Amazon S3 à l'aide d'Athena ?

Date de la dernière mise à jour : 16/05/2019

Comment interroger les journaux d'accès du serveur Amazon Simple Storage Service (Amazon S3) dans Amazon Athena ?

Résolution

Amazon S3 stocke les journaux d'accès au serveur en tant qu'objets dans un compartiment S3. Vous pouvez utiliser Athena pour analyser et interroger rapidement les journaux d'accès au serveur S3.

1.    Activez la journalisation des accès au serveur pour un compartiment S3 si vous ne l'avez pas déjà fait. Notez les valeurs pour le compartiment cible et le préfixe cible. Vous aurez besoin des deux pour pouvoir spécifier l'emplacement S3 dans une requête Athena :

s3://awsexamplebucket-logs/prefix

2.    Ouvrez la console Athena.

3.    Dans le Query Editor (Éditeur de requête), exécutez une commande similaire à ce qui suit pour créer une base de données.
Remarque : il est recommandé de créer la base de données dans la même région AWS que celle du compartiment S3.

create database s3_access_logs_db

4.    Dans le Query Editor (Éditeur de requête), exécutez une commande similaire à ce qui suit pour créer un schéma de table dans la base de données que vous avez créée à l'étape 3. Les valeurs de type de données STRING et BIGINT sont les propriétés du journal d'accès. Vous pouvez interroger ces propriétés dans Athena. Pour LOCATION, saisissez le compartiment S3 et le préfixe du chemin de l'étape 1.

CREATE EXTERNAL TABLE IF NOT EXISTS s3_access_logs_db.mybucket_logs(
         BucketOwner STRING,
         Bucket STRING,
         RequestDateTime STRING,
         RemoteIP STRING,
         Requester STRING,
         RequestID STRING,
         Operation STRING,
         Key STRING,
         RequestURI_operation STRING,
         RequestURI_key STRING,
         RequestURI_httpProtoversion STRING,
         HTTPstatus STRING,
         ErrorCode STRING,
         BytesSent BIGINT,
         ObjectSize BIGINT,
         TotalTime STRING,
         TurnAroundTime STRING,
         Referrer STRING,
         UserAgent STRING,
         VersionId STRING,
         HostId STRING,
         SigV STRING,
         CipherSuite STRING,
         AuthType STRING,
         EndPoint STRING,
         TLSVersion STRING
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
         'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$' )
LOCATION 's3://awsexamplebucket-logs/prefix'

5.    Sous Tables dans le volet de gauche, sélectionnez Preview table (Aperçu de la table) dans le bouton de menu situé à côté du nom de la table.

Si les données des journaux d'accès au serveur s'affichent dans la fenêtre Résultats (par exemple, bucketowner, bucket et requestdatetime), cela signifie que vous avez créé la table Athena avec succès. Vous pouvez désormais interroger les journaux d'accès au serveur S3.

Exemples de requêtes

Pour trouver le journal pour un objet supprimé :

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE 
key = 'images/picture.jpg' AND operation like '%DELETE%';

Pour voir quel utilisateur a supprimé un objet et à quel moment (horodatage, adresse IP et utilisateur AWS Identity and Access Management [IAM]) :

SELECT requestdatetime, remoteip, requester, key FROM s3_access_logs_db.mybucket_logs WHERE 
key = 'images/picture.jpg' AND operation like '%DELETE%';

Pour afficher toutes les opérations exécutées par un utilisateur IAM :

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE 
requester='arn:aws:iam::123456789123:user/user_name';

Pour afficher toutes les opérations qui ont été effectuées sur un objet dans un intervalle de temps spécifique :

SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE Key='prefix/images/picture.jpg' AND
parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') 
BETWEEN parse_datetime('2017-02-18:07:00:00','yyyy-MM-dd:HH:mm:ss')
AND
parse_datetime('2017-02-18:08:00:00','yyyy-MM-dd:HH:mm:ss');

Pour afficher la quantité de données transférées par une adresse IP spécifique dans un intervalle de temps spécifique :

SELECT SUM(bytessent) as uploadtotal, 
SUM(objectsize) as downloadtotal, 
SUM(bytessent + objectsize) AS total FROM s3_access_logs_db.mybucket_logs WHERE remoteIP='1.2.3.4' and parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2017-06-01','yyyy-MM-dd') and parse_datetime('2017-07-01','yyyy-MM-dd');

Il est recommandé de créer une stratégie de cycle de vie d'un compartiment S3 pour le compartiment de journaux d'accès au serveur. Configurez la stratégie de cycle de vie pour supprimer régulièrement les fichiers journaux. Cela permet de réduire la quantité de données analysées par Athena pour chaque requête.


Cette page vous a-t-elle été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?