Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
Come posso usare Amazon Athena per analizzare i log di accesso al server Amazon S3?
Desidero interrogare i log di accesso al server Amazon Simple Storage Service (Amazon S3) in Amazon Athena.
Soluzione
Amazon S3 archivia i log di accesso al server come oggetti in un bucket S3.
Prerequisito:
Per i log archiviati nel bucket Amazon S3, definisci il partizionamento basato su data per la struttura S3. Nel seguente esempio di risoluzione, la tabella è una tabella partizionata e la colonna partizionata è il timestamp. Per la tua posizione S3, includi una struttura di cartelle (/AAAA/MM/GG) da associare alla colonna timestamp.
Per utilizzare Athena per analizzare i log di accesso al server di query S3, completa i seguenti passaggi:
-
Attiva la registrazione degli accessi al server del bucket S3, se non l'hai già fatto. Annota i valori di Bucket di destinazione e Prefisso di destinazione. Sono necessari entrambi per specificare la posizione di Amazon S3 in una query Athena.
Nota: per il formato della chiave dell'oggetto di log, scegli il partizionamento basato sulla data per velocizzare le applicazioni di analisi e interrogazione. -
Apri la console Amazon Athena.
Nota: prima di eseguire la prima query, è necessario impostare una posizione per i risultati della query in Amazon S3. -
Nell'Editor di query, esegui un'istruzione DDL per creare un database.
Nota: è consigliabile creare il database nella stessa Regione AWS del bucket S3.create database s3_access_logs_db
-
Crea uno schema di tabella nel database. Nell'esempio seguente, i valori dei tipi di dati STRING e BIGINT sono le proprietà del log di accesso. È possibile eseguire una query di queste proprietà in Athena. In LOCATION, inserisci il bucket S3 e il percorso del prefisso del Passaggio 1. Assicurati di includere una barra (/) alla fine del prefisso (ad esempio s3://doc-example-bucket/prefix/). Se non usi un prefisso, includi una barra (/) alla fine del nome del bucket, ad esempio 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}')
-
Nel riquadro a sinistra, in Tabelle, scegli i puntini accanto al nome della tabella, quindi scegli Anteprima tabella. Se visualizzi i dati dei log di accesso al server nella finestra Risultati, la tabella Athena è stata creata correttamente. I dati contengono valori come bucketowner, bucket_name e requestdatetime.
Query di esempio
Per trovare la richiesta per un oggetto eliminato, utilizza la seguente query:
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
Per mostrare gli ID di richiesta Amazon S3 per le richieste che hanno provocato errori 403 Accesso negato, utilizza la seguente query:
SELECT requestdatetime, requester, operation, requestid, hostid FROM s3_access_logs_db.mybucket_logs WHERE httpstatus = '403';
Per trovare gli ID di richiesta Amazon S3 per gli errori HTTP 5xx in un periodo di tempo specifico con la chiave e il codice di errore, esegui la seguente query:
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'
Per mostrare chi ha eliminato un oggetto e quando, con il timestamp, l'indirizzo IP e il ruolo di AWS Identity and Access Management (IAM), utilizza la seguente query:
SELECT requestdatetime, remoteip, requester, key FROM s3_access_logs_db.mybucket_logs WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
Per mostrare tutte le operazioni eseguite da un ruolo IAM, usa la seguente query:
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE requester='arn:aws:iam::123456789123:user/user_name';
Per mostrare tutte le operazioni eseguite su un oggetto in un periodo di tempo specifico, utilizza la seguente query:
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE Key='prefix/images/picture.jpg' AND timestamp BETWEEN '2024/01/29' AND '2024/01/30'
Per mostrare quanti dati sono stati trasferiti a un indirizzo IP in un periodo di tempo specifico, utilizza la seguente query:
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'
Per mostrare tutte le operazioni di scadenza eseguite dalle regole del ciclo di vita in un periodo di tempo specifico, utilizza la seguente query:
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE operation = 'S3.EXPIRE.OBJECT' AND timestamp BETWEEN '2024/01/29' AND '2024/01/30'
Per contare il numero di oggetti scaduti in un periodo di tempo specifico, utilizza la seguente query:
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'
Per mostrare tutte le operazioni di transizione eseguite dalle regole del ciclo di vita in un periodo di tempo specifico, utilizza la seguente query:
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE operation like 'S3.TRANSITION%' AND timestamp BETWEEN '2024/01/29' AND '2024/01/30'
Per mostrare tutti i richiedenti raggruppati da Signature Version, utilizza la seguente query:
SELECT requester, Sigv, Count(Sigv) as SigCount FROM s3_access_logs_db.mybucket_logs GROUP BY requester, Sigv;
Per mostrare tutti i richiedenti anonimi che hanno effettuato richieste in un periodo di tempo specifico, utilizza la seguente query:
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'
Per mostrare tutti i richiedenti che hanno inviato richieste di oggetti PUT in un periodo di tempo specifico, utilizza la seguente query:
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'
Per mostrare tutti i richiedenti che hanno inviato richieste di oggetti GET in un periodo di tempo specifico, utilizza la seguente query:
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'
Per mostrare tutti i richiedenti, ordinati in base al tempo di consegna più elevato in un periodo di tempo specifico, utilizza la seguente query:
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;
Nota: poiché il numero di oggetti all'interno dei bucket S3 aumenta nel tempo, le query elaboreranno più dati. È consigliabile creare una policy del ciclo di vita per il bucket dei log di accesso al server. Configura la policy del ciclo di vita per rimuovere periodicamente i file di log. Questa policy riduce la quantità di dati che Athena analizza per ogni query.
Informazioni correlate
Analyzing Amazon S3 server access logs using Amazon OpenSearch Service
Amazon S3 server access log format
Video correlati


Contenuto pertinente
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 9 mesi fa