Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Comment puis-je utiliser Amazon Athena pour analyser les journaux d’accès à mon serveur Amazon S3 ?
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.
Prérequis :
Pour les journaux stockés dans votre compartiment Amazon S3, définissez un partitionnement selon la date pour votre structure S3. Dans l’exemple de résolution suivant, la table est partitionnée et la colonne partitionnée est horodatée. Pour votre emplacement S3, incluez une structure de dossier (AAAA-MM-JJ) à mapper à la colonne d’horodatage.
Pour utiliser Athena afin d’analyser les journaux d’accès au serveur de requêtes S3, procédez comme suit :
-
Activez la journalisation des accès au serveur pour le compartiment S3, si ce n’est pas déjà fait. Notez les valeurs Compartiment cible et Préfixe cible. Vous avez besoin des deux valeurs 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. -
Ouvrez la console Amazon Athena.
Remarque : avant d’exécuter votre première requête, configurez l’emplacement des résultats de la requête dans Amazon S3. -
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
-
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}')
-
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, alors vous avez réussi à créer la table Athena. Les données contiennent des valeurs comme bucketowner, bucket_name et requestdatetime.
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, avec l’horodatage, l’adresse IP et le rôle AWS Identity and Access Management (IAM), 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 donnée, 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 : le nombre d’objets dans les compartiments S3 augmente au fil du temps. Par conséquent, 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 politique réduit la quantité de données qu’Athena analyse 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
Interroger les journaux d’accès pour les demandes à l’aide d’Amazon Athena
Vidéos associées


Contenus pertinents
- demandé il y a 10 moislg...
- demandé il y a 2 anslg...
- demandé il y a 3 moislg...
- demandé il y a 4 moislg...
- AWS OFFICIELA mis à jour il y a 18 jours
- AWS OFFICIELA mis à jour il y a 10 mois