

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

# 使用分割區投影為 Amazon VPC 流程日誌建立和查詢資料表
<a name="vpc-flow-logs-partition-projection"></a>

使用如下 `CREATE TABLE` 陳述句，以建立資料表、分割資料表，並使用[分割區投影](partition-projection.md)自動填入分割區。將範例中的資料表名稱 `test_table_vpclogs` 替換為您的資料表名稱。編輯 `LOCATION` 子句以指定包含 Amazon VPC 日誌資料的 Amazon S3 儲存貯體。

以下 `CREATE TABLE` 陳述式適用於以非 Hive 樣式分割格式交付的 VPC 流程日誌。此範例允許多帳戶彙總。如果您要將多個帳戶的 VPC 流程日誌集中到一個 Amazon S3 儲存貯體，則必須在 Amazon S3 路徑中輸入帳戶 ID。

```
CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs (
  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,
  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 (accid string, region string, day string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION '$LOCATION_OF_LOGS'
TBLPROPERTIES
(
"skip.header.line.count"="1",
"projection.enabled" = "true",
"projection.accid.type" = "enum",
"projection.accid.values" = "$ACCID_1,$ACCID_2",
"projection.region.type" = "enum",
"projection.region.values" = "$REGION_1,$REGION_2,$REGION_3",
"projection.day.type" = "date",
"projection.day.range" = "$START_RANGE,NOW",
"projection.day.format" = "yyyy/MM/dd",
"storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/${accid}/vpcflowlogs/${region}/${day}"
)
```

## test\$1table\$1vpclogs 的查詢範例
<a name="query-examples-vpc-logs-pp"></a>

下列查詢範例會查詢由前面 `CREATE TABLE` 陳述式所建立的 `test_table_vpclogs`。將查詢中的 `test_table_vpclogs` 替換為您自己的資料表名稱。根據自己的需求修改欄值和其他變數。

若要在指定時段內依時間順序傳回前 100 個存取日誌項目，請執行如下查詢。

```
SELECT *
FROM test_table_vpclogs
WHERE day >= '2021/02/01' AND day < '2021/02/28'
ORDER BY day ASC
LIMIT 100
```

若要查看哪個伺服器在指定時段內接收前十個 HTTP 封包，請執行如下查詢。查詢計算 HTTPS 連接埠 443 所接收的封包數、依目的地 IP 地址分組，然後傳回上週的前 10 個查詢。

```
SELECT SUM(packets) AS packetcount, 
       dstaddr
FROM test_table_vpclogs
WHERE dstport = 443
  AND day >= '2021/03/01'
  AND day < '2021/03/31'
GROUP BY dstaddr
ORDER BY packetcount DESC
LIMIT 10
```

若要傳回在指定時段內建立的日誌，請執行如下查詢。

```
SELECT interface_id,
       srcaddr,
       action,
       protocol,
       to_iso8601(from_unixtime(start)) AS start_time,
       to_iso8601(from_unixtime("end")) AS end_time
FROM test_table_vpclogs
WHERE DAY >= '2021/04/01'
  AND DAY < '2021/04/30'
```

若要傳回指定時段之間的來源 IP 地址的存取日誌，請執行如下查詢。

```
SELECT *
FROM test_table_vpclogs
WHERE srcaddr = '10.117.1.22'
  AND day >= '2021/02/01'
  AND day < '2021/02/28'
```

若要列出拒絕的 TCP 連接，請執行如下查詢。

```
SELECT day,
       interface_id,
       srcaddr,
       action,
       protocol
FROM test_table_vpclogs
WHERE action = 'REJECT' AND protocol = 6 AND day >= '2021/02/01' AND day < '2021/02/28'
LIMIT 10
```

若要傳回以 `10.117` 開頭的 IP 地址範圍的存取日誌，請執行如下查詢。

```
SELECT *
FROM test_table_vpclogs
WHERE split_part(srcaddr,'.', 1)='10'
  AND split_part(srcaddr,'.', 2) ='117'
```

若要傳回特定時間範圍之間的目的地 IP 地址的存取日誌，請執行如下查詢。

```
SELECT *
FROM test_table_vpclogs
WHERE dstaddr = '10.0.1.14'
  AND day >= '2021/01/01'
  AND day < '2021/01/31'
```