本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Lightsail 中使用亚马逊 Athena 分析存储桶访问日志
在本指南中,我们向您介绍如何使用访问日志确定对存储桶所做的请求。有关更多信息,请参阅存储桶访问日志。
内容
使用 Amazon Athena 查询请求的访问日志
您可以使用 Amazon Athena 查询和确定对访问日志中的存储桶所做的请求。
Lightsail 将访问日志作为对象存储在 Lightsail 存储桶中。使用可以分析日志的工具通常会更轻松。Athena 支持分析对象,并且可用于查询访问日志。
示例
以下示例展示了如何在 Amazon Athena 中查询存储桶服务器访问日志。
注意
要在 Athena 查询中指定存储桶位置,您需要将日志的目标存储桶名称和目标前缀格式化为 URI S3,如下所示:s3://
amzn-s3-demo-bucket1
-logs/prefix/
-
从 https://console.aws.amazon.com/athena/
打开 Athena 控制台。 -
在查询编辑器中,运行类似如下的命令。
create database bucket_access_logs_db
注意
最佳做法是在与 S3 存储桶 AWS 区域 相同的地方创建数据库。
-
在查询编辑器中,运行类似如下的命令以便在步骤 2 中创建的数据库中创建一个表架构。
STRING
和BIGINT
数据类型值是访问日志属性。您可以在 Athena 中查询这些属性。对于LOCATION
,请输入之前记下的存储桶和前缀。CREATE EXTERNAL TABLE `s3_access_logs_db.amzn-s3-demo-bucket_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://amzn-s3-demo-bucket1-logs/prefix/
' -
在导航窗格中,在 Database (数据库) 下,请选择您的数据库。
-
在 Tables (表) 下,请选择表名称旁边的 Preview table (预览表)。
在 Results (结果) 窗格中,您应看到来自服务器访问日志中的数据,如
bucketowner
、bucket
、requestdatetime
等。这表示您成功创建了 Athena 表。您现在可以查询存储桶服务器访问日志。
示例-显示谁删除了对象以及何时删除了对象(时间戳、IP 地址和IAM用户)
SELECT RequestDateTime, RemoteIP, Requester, Key FROM s3_access_logs_db.amzn-s3-demo-bucket_logs WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
示例-显示IAM用户执行的所有操作
SELECT * FROM s3_access_logs_db.amzn-s3-demo-bucket_logs WHERE requester='arn:aws:iam::123456789123:user/user_name';
示例 — 显示在特定时间段内对对象执行的所有操作
SELECT * FROM s3_access_logs_db.amzn-s3-demo-bucket_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.amzn-s3-demo-bucket_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');
使用 Amazon S3 访问日志确定对象访问请求
您可以使用访问日志查询来识别对象访问请求(例如GET、和)PUTDELETE,并发现有关这些请求的更多信息。
以下 Amazon Athena 查询示例说明了如何从服务器访问日志中获取存储桶的所有 PUT
对象请求。
示例-显示在特定时间段内发送PUT对象请求的所有请求者
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db WHERE Operation='REST.PUT.OBJECT' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
以下 Amazon Athena 查询示例显示了如何从服务器访问日志中获取 Amazon S3 GET 的所有对象请求。
示例-显示在特定时间段内发送GET对象请求的所有请求者
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db WHERE Operation='REST.GET.OBJECT' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
以下 Amazon Athena 查询示例说明了如何从服务器访问日志中获取向 S3 存储桶发出的所有匿名请求。
示例 — 显示在特定时间段内向存储桶发出请求的所有匿名请求者
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db.amzn-s3-demo-bucket_logs WHERE Requester IS NULL AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
注意
-
您可以修改日期范围,以满足您的需要。
-
也可以使用这些查询示例进行安全监控。您可以查看意外或未经授权的 IP 地址/请求者的
PutObject
或GetObject
调用结果,以及确定向桶发出的任何匿名请求。 -
此查询仅从启用了日志记录的时间检索信息。