

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Lightsail 中使用亚马逊 Athena 分析存储桶访问日志
<a name="amazon-lightsail-using-bucket-access-logs"></a>

在本指南中，我们向您介绍如何使用访问日志确定对存储桶所做的请求。有关更多信息，请参阅[存储桶访问日志](amazon-lightsail-bucket-access-logs.md)。

**内容**
+ [使用 Amazon Athena 查询请求的访问日志](#querying-access-logs-for-requests)
+ [使用 Amazon S3 访问日志确定对象访问请求](#identifying-object-access-requests)

## 使用 Amazon Athena 查询请求的访问日志
<a name="querying-access-logs-for-requests"></a>

您可以使用 Amazon Athena 查询和确定对访问日志中的存储桶所做的请求。

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

**示例**

以下示例展示了如何在 Amazon Athena 中查询存储桶服务器访问日志。

**注意**  
要在 Athena 查询中指定存储桶位置，您需要格式化目标 存储桶名称和目标前缀，其中日志以 S3 URI 形式传递，如下所示：`s3://amzn-s3-demo-bucket1-logs/prefix/`

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) 打开 Athena 控制台。

1. 在**查询编辑器**中，运行类似如下的命令。

   ```
   create database bucket_access_logs_db
   ```
**注意**  
最佳做法是在与 S3 存储桶 AWS 区域 相同的地方创建数据库。

1. 在**查询编辑器**中，运行类似如下的命令以便在步骤 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/'
   ```

1. 在导航窗格中，在 **Database (数据库)** 下，请选择您的数据库。

1. 在 **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 访问日志确定对象访问请求
<a name="identifying-object-access-requests"></a>

对于诸如 *GET*、*PUT* 和 *DELETE* 等操作，您可以对访问日志使用查询以确定对象访问请求，并发现有关这些请求的进一步信息。

以下 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')
```

**注意**  
您可以修改日期范围，以满足您的需要。
也可以使用这些查询示例进行安全监控。您可以查看结果或来自意外`PutObject`或未经授权的 IP 的`GetObject`呼叫 addresses/requesters ，也可以查看对存储桶的任何匿名请求。
此查询仅从启用了日志记录的时间检索信息。