Come posso usare Amazon Athena per analizzare i log di accesso al server Amazon S3?

6 minuti di lettura
0

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:

  1. 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.

  2. Apri la console Amazon Athena.
    Nota: prima di eseguire la prima query, è necessario impostare una posizione per i risultati della query in Amazon S3.

  3. 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
  4. 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}')
  5. 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

Querying AWS service logs

Querying access logs for requests by using Amazon Athena

Considerations and limitations

AWS UFFICIALE
AWS UFFICIALEAggiornata 10 mesi fa