如何使用 Athena 分析我的 Amazon S3 服务器访问日志?

上次更新日期:2020 年 10 月 7 日

如何在 Amazon Athena 中查询 Amazon Simple Storage Service (Amazon S3) 服务器访问日志?

解决方法

Amazon S3 将服务器访问日志作为对象存储在 S3 存储桶中。您可以使用 Athena 快速分析和查询服务器访问日志。

1.    为您的 S3 存储桶启用服务器访问日志记录(如果尚未启用的话)。记下目标存储桶目标前缀的值 - 您需要这两个值才能在 Athena 查询中指定 Amazon S3 位置。

2.    打开 Athena 控制台

3.    在查询编辑器中,运行 DDL 语句以创建数据库 最好在与 S3 存储桶相同的区域中创建数据库。

create database s3_access_logs_db

4.    在数据库中创建表架构。在以下示例中,STRING BIGINT 数据类型值是访问日志属性。您可以在 Athena 中查询这些属性。对于位置,输入步骤 1 中的 S3 存储桶和前缀路径。请确保在前缀末尾包含一个正斜杠 (/)(例如 s3://doc-example-bucket/prefix/)。

CREATE EXTERNAL TABLE IF NOT EXISTS s3_access_logs_db.mybucket_logs(
         BucketOwner STRING,
         Bucket STRING,
         RequestDateTime STRING,
         RemoteIP STRING,
         Requester STRING,
         RequestID STRING,
         Operation STRING,
         Key STRING,
         RequestURI_operation STRING,
         RequestURI_key STRING,
         RequestURI_httpProtoversion 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 (
         'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$' )
LOCATION 's3://doc-example-bucket/prefix/'

5.    在左侧窗格中的 Tables (表)下,从表名称旁边的菜单按钮中选择 Preview table(预览表)。如果您在 Results(结果)窗口中看到服务器访问日志中的数据(例如 bucketownerbucketrequestdatetime),您已成功创建了 Athena 表。您现在可以查询 Amazon S3 服务器访问日志。

示例查询

查找已删除对象的日志:

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

显示谁删除了对象以及何时删除,包括时间戳、IP 地址和 AWS Identity and Access Management (IAM) 用户:

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

显示 IAM 用户执行的所有操作:

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE 
requester='arn:aws:iam::123456789123:user/user_name';

显示在特定时间段内对对象执行的所有操作:

SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE Key='prefix/images/picture.jpg' AND
parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') 
BETWEEN parse_datetime('2020-09-18:07:00:00','yyyy-MM-dd:HH:mm:ss')
AND
parse_datetime('2020-09-18:08:00:00','yyyy-MM-dd:HH:mm:ss');

显示特定时间段内特定 IP 地址传输的数据量:

SELECT SUM(bytessent) as uploadtotal, 
SUM(objectsize) as downloadtotal, 
SUM(bytessent + objectsize) AS total 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 parse_datetime('2020-07-01','yyyy-MM-dd') and parse_datetime('2020-08-01','yyyy-MM-dd');

为服务器访问日志存储桶创建生命周期策略是最佳做法。配置生命周期策略以定期删除日志文件。这样做可以减少 Athena 为每个查询分析的数据量。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?