Wie verwende ich Amazon Athena, um meine Amazon-S3-Serverzugriffsprotokolle zu analysieren?
Ich möchte die Serverzugriffsprotokolle von Amazon Simple Storage Service (Amazon S3) in Amazon Athena abfragen.
Behebung
Amazon S3 speichert Server-Zugriffsprotokolle als Objekte in einem S3-Bucket.
Voraussetzung:
Definieren Sie für die in Ihrem Amazon-S3-Bucket gespeicherten Protokolle eine datumsbasierte Partitionierung für Ihre S3-Struktur. Im folgenden Lösungsbeispiel ist die Tabelle eine partitionierte Tabelle und die partitionierte Spalte ist ein Zeitstempel. Fügen Sie für Ihren S3-Standort eine Ordnerstruktur (/YYY/MM/DD) hinzu, die der Zeitstempelspalte zugeordnet werden soll.
Gehen Sie wie folgt vor, um Athena zur Analyse von S3-Abfrageserverzugriffsprotokollen zu verwenden:
-
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 Werte, um den Amazon-S3-Speicherort in einer Athena-Abfrage anzugeben.
**Hinweis:**Wählen Sie für das Schlüsselformat für Protokollobjekte die datumsbasierte Partitionierung aus, um Analysen und Abfrageanwendungen zu beschleunigen. -
Öffnen Sie die Amazon-Athena-Konsole.
Hinweis: Bevor Sie Ihre erste Abfrage ausführen, richten Sie einen Speicherort für Abfrageergebnisse in Amazon S3 ein. -
Führen Sie im Query Editor eine DDL-Anweisung aus, um eine Datenbank zu erstellen.
Hinweis: Es hat sich bewährt, die Datenbank in derselben AWS-Region wie den S3-Bucket zu erstellen.create database s3_access_logs_db
-
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 keinen 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, `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}')
-
Wählen Sie im linken Bereich unter Tabellen die Ellipse neben dem Tabellennamen aus, und wählen Sie dann Tabellenvorschau aus. Wenn Sie im Fenster Ergebnisse Daten aus den Serverzugriffsprotokollen sehen, haben Sie die Athena-Tabelle erfolgreich erstellt. Die Daten enthalten Werte wie bucketowner, bucket_name und requestdatetime.
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-Anfrage-IDs für Anfragen anzuzeigen, die zu Fehlern vom Typ 403 Access Denied geführt haben:
SELECT requestdatetime, requester, operation, requestid, hostid FROM s3_access_logs_db.mybucket_logs WHERE httpstatus = '403';
Verwenden Sie die folgende Abfrage, um Amazon-S3-Anfrage-IDs für Fehler vom Typ HTTP 5xx 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_logs WHERE httpstatus like '5%'AND timestamp BETWEEN '2024/01/29' AND '2024/01/30'
Verwenden Sie die folgende Abfrage, um anzuzeigen, wer wann ein Objekt gelöscht hat, einschließlich des Zeitstempels, der IP-Adresse und der 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 eine IAM-Rolle ausführt:
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_logs WHERE Key='prefix/images/picture.jpg' AND timestamp BETWEEN '2024/01/29' AND '2024/01/30'
Verwenden Sie die folgende Abfrage, um anzuzeigen, 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 timestamp BETWEEN '2024/01/29' AND '2024/01/30'
Verwenden Sie die folgende Abfrage, um alle Ablaufvorgänge anzuzeigen, die von Lebenszyklusregeln in einem bestimmten Zeitraum ausgeführt wurden:
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE operation = 'S3.EXPIRE.OBJECT' AND timestamp BETWEEN '2024/01/29' AND '2024/01/30'
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 timestamp BETWEEN '2024/01/29' AND '2024/01/30'
Verwenden Sie die folgende Abfrage, um alle Übergangsoperationen anzuzeigen, die von Lebenszyklusregeln in einem bestimmten Zeitraum ausgeführt wurden:
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE operation like 'S3.TRANSITION%' AND timestamp BETWEEN '2024/01/29' AND '2024/01/30'
Verwenden Sie die folgende Abfrage, um alle Anforderer nach Signaturversion gruppiert anzuzeigen:
SELECT requester, Sigv, Count(Sigv) as SigCount FROM s3_access_logs_db.mybucket_logs GROUP 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 timestamp BETWEEN '2024/01/29' AND '2024/01/30'
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 timestamp BETWEEN '2024/01/29' AND '2024/01/30'
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 timestamp BETWEEN '2024/01/29' AND '2024/01/30'
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 timestamp BETWEEN '2024/01/29' AND '2024/01/30' ORDER BY CAST(turnaroundtime AS INT) DESC;
Hinweis: Da die Anzahl der Objekte in S3-Buckets mit der Zeit zunimmt, verarbeiten Abfragen mit der Zeit auch mehr Daten. Es ist eine bewährte Methode, eine Lebenszyklusrichtlinie für Ihren Server-Zugriffsprotokoll-Bucket zu erstellen. Konfigurieren Sie die Lebenszyklusrichtlinie so, dass Protokolldateien regelmäßig entfernt werden. Diese Richtlinie reduziert die Datenmenge, die Athena für jede Abfrage analysiert.
Ähnliche Informationen
Analysieren von Amazon-S3-Server-Zugriffsprotokollen mithilfe von Amazon OpenSearch Service
Format des Amazon-S3-Server-Zugriffsprotokolls
Abfragen von AWS-Service-Protokollen
Abfragen von Zugriffsprotokollen für Anfragen mithilfe von Amazon Athena

Relevanter Inhalt
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor 10 Monaten
- AWS OFFICIALAktualisiert vor 4 Jahren