Comment puis-je utiliser Amazon Athena pour analyser les journaux d’accès à mon serveur Amazon S3 ?

Lecture de 6 minute(s)
0

Je souhaite interroger les journaux d’accès au serveur Amazon Simple Storage Service (Amazon S3) dans Amazon Athena.

Résolution

Amazon S3 stocke les journaux d’accès au serveur sous forme d’objets dans un compartiment S3. Suivez ces étapes afin d’utiliser Athena pour analyser et interroger les journaux d’accès au serveur S3.

  1. Activez la journalisation des accès au serveur pour le compartiment S3, si ce n’est pas déjà fait. Prenez note des valeurs Compartiment cible et Préfixe cible. Vous avez besoin des deux pour spécifier un emplacement Amazon S3 dans une requête Athena.
    Remarque : pour le format de clé d’objet journal, choisissez le partitionnement basé sur la date afin d’accélérer les applications d’analyse et de requête.

  2. Ouvrez la console Amazon Athena.
    Remarque : avant d’exécuter votre première requête, il peut être nécessaire de configurer un emplacement pour les résultats de requête dans Amazon S3.

  3. Dans l’Éditeur de requêtes, exécutez une instruction DDL 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. Créez un schéma de table dans la base de données. Dans l’exemple suivant, les valeurs des types de données STRING et BIGINT correspondent aux propriétés du journal d’accès. Vous pouvez interroger ces propriétés dans Athena. Dans EMPLACEMENT, saisissez le compartiment S3 et le chemin du préfixe obtenus à l’étape 1. Veillez à inclure une barre oblique (/) à la fin du préfixe (par exemple, s3://doc-example-bucket/prefix/). Si vous n’utilisez pas de préfixe, insérez une barre oblique (/) à la fin du nom du compartiment (par exemple, s3://doc-example-bucket/).

    CREATE EXTERNAL TABLE s3_access_logs_db.mybucket_logs(
     `bucketowner` STRING,
     `bucket_name` STRING,
     `requestdatetime` STRING,
     `remoteip` STRING,
     `requester` STRING,
     `requestid` STRING,
     `operation` STRING,
     `key` STRING,
     `request_uri` 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,
     `accesspointarn` STRING,
     `aclrequired` STRING)
     PARTITIONED BY (
       `timestamp` string)
    ROW FORMAT SERDE
     'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
     'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$')
    STORED AS INPUTFORMAT
     'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION
     's3://bucket-name/prefix-name/account-id/region/source-bucket-name/'
     TBLPROPERTIES (
      'projection.enabled'='true',
      'projection.timestamp.format'='yyyy/MM/dd',
      'projection.timestamp.interval'='1',
      'projection.timestamp.interval.unit'='DAYS',
      'projection.timestamp.range'='2024/01/01,NOW',
      'projection.timestamp.type'='date',
      'storage.location.template'='s3://bucket-name/prefix-name/account-id/region/source-bucket-name/${timestamp}')
  5. Dans le volet de gauche, sous Tables, sélectionnez les points de suspension qui se trouvent à côté du nom de la table, puis choisissez Aperçu de la table. Si les données issues des journaux d’accès au serveur s’affichent dans la fenêtre Résultats, la table Athena a été correctement créée. Les données ressemblent à des valeurs de type bucketowner, bucket_name et requestdatetime.

Vous pouvez désormais interroger les journaux d’accès au serveur Amazon S3.

Exemples de requêtes

Pour trouver la demande relative à un objet supprimé, utilisez la requête suivante :

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

Pour afficher les ID de demandes Amazon S3 concernant des demandes ayant entraîné l’erreur 403 Accès refusé, utilisez la requête suivante :

SELECT requestdatetime, requester, operation, requestid, hostid FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus = '403';

Pour trouver les ID de demandes Amazon S3 concernant des erreurs HTTP 5xx survenues au cours d’une période spécifique (avec notamment la clé et le code d’erreur), utilisez la requête suivante :

SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid FROM s3_access_logs_db.mybucket_logs WHERE httpstatus like '5%'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour savoir qui a supprimé un objet et quand (horodatage, adresse IP et rôle IAM inclus), utilisez la requête suivante :

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 effectuées par un rôle IAM, utilisez la requête suivante :

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

Pour afficher toutes les opérations effectuées sur un objet au cours d’une période donnée, utilisez la requête suivante :

SELECT *FROM s3_access_logs_db.mybucket_logs WHERE Key='prefix/images/picture.jpg'  AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour afficher la quantité de données transférées vers une adresse IP au cours d’une période donnée, utilisez la requête suivante :

SELECT coalesce(SUM(bytessent), 0) AS bytessentTOTAL
FROM s3_access_logs_db.mybucket_logs
WHERE RemoteIP='1.2.3.4'AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour afficher toutes les opérations d’expiration effectuées selon les règles de cycle de vie au cours d’une période spécifique, utilisez la requête suivante :

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE operation = 'S3.EXPIRE.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour compter le nombre d’objets ayant expiré au cours d’une période donnée, utilisez la requête suivante :

SELECT count(*) as ExpireCount FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour afficher toutes les opérations de transition effectuées selon les règles de cycle de vie au cours d’une période donnée, utilisez la requête suivante :

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE operation like 'S3.TRANSITION%'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour afficher tous les demandeurs regroupés par Signature Version, utilisez la requête suivante :

SELECT requester, Sigv, Count(Sigv) as SigCount
FROM s3_access_logs_db.mybucket_logs
GROUP BY requester, Sigv;

Pour afficher tous les demandeurs anonymes ayant effectué des demandes au cours d’une période donnée, utilisez la requête suivante :

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE requester IS NULL AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour afficher tous les demandeurs ayant envoyé des demandes d’objets PUT au cours d’une période donnée, utilisez la requête suivante :

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.PUT.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour afficher tous les demandeurs ayant envoyé des demandes d’objets GET au cours d’une période donnée, utilisez la requête suivante :

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.GET.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Pour afficher tous les demandeurs, classés en fonction du plus long délai de traitement au cours d’une période donnée, utilisez la requête suivante :

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE NOT turnaroundtime='-'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'
ORDER BY CAST(turnaroundtime AS INT) DESC;

Remarque : étant donné que le nombre d’objets dans les compartiments S3 augmente au fil du temps, les requêtes devront alors traiter davantage de données. Il est recommandé de créer une politique de cycle de vie pour le compartiment des journaux d’accès à votre serveur. Configurez cette politique de cycle de vie pour qu’elle supprime régulièrement les fichiers journaux. Cette opération permettra de réduire la quantité de données qu’Athena doit analyser pour chaque requête.

Informations connexes

Analyse des journaux d’accès au serveur Amazon S3 à l’aide d’Amazon OpenSearch Service

Format des journaux d’accès au serveur Amazon S3

Interrogation des journaux de service AWS

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 8 mois
Aucun commentaire