

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 中使用 Amazon Athena 分析儲存貯體存取日誌 Lightsail
<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')
```

**注意**  
您可以修改日期範圍以符合您的需求。
對安全監控時而言，這些查詢範例也可能相當實用。您可以檢閱來自意外或未授權 IP 地址/請求者的 `PutObject` 或 `GetObject` 呼叫的結果，以及識別對您儲存貯體的任何匿名請求。
此查詢只會擷取啟用日誌之後的資訊。