Wie analysiere ich meine Amazon S3-Serverzugriffsprotokolle mit Athena?

Lesedauer: 5 Minute
0

Ich möchte die Serverzugriffsprotokolle von Amazon Simple Storage Service (Amazon S3) in Amazon Athena abfragen.

Behebung

Amazon S3 speichert Serverzugriffsprotokolle als Objekte in einem S3-Bucket. Verwenden Sie Athena, um Serverzugriffsprotokolle schnell zu analysieren und abzufragen.

1.    Aktivieren Sie die Serverzugriffsprotokollierung für Ihren S3-Bucket, falls Sie dies noch nicht getan haben. Notieren Sie sich die Werte für Target-Bucket und Target-Präfix. Sie benötigen beide, um den Amazon S3-Speicherort in einer Athena-Abfrage anzugeben.

2.    Öffnen Sie die Amazon Athena-Konsole. Möglicherweise müssen Sie das Athena-Setup zum ersten Mal durchführen, bevor Sie Ihre erste Abfrage ausführen.

3.    Führen Sie im Abfrage-Editor eine DDL-Anweisung aus, um eine Datenbank zu erstellen. Es hat sich bewährt, die Datenbank in derselben AWS-Region wie der des S3-Bucket zu erstellen.

create database s3_access_logs_db

4.    Erstellen Sie ein Tabellenschema in der Datenbank. Im folgenden Beispiel sind die Datentypwerte STRING und BIGINT die Eigenschaften des Zugriffsprotokolls. Sie können diese Eigenschaften in Athena abfragen. Geben Sie für LOCATION den S3-Bucket und den Präfixpfad aus Schritt 1 ein. Achten Sie darauf, am Ende des Präfixes einen Schrägstrich (/) einzufügen (z. B. s3://doc-example-bucket/prefix/). Wenn Sie kein Präfix verwenden, fügen Sie am Ende des Bucket-Namens einen Schrägstrich (/) ein (z. B. 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)
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://awsexamplebucket1-logs/prefix/'

5.    Wählen Sie im linken Bereich unter Tabellen die Option Tabellenvorschau aus der Menüschaltfläche neben dem Tabellennamen aus. Wenn Sie im Ergebnisfenster Daten aus den Serverzugriffsprotokollen sehen, haben Sie die Athena-Tabelle erfolgreich erstellt. Die Daten sehen aus wie Werte wie bucketowner, bucket_name und requestdatetime. Sie können jetzt die Amazon S3-Serverzugriffsprotokolle abfragen.

Beispielabfragen

Verwenden Sie die folgende Abfrage, um die Anfrage für ein gelöschtes Objekt zu finden:

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

Verwenden Sie die folgende Abfrage, um Amazon S3-Anforderungs-IDs für Anfragen anzuzeigen, die zu 403 Access Denied-Fehlern geführt haben:

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

Führen Sie die folgende Abfrage aus, um Amazon S3-Anforderungs-IDs für HTTP 5xx-Fehler in einem bestimmten Zeitraum (einschließlich Schlüssel und Fehlercode) zu finden:

SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid
FROM s3_access_logs_db.mybucket_logsWHERE httpstatus like '5%'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-09-18 07:00:00'
AND timestamp '2021-09-18 08:00:00'

Verwenden Sie die folgende Abfrage, um zu zeigen, wer wann ein Objekt gelöscht hat, einschließlich Zeitstempel, IP-Adresse und AWS Identity and Access Management (IAM)-Rolle:

SELECT requestdatetime, remoteip, requester, key
FROM s3_access_logs_db.mybucket_logs
WHERE key = 'images/picture.jpg'
AND operation like '%DELETE%';

Verwenden Sie die folgende Abfrage, um alle Operationen anzuzeigen, die von einer IAM-Rolle ausgeführt wurden:

SELECT \* FROM s3\_access\_logs\_db.mybucket\_logs
WHERE requester='arn:aws:iam::123456789123:user/user\_name';

Verwenden Sie die folgende Abfrage, um alle Operationen anzuzeigen, die in einem bestimmten Zeitraum an einem Objekt ausgeführt wurden:

SELECT *FROM s3_access_logs_db.mybucket_logsWHERE Key='prefix/images/picture.jpg'     
AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z')    
BETWEEN timestamp '2021-09-18 07:00:00'    
AND timestamp '2021-09-18 08:00:00'

Verwenden Sie die folgende Abfrage, um zu zeigen, wie viele Daten in einem bestimmten Zeitraum an eine IP-Adresse übertragen wurden:

SELECT coalesce(SUM(bytessent), 0) AS bytessentTOTAL,
FROM s3_access_logs_db.mybucket_logs
WHERE RemoteIP='1.2.3.4'AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2020-01-01'
AND timestamp '2024-01-01'

Verwenden Sie die folgende Abfrage, um alle Ablaufvorgänge anzuzeigen, die nach Lebenszyklusregeln in einem bestimmten Zeitraum ausgeführt wurden:

SELECT *FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-09-18 00:00:00'
AND timestamp '2021-09-19 00:00:00'

Verwenden Sie die folgende Abfrage, um die Anzahl der Objekte zu zählen, die in einem bestimmten Zeitraum abgelaufen sind:

SELECT count(*) as ExpireCount
FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-09-18 00:00:00'
AND timestamp '2021-09-19 00:00:00'

Verwenden Sie die folgende Abfrage, um alle Übergangsvorgänge anzuzeigen, die anhand von Lebenszyklusregeln in einem bestimmten Zeitraum ausgeführt wurden:

SELECT \* FROM s3\_access\_logs\_db.mybucket\_logs
WHERE operation like 'S3.TRANSITION%'
AND parse\_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-09-18 00:00:00'
AND timestamp '2021-09-19 00:00:00'

Verwenden Sie die folgende Abfrage, um alle Anforderer gruppiert nach Signaturversion anzuzeigen:

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

Verwenden Sie die folgende Abfrage, um alle anonymen Anforderer anzuzeigen, die in einem bestimmten Zeitraum Anfragen stellen:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE requester IS NULL AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-07-01 00:42:42'
AND timestamp '2021-07-02 00:42:42'

Verwenden Sie die folgende Abfrage, um alle Anforderer anzuzeigen, die in einem bestimmten Zeitraum PUT-Objektanfragen senden:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.PUT.OBJECT'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-07-01 00:42:42'
AND timestamp '2021-07-02 00:42:42'

Verwenden Sie die folgende Abfrage, um alle Anforderer anzuzeigen, die in einem bestimmten Zeitraum GET-Objektanfragen senden:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.GET.OBJECT'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-07-01 00:42:42'
AND timestamp '2021-07-02 00:42:42'

Verwenden Sie die folgende Abfrage, um alle Anforderer anzuzeigen (sortiert nach der höchsten Bearbeitungszeit in einem bestimmten Zeitraum):

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE NOT turnaroundtime='-'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN timestamp '2021-07-01 00:42:42'
AND timestamp '2021-07-02 00:42:42'
ORDER BY CAST(turnaroundtime AS INT) DESC;

Es hat sich bewährt, eine Lebenszyklusrichtlinie für Ihren Serverzugriffsprotokoll-Bucket zu erstellen. Konfigurieren Sie die Lebenszyklusrichtlinie so, dass Protokolldateien regelmäßig entfernt werden. Dies reduziert die Datenmenge, die Athena für jede Abfrage analysiert.

Weitere Informationen

Analysieren von Amazon S3-Serverzugriffsprotokollen mithilfe von Amazon OpenSearch Service

Format des Amazon S3-Serverzugriffsprotokolls

Abfragen von AWS-Serviceprotokollen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 8 Monaten