

# 使用 Amazon Athena 查询流日志
<a name="flow-logs-athena"></a>

Amazon Athena 是一种交互式查询服务，让您能够使用标准 SQL 分析 Amazon S3 中的数据，例如流日志。您可以将 Athena 与 VPC 流日志结合使用，以快速获得有关流经 VPC 的流量的切实可行的见解。例如，您可以识别虚拟私有云 (VPC) 中的哪些资源是最大流量生成者，或识别拒绝的 TCP 连接最多的 IP 地址。

**选项**
+ 您可以通过生成 CloudFormation 模板来简化和自动完成 VPC 流日志与 Athena 的集成，该模板可创建所需的AWS资源和预定义查询，您可以运行它们以获取有关流经 VPC 的流量的见解。
+ 您可以使用 Athena 创建自己的查询。有关更多信息，请参阅 *Amazon Athena 用户指南*中的[使用 Amazon Athena 查询流日志](https://docs.aws.amazon.com/athena/latest/ug/vpc-flow-logs.html)。

**定价**  
运行查询时，您需要承担标准 [Amazon Athena 收费](https://aws.amazon.com/athena/pricing/)。对于按循环计划加载新分区（当您指定分区加载频率但未指定开始和结束日期时）的 Lambda 函数，您需要承担标准 [AWS Lambda 收费](https://aws.amazon.com/lambda/pricing/)。

**Topics**
+ [使用控制台生成 CloudFormation 模板](flow-logs-generate-template-console.md)
+ [使用 AWS CLI 生成 CloudFormation 模板](flow-logs-generate-template-cli.md)
+ [运行预定义查询](flow-logs-run-athena-query.md)

# 使用控制台生成 CloudFormation 模板
<a name="flow-logs-generate-template-console"></a>

在将第一个流日志传送到 S3 存储桶后，您可以通过生成 CloudFormation 模板并使用该模板创建堆栈，与 Athena 进行集成。

**要求**
+ 选择的区域必须支持 AWS Lambda 和 Amazon Athena。
+ Amazon S3 存储桶必须位于所选区域中。
+ 流日志的日志记录格式必须包含您要运行的特定预定义查询所使用的字段。

**使用控制台生成模板**

1. 请执行下列操作之一：
   + 打开 Amazon VPC 控制台。在导航窗格中，选择 **Your VPCs**（您的 VPC），然后选择自己的 VPC。
   + 打开 Amazon VPC 控制台。在导航窗格中，选择 **Subnets**（子网），然后选择您的子网。
   + 打开 Amazon EC2 控制台。在导航窗格中，选择 **Network Interfaces**（网络接口），然后选择您的网络接口。

1. 在 **Flow logs**（流日志）选项卡上，选择发布到 Amazon S3 的流日志，然后依次选择 **Actions**（操作）、**Generate Athena integration**（生成 Athena 集成）。

1. 指定分区加载频率。如果选择 **None**（无），则必须使用已过去的日期指定分区的开始日期和结束日期。如果选择**Daily**（每日）、**Weekly**（每周）或 **Monthly**（每月），则分区的开始日期和结束日期是可选设置。如果不指定开始日期和结束日期，CloudFormation 模板创建的 Lambda 函数可以按循环计划加载新分区。

1. 为生成的模板选择或创建 S3 存储桶，为查询结果选择或创建 S3 存储桶。

1. 选择 **Generate Athena integration**（生成 Athena 集成）。

1. （可选）在成功消息中，选择链接以导航到您为 CloudFormation 模板指定的存储桶，然后自定义该模板。

1. 在成功消息中，选择 **Create CloudFormation stack（创建 CloudFormation 堆栈）**，以在 CloudFormation 控制台中打开 **Create Stack (创建堆栈)** 向导。生成的 CloudFormation 模板的 URL 在 **Template**（模板）部分中指定。完成向导以创建模板中指定的资源。

**CloudFormation 模板创建的资源**
+ Athena 数据库。该数据库名称为 vpcflowlogsathenadatabase<*flow-logs-subscription-id*>。
+ Athena 工作组。工作组名称为 <*flow-log-subscription-id*><*partition-load-frequency*><*start-date*><*end-date*>workgroup
+ 与您的流日志记录对应的已分区 Athena 表。表名称为 <*flow-log-subscription-id*><*partition-load-frequency*><*start-date*><*end-date*>。
+ 一组 Athena 命名的查询。有关更多信息，请参阅 [预定义查询](flow-logs-run-athena-query.md#predefined-queries)。
+ 一个 Lambda 函数，可按指定的时间表（每日、每周或每月）将新分区加载到表中。
+ 授予运行 Lambda 函数的权限的 IAM 角色。

# 使用 AWS CLI 生成 CloudFormation 模板
<a name="flow-logs-generate-template-cli"></a>

在将第一个流日志传送到 S3 存储桶后，您可以生成并使用 CloudFormation 模板与 Athena 集成。

使用下面的 [get-flow-logs-integration-template](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-flow-logs-integration-template.html) 命令生成 CloudFormation 模板。

```
aws ec2 get-flow-logs-integration-template --cli-input-json file://config.json
```

以下是 `config.json` 文件的示例。

```
{
    "FlowLogId": "fl-12345678901234567",
    "ConfigDeliveryS3DestinationArn": "arn:aws:s3:::my-flow-logs-athena-integration/templates/",
    "IntegrateServices": {
        "AthenaIntegrations": [
            {
                "IntegrationResultS3DestinationArn": "arn:aws:s3:::my-flow-logs-analysis/athena-query-results/",
                "PartitionLoadFrequency": "monthly",
                "PartitionStartDate": "2021-01-01T00:00:00",
                "PartitionEndDate": "2021-12-31T00:00:00"
            }
        ]
    }
}
```

使用下面的 [create-stack](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) 命令通过所生成的 CloudFormation 模板创建堆栈。

```
aws cloudformation create-stack --stack-name my-vpc-flow-logs --template-body file://my-cloudformation-template.json
```

# 运行预定义查询
<a name="flow-logs-run-athena-query"></a>

生成的 CloudFormation 模板提供了一组预定义查询，您可以运行这些查询，以快速获取有关AWS网络中的流量的有意义见解。创建堆栈并验证所有资源都创建正确后，您可以运行其中一个预定义查询。

**使用控制台运行预定义查询**

1. 打开 Athena 控制台。

1. 在导航窗格中，选择 **Query editor**（查询编辑器）。在 **Workgroups**（工作组）下，选择由 CloudFormation 模板创建的工作组。

1. 选择 **Saved queries**（保存的查询）、选择一个查询、根据需要修改参数，然后运行查询。有关可用预定义查询的列表，请参阅[预定义查询](#predefined-queries)。

1. 在 **Query results**（查询结果）下，查看查询结果。

## 预定义查询
<a name="predefined-queries"></a>

以下是 Athena 命名查询的完整列表。生成模板时提供的预定义查询取决于流日志的日志记录格式包含的字段。因此，模板可能不会包含所有这些预定义查询。
+ **VpcFlowLogsAcceptedTraffic** — 根据您的安全组和网络 ACL 允许的 TCP 连接。
+ **VpcFlowLogsAdminPortTraffic** – 流量最多的前 10 个 IP 地址，以通过管理端口服务请求的应用程序的记录为准。
+ **VpcFlowLogsIPv4Traffic** — 记录的 IPv4 流量的总字节数。
+ **VpcFlowLogsIPv6Traffic** — 记录的 IPv6 流量的总字节数。
+ **VpcFlowLogsRejectedTCPTraffic** — 根据您的安全组或网络 ACL 拒绝的 TCP 连接。
+ **VpcFlowLogsRejectedTraffic** — 根据您的安全组或网络 ACL 拒绝的流量。
+ **VpcFlowLogsSshRdpTraffic** — SSH 和 RDP 流量。
+ **VpcFlowLogsTopTalkers** — 记录的流量最多的 50 个 IP 地址。
+ **VpcFlowLogsTopTalkersPacketLevel** — 记录的流量最多的 50 个数据包级别 IP 地址。
+ **VpcFlowLogsTopTalkingInstances** — 记录的流量最多的 50 个实例的 ID。
+ **VpcFlowLogsTopTalkingSubnets** — 记录的流量最多的 50 个子网的 ID。
+ **VpcFlowLogsTopTCPTraffic** — 为源 IP 地址记录的所有 TCP 流量。
+ **VpcFlowLogsTotalBytesTransferred** — 记录的字节数最多的 50 对源和目标 IP 地址。
+ **VpcFlowLogsTotalBytesTransferredPacketLevel** — 记录的字节数最多的 50 对数据包级别的源和目标 IP 地址。
+ **VpcFlowLogsTrafficFrmSrcAddr** — 针对特定源 IP 地址记录的流量。
+ **VpcFlowLogsTrafficToDstAddr** — 针对特定目标 IP 地址记录的流量。