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

上次更新时间:2019 年 5 月 16 日

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

解决方法

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

1.    为您的 S3 存储桶启用服务器访问日志记录(如未启用)。记下目标存储桶目标前缀的值,当在 Athena 查询中指定 S3 位置时,您需要使用这两个值:

s3://awsexamplebucket-logs/prefix

2.    打开 Athena 控制台

3.    在 Query Editor (查询编辑器)中,运行类似于以下内容的命令来创建数据库
注意:最佳实践是在与 S3 存储桶相同的 AWS 区域中创建数据库。

create database s3_access_logs_db

4.    在 Query Editor (查询编辑器) 中,运行类似于以下内容的命令,以在步骤 3 中已创建的数据库中创建表架构。STRINGBIGINT 数据类型值为访问日志属性。您可以在 Athena 中查询这些属性。对于 LOCATION (位置),输入在步骤 1 中记下的 S3 存储桶和前缀路径。

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://awsexamplebucket-logs/prefix'

5.    在左侧窗格中的下,从表名旁边的菜单按钮中选择 Preview table (预览表)

如果您在结果窗口中看到服务器访问日志中的数据(例如 bucketowner存储桶requestdatetime),则说明您已成功创建 Athena 表。现在,您可以查询 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('2017-02-18:07:00:00','yyyy-MM-dd:HH:mm:ss')
AND
parse_datetime('2017-02-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('2017-06-01','yyyy-MM-dd') and parse_datetime('2017-07-01','yyyy-MM-dd');

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


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?