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. Folgen Sie diesen Schritten, um Athena zur Analyse und S3-Abfrage von Serverzugriffsprotokollen 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, 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, müssen Sie möglicherweise einen Speicherort für Abfrageergebnisse in Amazon S3 einrichten.

  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 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-Server-Zugriffsprotokolle 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-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 von Zeitstempel, IP-Adresse und AWS IAM (Identity and Access Management)-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_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 abgelaufenen Vorgä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 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 Übergangsvorgänge anzuzeigen, die nach 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 dann mehr Daten. Es hat sich bewährt, eine Lebenszyklusrichtlinie für Ihren Server-Zugriffsprotokoll-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.

Ähnliche Informationen

Analysieren von Amazon-S3-Server-Zugriffsprotokollen mithilfe von Amazon OpenSearch Service

Format des Amazon-S3-Server-Zugriffsprotokolls

Abfragen von AWS-Service-Protokollen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Monaten