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. Per utilizzare Athena per analizzare e interrogare il server S3, segui questi passaggi.

  1. Attiva la registrazione degli accessi al server per il bucket S3, se non l'hai già fatto. Prendi nota dei valori per il Bucket di destinazione e il 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, potrebbe essere 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 assomigliano a valori come bucketowner, bucket_name e requestdatetime.

Ora puoi interrogare i log di accesso al server Amazon S3.

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, utilizza 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. In questo modo, sarà possibile ridurre 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

AWS UFFICIALE
AWS UFFICIALEAggiornata 4 mesi fa