

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

# 建立 Amazon VPC 流程日誌的資料表並進行查詢
<a name="vpc-flow-logs-create-table-statement"></a>

以下程序會建立 Amazon VPC 流程日誌的 Amazon VPC 資料表。當您使用自訂格式建立流程日誌時，需要建立資料表，其欄位符合您在建立流程日誌時指定的欄位，而順序與您指定它們的順序相同。

**為 Amazon VPC 流量日誌建立 Athena 資料表**

1. 在 Athena 主控台查詢編輯器中輸入類似下列的 DDL 陳述式，遵循 [考量和限制](vpc-flow-logs.md#vpc-flow-logs-common-considerations) 區段中的準則。陳述式範例會建立擁有 Amazon VPC 流程日誌版本 2 至 5 (如[流程日誌記錄](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-log-records)所記載) 之資料欄的資料表。如果您使用不同組的資料欄或資料欄順序，請據此修改陳述式。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS `vpc_flow_logs` (
     version int,
     account_id string,
     interface_id string,
     srcaddr string,
     dstaddr string,
     srcport int,
     dstport int,
     protocol bigint,
     packets bigint,
     bytes bigint,
     start bigint,
     `end` bigint,
     action string,
     log_status string,
     vpc_id string,
     subnet_id string,
     instance_id string,
     tcp_flags int,
     type string,
     pkt_srcaddr string,
     pkt_dstaddr string,
     region string,
     az_id string,
     sublocation_type string,
     sublocation_id string,
     pkt_src_aws_service string,
     pkt_dst_aws_service string,
     flow_direction string,
     traffic_path int
   )
   PARTITIONED BY (`date` date)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ' '
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'
   TBLPROPERTIES ("skip.header.line.count"="1");
   ```

   請注意以下重點：
   + 該查詢指定 `ROW FORMAT DELIMITED`，且省略不指定 SerDe。這表示該查詢會使用 [適用於 CSV、TSV 和自訂分隔檔案的 Lazy Simple SerDe](lazy-simple-serde.md)。在這個查詢中，欄位以空格結尾。
   + `PARTITIONED BY` 子句使用 `date` 類型。這樣就可以在查詢中使用數學運算子來選取特定日期之前或之後的項目。
**注意**  
因為 `date` 是 DDL 陳述式中保留的關鍵字，它會溢出反引號字元。如需詳細資訊，請參閱[在查詢中逸出預留關鍵字](reserved-words.md)。
   + 針對具有不同自訂格式的 VPC 流程日誌，請修改欄位，使其符合您建立流程日誌時指定的欄位。

1. 修改 `LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'` 來指向包含日誌資料的 Amazon S3 儲存貯體。

1. 在 Athena 主控台中執行查詢。查詢完成之後，Athena 會註冊 `vpc_flow_logs` 資料表，讓其中的資料可供您發出查詢。

1. 建立能夠讀取資料的分割區，如下列查詢範例所示。這個查詢針對指定的日期建立單一分割區。視需要將預留位置換成日期和位置。
**注意**  
這個查詢針對您指定的日期，只建立單一分割區。若要自動執行程序，請使用指令碼以執行此查詢和依此針對 `year/month/day` 建立分割區，或使用指定[分割區投影](vpc-flow-logs-partition-projection.md)的 `CREATE TABLE` 陳述式。

   ```
   ALTER TABLE vpc_flow_logs
   ADD PARTITION (`date`='YYYY-MM-dd')
   LOCATION 's3://amzn-s3-demo-bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';
   ```

## vpc\$1flow\$1logs 資料表的查詢範例
<a name="query-examples-vpc-logs"></a>

使用 Athena 主控台中的查詢編輯器在您建立的資料表上執行 SQL 陳述式。您可以儲存查詢、檢視先前的查詢，或以 CSV 格式下載查詢結果。在下列範例中，將 `vpc_flow_logs` 替換為您的資料表名稱。根據自己的需求修改欄值和其他變數。

下列範例查詢會列出指定日期的最多 100 個流程日誌。

```
SELECT * 
FROM vpc_flow_logs 
WHERE date = DATE('2020-05-04') 
LIMIT 100;
```

以下查詢列出所有拒絕的 TCP 連線，並使用新建立的日期新分割欄 `date`，以從中擷取發生這些事件是星期幾。

```
SELECT day_of_week(date) AS
  day,
  date,
  interface_id,
  srcaddr,
  action,
  protocol
FROM vpc_flow_logs
WHERE action = 'REJECT' AND protocol = 6
LIMIT 100;
```

若要查看您的哪一個伺服器接收最多的 HTTPS 請求，請使用下列查詢。它計算 HTTPS 連接埠 443 所接收的封包數、依目的地 IP 地址分組，然後傳回上週的前 10 個。

```
SELECT SUM(packets) AS
  packetcount,
  dstaddr
FROM vpc_flow_logs
WHERE dstport = 443 AND date > current_date - interval '7' day
GROUP BY dstaddr
ORDER BY packetcount DESC
LIMIT 10;
```