View a markdown version of this page

使用 Amazon S3 服务器访问日志来确定请求 - Amazon Simple Storage Service

使用 Amazon S3 服务器访问日志来确定请求

您可以使用 Amazon S3 服务器访问日志来确定 Amazon S3 请求。

注意
  • 要确定 Amazon S3 请求,建议您使用 AWS CloudTrail 数据事件而不是 Amazon S3 服务器访问日志。CloudTrail 数据事件更易于设置并包含更多信息。有关更多信息,请参阅 使用 CloudTrail 识别 Amazon S3 请求

  • 根据您获得的访问请求数量,与使用 CloudTrail 数据事件相比,分析日志使用的资源或时间可能会更多。

使用 Amazon Athena 查询访问日志中的请求

您可以使用 Amazon Athena 查询 Amazon S3 访问日志以确定 Amazon S3 请求。

Amazon S3 将服务器访问日志作为对象存储在 S3 存储桶中。使用可以分析 Amazon S3 中的日志的工具通常会更轻松。Athena 支持分析 S3 对象,并且可用于查询 Amazon S3 访问日志。

以下示例说明了如何在 Amazon Athena 中查询 Amazon S3 服务器访问日志。将以下示例中使用的 user input placeholders 替换为您自己的信息。

注意

要在 Athena 查询中指定 Amazon S3 位置,您必须提供将日志传输到的存储桶的 S3 URI。此 URI 必须包含以下格式的存储桶名称和前缀:s3://amzn-s3-demo-bucket1-logs/prefix/

  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 在查询编辑器中,运行类似如下的命令。将 s3_access_logs_db 替换为要为数据库指定的名称。

    CREATE DATABASE s3_access_logs_db
    注意

    最佳实践是在与 S3 存储桶所在相同的 AWS 区域中创建数据库。

  3. 在查询编辑器中,运行类似如下的命令以便在步骤 2 中创建的数据库中创建一个表架构。将 s3_access_logs_db.mybucket_logs 替换为要为表指定的名称。STRINGBIGINT 数据类型值是访问日志属性。您可以在 Athena 中查询这些属性。对于 LOCATION,输入之前记下的 S3 存储桶和前缀。

    Date-based partitioning
    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, `sourceregion` 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}')
    Non-date-based partitioning
    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, `sourceregion` 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://amzn-s3-demo-bucket1-logs/prefix/'
  4. 在导航窗格中,在 Database (数据库) 下,请选择您的数据库。

  5. Tables (表) 下,请选择表名称旁边的 Preview table (预览表)

    Results (结果) 窗格中,您应看到来自服务器访问日志中的数据,如 bucketownerbucketrequestdatetime 等。这表示您成功创建了 Athena 表。您现在可以查询 Amazon S3 服务器访问日志。

例— 显示已删除对象的人员和时间(时间戳、IP 地址和 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 coalesce(SUM(bytessent), 0) AS bytessenttotal FROM s3_access_logs_db.mybucket_logs WHERE remoteip='192.0.2.1' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2022-06-01','yyyy-MM-dd') AND parse_datetime('2022-07-01','yyyy-MM-dd');
例— 查找特定时间段内 HTTP 5xx 错误的请求 ID
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'

确定签名版本 2 请求

可以使用访问日志来确定签名版本 2 请求。有关使用 Amazon Athena 查询日志的详细信息,请参阅将日志传输到 Amazon S3 通用存储桶下方的 Athena 查询部分。

确定对象访问请求

您可以使用服务器访问日志来确定对象访问模式。有关使用 Amazon Athena 查询日志的详细信息,请参阅将日志传输到 Amazon S3 通用存储桶下方的 Athena 查询部分。