Wie verwende ich Amazon Athena, um meine Amazon-S3-Serverzugriffsprotokolle zu analysieren?

Lesedauer: 6 Minute
0

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:

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

  2. Ö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.

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

Überlegungen und Einschränkungen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr