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

上次更新日期:2021 年 2 月 9 日

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

解决方法

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

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

2.    打开 Amazon Athena 控制台

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

create database s3_access_logs_db

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

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

5.    在左侧窗格中的下,从表名称旁边的菜单按钮中选择预览表。如果您在结果窗口中看到服务器访问日志中的数据 (例如 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 为每个查询分析的数据量。


这篇文章对您有帮助吗?


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