

# 使用 VPC 流日志记录 IP 流量
<a name="flow-logs"></a>

利用 VPC 流日志这项功能，您可以捕获有关传入和传出您的 VPC 中网络接口的 IP 流量的信息。流日志数据可发布到以下位置：Amazon CloudWatch Logs、Amazon S3 或 Amazon Data Firehose。允许将网络流量日志发送到 CloudWatch Logs 或 S3 等目标的已配置传输路径和权限称为*订阅*。创建流日志后，您可以在配置的日志组、存储桶或传输流中检索和查看流日志记录。

流日志可帮助您处理多种任务，例如：
+ 诊断过于严格的安全组规则
+ 监控达到您实例的流量
+ 确定在网络接口上往返的流量的方向

流日志数据的收集在您网络流量路径之外，因此不会影响网络吞吐量或延迟。您可以创建或删除流日志，而不会对网络性能造成任何影响。

**注意**  
本节仅讨论 VPC 的流日志。有关版本 6 中引入的中转网关流日志的信息，请参阅《*Amazon VPC 中转网关用户指南*》中的[使用中转网关流日志记录网络流量](https://docs.amazonaws.cn/vpc/latest/tgw/tgw-flow-logs.html)。

**Topics**
+ [

# 流日志基础知识
](flow-logs-basics.md)
+ [

# 流日志记录
](flow-log-records.md)
+ [

# 流日志记录示例
](flow-logs-records-examples.md)
+ [

# 流日志限制
](flow-logs-limitations.md)
+ [

## 定价
](#flow-logs-pricing)
+ [

# 使用流日志
](working-with-flow-logs.md)
+ [

# 将流日志发布到 CloudWatch Logs
](flow-logs-cwl.md)
+ [

# 将流日志发布到 Amazon S3
](flow-logs-s3.md)
+ [

# 将流日志发布到 Amazon Data Firehose
](flow-logs-firehose.md)
+ [

# 使用 Amazon Athena 查询流日志
](flow-logs-athena.md)
+ [

# VPC 流日志疑难解答
](flow-logs-troubleshooting.md)

# 流日志基础知识
<a name="flow-logs-basics"></a>

您可以为 VPC、子网或网络接口创建流日志。如果您为子网或 VPC 创建流日志，则会监视该子网或 VPC 中的每个网络接口。

受监控网络接口的流日志数据记录为*流日志记录*，这些是日志事件，由描述该流量的字段组成。有关更多信息，请参阅 [流日志记录](flow-log-records.md)。

要创建流日志，请指定：
+ 要为其创建流日志的资源
+ 要捕获的流量的类型（接受的流量、拒绝的流量或所有流量）
+ 指定您要将流日志数据发布到的目标

在以下示例中，您创建一个流日志，用于捕获私有子网中某个 EC2 实例的网络接口的已接受流量，并将流日志记录发布到 Amazon S3 存储桶。

![\[实例的流日志\]](http://docs.amazonaws.cn/vpc/latest/userguide/images/flow-logs-diagram-s3.png)


在以下示例中，流日志会捕获子网的所有流量，并将流日志记录发布到 Amazon CloudWatch Logs。流日志将捕获子网中所有网络接口的流量。

![\[子网的流日志\]](http://docs.amazonaws.cn/vpc/latest/userguide/images/flow-logs-diagram-cw.png)


创建流日志后，需要几分钟来开始收集数据并将数据发布到选定目标。流日志不会为您的网络接口捕获实时日志流。有关更多信息，请参阅 [2. 创建流日志](working-with-flow-logs.md#create-flow-log)。

如果在为子网或 VPC 创建流日志后，您在子网中启动了实例，则只要网络接口中有网络流量，我们就会为新网络接口创建一个日志流（对于 CloudWatch Logs）或日志文件对象（对于 Amazon S3）。

您可以为其他 Amazon 创建的网络接口创建流日志，例如：
+ Elastic Load Balancing
+ Amazon RDS
+ Amazon ElastiCache
+ Amazon Redshift
+ Amazon WorkSpaces
+ NAT 网关
+ 中转网关

不论网络接口是什么类型，您必须使用 Amazon EC2 控制台或 Amazon EC2 API 为网络接口创建流日志。

您可以将标签应用于流日志。每个标签都包含您定义的一个键和一个可选值。标签可以帮助您整理流日志，例如按目的或拥有者。

如果您不再需要某个流日志，可将其删除。删除流日志会禁用资源的流日志服务，因此将不再创建或发布新的流日志记录。删除流日志不会删除任何现有的流日志数据。删除流日志后，您可以将其从目的地中直接删除。有关更多信息，请参阅 [4. 删除流日志](working-with-flow-logs.md#delete-flow-log)。

# 流日志记录
<a name="flow-log-records"></a>

流日志记录代表您的 VPC 中的网络流。默认情况下，每条记录捕获在*聚合时间间隔*（又称为*捕获窗口*）内发生的网络 Internet 协议 (IP) 流量流（按每个网络接口 5 元组来定性）。

每条记录都是一个字符串，字段用空格分隔。记录包括 IP 流的不同组件的值，包括源、目标和协议。

当您创建流日志时，您可以为流日志记录使用默认格式，也可以指定自定义格式。

**Topics**
+ [

## 聚合时间间隔
](#flow-logs-aggregration-interval)
+ [

## 默认格式
](#flow-logs-default)
+ [

## 自定义格式
](#flow-logs-custom)
+ [

## 可用字段
](#flow-logs-fields)

## 聚合时间间隔
<a name="flow-logs-aggregration-interval"></a>

聚合时间间隔表示捕获特定流并聚合到流日志记录中的时间段。默认情况下，最大聚合时间间隔为 10 分钟。创建流日志时，您可以选择指定最大 1 分钟的聚合时间间隔。最大聚合时间间隔为 1 分钟的流日志的大小，比最大聚合时间间隔为 10 分钟的流日志大。

当网络接口附加到[基于 Nitro 的实例](https://docs.amazonaws.cn/ec2/latest/instancetypes/ec2-nitro-instances.html)时，无论指定的最大聚合时间间隔为多少，聚合时间间隔始终不超过 1 分钟。

在聚合时间间隔内捕获数据后，需要额外的时间来处理数据并将其发布到 CloudWatch Logs 或 Amazon S3。流日志服务通常在大约 5 分钟内将日志传送到 CloudWatch Logs，在大约 10 分钟内将日志传送到 Amazon S3。但是，日志交付已尽了最大努力，您的日志可能会延迟到典型交付时间之后。

## 默认格式
<a name="flow-logs-default"></a>

使用默认格式，流日志记录按[可用字段](#flow-logs-fields)表中显示的顺序包括版本 2 字段。您无法自定义或更改默认格式。要捕获其他字段或不同字段子集，请指定自定义格式。

## 自定义格式
<a name="flow-logs-custom"></a>

使用自定义格式，您可以指定流日志记录中包含哪些字段以及采用哪种顺序。这使您可以根据具体需求创建流日志，并忽略无关的字段。使用自定义格式，还可减少从发布的流日志提取特定信息所需的单独流程。您可以指定任意数量的可用流日志字段，但必须至少指定一个。

## 可用字段
<a name="flow-logs-fields"></a>

下表描述了对流日志记录可用的所有字段。**版本**列表示在其中引入了字段的 VPC 流日志版本。默认格式包括所有版本 2 字段，与它们在表格中出现的顺序相同。

将流日志数据发布到 Amazon S3 时，字段的数据类型将取决于流日志格式。如果格式为纯文本，则所有字段的类型均为 STRING。如果格式为 Parquet，请参阅字段数据类型表。

如果某个字段不适用于或无法计算特定记录，则记录为该条目显示一个“-”符号。不直接来自数据包标头的元数据字段是最大努力的近似值，它们的值可能缺失或不准确。


| 字段 | 描述 | 版本 | 
| --- | --- | --- | 
|  version  |  VPC 流日志版本。如果您使用默认格式，则版本为 2。如果您使用自定义格式，则版本是指定字段中的最高版本。例如，如果您只在版本 2 中指定字段，则版本为 2。如果您在版本 2、3 和 4 中指定字段组合，则版本为 4。 **Parquet 数据类型：**INT\$132  | 2 | 
|  account-id  |  为其记录流量的源网络接口的拥有者的Amazon账户 ID。如果该网络接口由 Amazon 服务创建，例如在创建 VPC 端点或网络负载均衡器时创建，则记录中可能会显示此字段的值为 unknown。 **Parquet 数据类型：**STRING  | 2 | 
|  interface-id  |  为其记录流量的网络接口的 ID。对于关联到某个区域 NAT 网关的流量，将返回一个“-”符号。 **Parquet 数据类型：**STRING  | 2 | 
|  srcaddr  |   对于传入流量，这是流量来源的 IP 地址。对于传出流量，这是发送流量的网络接口的私有 IPv4 地址或 IPv6 地址。对于来自区域 NAT 网关的传出流量，这是与 pkt-srcaddr 中相同的数据包级别源 IP 地址。另请参阅pkt-srcaddr。 **Parquet 数据类型：**STRING  | 2 | 
|  dstaddr  |  传出流量的目标地址，或者网络接口上传入流量的网络接口 IPv4 或 IPv6 地址。网络接口的 IPv4 地址始终是其私有 IPv4 地址。对于来自区域 NAT 网关的传入流量，这是与 pkt-dstaddr 中相同的数据包级别目标 IP 地址。另请参阅pkt-dstaddr。 **Parquet 数据类型：**STRING  | 2 | 
|  srcport  |  流量的源端口。 **Parquet 数据类型：**INT\$132  | 2 | 
|  dstport  |  流量的目标端口。 **Parquet 数据类型：**INT\$132  | 2 | 
|  protocol  |  流量的 IANA 协议编号。有关更多信息，请参阅[分配的 Internet 协议编号](http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)。 **Parquet 数据类型：**INT\$132  | 2 | 
|  packets  |  在流中传输的数据包的数量。 **Parquet 数据类型：**INT\$164  | 2 | 
|  bytes  |  在流中传输的字节数。 **Parquet 数据类型：**INT\$164  | 2 | 
|  start  |  在聚合时间间隔内，接收流的第一个数据包的时间（以 Unix 秒为单位）。这可能是在网络接口上传输或收到数据包之后最多 60 秒。 **Parquet 数据类型：**INT\$164  | 2 | 
|  end  |  在聚合时间间隔内，接收流的最后一个数据包的时间（以 Unix 秒为单位）。这可能是在网络接口上传输或收到数据包之后最多 60 秒。 **Parquet 数据类型：**INT\$164  | 2 | 
|  action  |  与流量关联的操作： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/vpc/latest/userguide/flow-log-records.html) **Parquet 数据类型：**STRING  | 2 | 
|  log-status  |  流日志的日志记录状态： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/vpc/latest/userguide/flow-log-records.html) **Parquet 数据类型：**STRING  | 2 | 
|  vpc-id  |  包含记录其流量的网络接口的 VPC 的 ID。 **Parquet 数据类型：**STRING  | 3 | 
|  subnet-id  |  包含记录其流量的网络接口的子网的 ID。对于关联到区域 NAT 网关的流量，将返回一个“-”符号。 **Parquet 数据类型：**STRING  | 3 | 
|  instance-id  |  与要记录其流量的网络接口关联的实例的 ID（如果实例由您所有）。对于[请求方管理的网络接口](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/requester-managed-eni.html)，返回“-”符号，例如，NAT 网关的网络接口。 **Parquet 数据类型：**STRING  | 3 | 
|  tcp-flags  | 以下 TCP 标志的位掩码值：[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/vpc/latest/userguide/flow-log-records.html)如果未记录支持的标志，则 TCP 标志值为 0。例如，由于 tcp-flags 不支持记录 ACK 或 PSH 标志，因此具有这些不受支持标志的流量记录将导致 tcp-flags 值为 0。但是，如果不支持的标志附带有支持标志，我们将报告受支持标志的值。例如，如果 ACK 是 SYN-ACK 的一部分，则会报告 18。而且，如果有像 SYN\$1ECE 这样的记录，由于 SYN 是支持的标志，而 ECE 不是，那么 TCP 标志值为 2。如果由于某种原因标志组合无效且无法计算其值，则值为“-”。如果未发送标志，则 TCP 标志值为 0。在聚合时间间隔内，TCP 标志可以是 OR-ed。对于短连接，标志必须在与流日志记录相同的行上设置，例如，对于 SYN-ACK 和 FIN 的 19，以及对于 SYN 和 FIN 的 3。有关示例，请参阅 [TCP 标志序列](flow-logs-records-examples.md#flow-log-example-tcp-flag)。有关 TCP 标志的一般信息（例如 FIN、SYN 和 ACK 等标志的含义），请参阅 Wikipedia 上的 [TCP 分段结构](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure)。**Parquet 数据类型：**INT\$132 | 3 | 
|  type  |  流量的类型。可能的值包括：IPv4 \$1 IPv6 \$1 EFA。有关更多信息，请参阅 [Elastic Fabric Adapter](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/efa.html)。 **Parquet 数据类型：**STRING  | 3 | 
|  pkt-srcaddr  |  流量的数据包级别（原始）源 IP 地址。将此字段与 srcaddr 字段一起使用，用于区分流量流经的中间层 IP 地址与流量的原始源 IP 地址。例如，当流量流经 [NAT 网关的网络接口时](flow-logs-records-examples.md#flow-log-example-nat)，或者当 Amazon EKS 中 Pod 的 IP 地址不同于运行 Pod 的实例节点的网络接口 IP 地址时（用于 VPC 中的通信）。 **Parquet 数据类型：**STRING  | 3 | 
|  pkt-dstaddr  |  流量的数据包级别（原始）目标 IP 地址。将此字段与 dstaddr 字段一起使用，用于区分流量流经的中间层的 IP 地址与流量的最终目标 IP 地址。例如，当流量流经 [NAT 网关的网络接口时](flow-logs-records-examples.md#flow-log-example-nat)，或者当 Amazon EKS 中 Pod 的 IP 地址不同于运行 Pod 的实例节点的网络接口 IP 地址时（用于 VPC 中的通信）。 **Parquet 数据类型：**STRING  | 3 | 
|  region  |  包含记录其流量的网络接口的区域。 **Parquet 数据类型：**STRING  |  4  | 
|  az-id  |  包含记录其流量的网络接口的可用区的 ID。如果流量来自子位置，则记录会对此字段显示“-”符号。 **Parquet 数据类型：**STRING  |  4  | 
|  sublocation-type  |  sublocation-id 字段中返回的子位置类型：可能的值包括：[波长](https://www.amazonaws.cn/wavelength/) \$1 [前哨](https://docs.amazonaws.cn/outposts/latest/userguide/) \$1 [本地扩展区](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-local-zones)。如果流量不是来自子位置，则记录会对此字段显示“-”符号。 **Parquet 数据类型：**STRING  |  4  | 
|  sublocation-id  |  包含记录其流量的网络接口的子位置的 ID。如果流量不是来自子位置，则记录会对此字段显示“-”符号。 **Parquet 数据类型：**STRING  |  4  | 
|  pkt-src-aws-service  |  pkt-srcaddr 字段的 [IP 地址范围](aws-ip-ranges.md)子集的名称（如果源 IP 地址用于Amazon服务）。如果源 IP 地址属于[重叠范围](aws-ip-syntax.md#aws-ip-range-overlaps)，则 pkt-src-aws-service 仅显示其中一个 Amazon 服务代码。可能的值包括：`AMAZON` \$1 `AMAZON_APPFLOW` \$1 `AMAZON_CONNECT` \$1 `API_GATEWAY` \$1 `AURORA_DSQL` \$1 `CHIME_MEETINGS` \$1 `CHIME_VOICECONNECTOR` \$1 `CLOUD9` \$1 `CLOUDFRONT` \$1 `CLOUDFRONT_ORIGIN_FACING` \$1 `CODEBUILD` \$1 `DYNAMODB` \$1 `EBS` \$1 `EC2` \$1 `EC2_INSTANCE_CONNECT` \$1 `GLOBALACCELERATOR` \$1 `IVS_LOW_LATENCY` \$1 `IVS_REALTIME` \$1 `KINESIS_VIDEO_STREAMS` \$1 `MEDIA_PACKAGE_V2` \$1 `ROUTE53` \$1 `ROUTE53_HEALTHCHECKS` \$1 `ROUTE53_HEALTHCHECKS_PUBLISHING` \$1 `ROUTE53_RESOLVER` \$1 `S3` \$1 `WORKSPACES_GATEWAYS`。 **Parquet 数据类型：**STRING  |  5  | 
|  pkt-dst-aws-service  |  pkt-dstaddr 字段的 IP 地址范围子集的名称（如果目标 IP 地址用于Amazon服务）。有关可能的值的列表，请参阅 pkt-src-aws-service 字段。 **Parquet 数据类型：**STRING  |  5  | 
|  flow-direction  |  相对于捕获流量的接口而言流的方向。可能的值包括：ingress \$1 egress。 **Parquet 数据类型：**STRING  |  5  | 
|  traffic-path  |  传出流量到达目的地的路径。要确定流量是否为传出流量，请检查 flow-direction 字段。可能的值如下所示。如果没有任何值适用，则该字段将设置为 -。 [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/vpc/latest/userguide/flow-log-records.html) **Parquet 数据类型：**INT\$132  |  5  | 
|  ecs-cluster-arn  | 如果流量来自正在运行的 ECS 任务，则为 ECS 集群的 Amazon 资源名称（ARN）。要在订阅中包含此字段，您需要调用 ecs:ListClusters 的权限。Parquet 数据类型：STRING |  7  | 
|  ecs-cluster-name  | 如果流量来自正在运行的 ECS 任务，则为 ECS 集群的名称。要在订阅中包含此字段，您需要调用 ecs:ListClusters 的权限。Parquet 数据类型：STRING |  7  | 
|  ecs-container-instance-arn  | 如果流量来自 EC2 实例上正在运行的 ECS 任务，则为 ECS 容器实例的 ARN。如果容量提供程序是 Amazon Fargate，则此字段将为“-”。要在订阅中包含此字段，您需要调用 ecs:ListClusters 和 ecs:ListContainerInstances 的权限。Parquet 数据类型：STRING |  7  | 
|  ecs-container-instance-id  | 如果流量来自 EC2 实例上正在运行的 ECS 任务，则为 ECS 容器实例的 ID。如果容量提供程序是 Amazon Fargate，则此字段将为“-”。要在订阅中包含此字段，您需要调用 ecs:ListClusters 和 ecs:ListContainerInstances 的权限。Parquet 数据类型：STRING |  7  | 
|  ecs-container-id  | 如果流量来自正在运行的 ECS 任务，则为容器的 Docker 运行时 ID。如果 ECS 任务中有一个或多个容器，这将是第一个容器的 docker 运行时 ID。要在订阅中包含此字段，您需要调用 ecs:ListClusters 的权限。Parquet 数据类型：STRING |  7  | 
|  ecs-second-container-id  | 如果流量来自正在运行的 ECS 任务，则为容器的 Docker 运行时 ID。如果 ECS 任务中有多个容器，这将是第二个容器的 Docker 运行时 ID。要在订阅中包含此字段，您需要调用 ecs:ListClusters 的权限。Parquet 数据类型：STRING |  7  | 
|  ecs-service-name  | 如果流量来自正在运行的 ECS 任务，并且 ECS 任务由 ECS 服务启动，则为 ECS 服务的名称。如果 ECS 任务不是由 ECS 服务启动的，则此字段将为“-”。要在订阅中包含此字段，您需要调用 ecs:ListClusters 和 ecs:ListServices 的权限。Parquet 数据类型：STRING |  7  | 
|  ecs-task-definition-arn  | 如果流量来自正在运行的 ECS 任务，则为 ECS 任务定义的 ARN。要在订阅中包含此字段，您需要调用 ecs:ListClusters 和 ecs:ListTaskDefinitions 的权限 Parquet 数据类型：STRING |  7  | 
|  ecs-task-arn  | 如果流量来自正在运行的 ECS 任务，则为 ECS 任务的 ARN。要在订阅中包含此字段，您需要调用 ecs:ListClusters 和 ecs:ListTasks 的权限。Parquet 数据类型：STRING |  7  | 
|  ecs-task-id  | 如果流量来自正在运行的 ECS 任务，则为 ECS 任务的 ID。要在订阅中包含此字段，您需要调用 ecs:ListClusters 和 ecs:ListTasks 的权限。Parquet 数据类型：STRING |  7  | 
|  reject-reason  |  流量被拒绝的原因。可能的值：BPA、EC。对于任何其他拒绝原因，返回“-”。 [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/vpc/latest/userguide/flow-log-records.html) **Parquet 数据类型：**STRING  |  8  | 
|  resource-id  | 包含记录其流量的网络接口的区域 NAT 网关的 ID。对于未关联到某个区域 NAT 网关的流量，将返回一个“-”符号。有关区域 NAT 网关的更多信息，请参阅[使用区域 NAT 网关实现自动多可用区扩展](nat-gateways-regional.md)。 **Parquet 数据类型：**STRING  |  9  | 
|  encryption-status  |  该流量的加密状态。有关 VPC 加密控制的更多信息，请参阅[强制执行传输中 VPC 加密](vpc-encryption-controls.md)。可能的值包括： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/vpc/latest/userguide/flow-log-records.html) 如果未启用 VPC 加密控制或 FlowLog 无法获取状态，则值为“-”。  \$1 对于接口端点和网关端点，Amazon 不会检查数据包数据以确定加密状态，而是依赖用于假定加密状态的端口。 \$1\$1 对于指定的 Amazon 托管式端点，Amazon 根据服务配置中的 TLS 要求来确定加密状态。  **Parquet 数据类型：**INT\$132  |  10  | 

# 流日志记录示例
<a name="flow-logs-records-examples"></a>

以下是捕获特定流量流的流日志记录的示例。

有关流日志记录格式的信息，请参阅 [流日志记录](flow-log-records.md)。有关如何创建流日志的信息，请参阅 [使用流日志](working-with-flow-logs.md)。

**Topics**
+ [

## 接受的和拒绝的流量
](#flow-log-example-accepted-rejected)
+ [

## 无数据和跳过的记录
](#flow-log-example-no-data)
+ [

## 安全组和网络 ACL 规则
](#flow-log-example-security-groups)
+ [

## IPv6 流量
](#flow-log-example-ipv6)
+ [

## TCP 标志序列
](#flow-log-example-tcp-flag)
+ [

## 通过可用区 NAT 网关的流量
](#flow-log-example-nat)
+ [

## 通过区域 NAT 网关的流量
](#flow-log-example-regional-nat)
+ [

## 通过中转网关的流量
](#flow-log-example-tgw)
+ [

## 服务名称、流量路径和流向
](#flow-log-example-traffic-path)

## 接受的和拒绝的流量
<a name="flow-log-example-accepted-rejected"></a>

以下是默认流日志记录的示例。

在本例中，允许从 IP 地址 172.31.16.139 到具有私有 IP 地址为 172.31.16.21 的网络接口的 SSH 流量（目标端口 22，TCP 协议），并允许账户 123456789010 中的 ID eni-1235b8ca123456789。

```
2 123456789010 eni-1235b8ca123456789 172.31.16.139 172.31.16.21 20641 22 6 20 4249 1418530010 1418530070 ACCEPT OK
```

在此示例中，拒绝指向账户 123456789010 中的网络接口 eni-1235b8ca123456789 的 RDP 流量（目标端口 3389，TCP 协议）。

```
2 123456789010 eni-1235b8ca123456789 172.31.9.69 172.31.9.12 49761 3389 6 20 4249 1418530010 1418530070 REJECT OK
```

## 无数据和跳过的记录
<a name="flow-log-example-no-data"></a>

以下是默认流日志记录的示例。

在此示例中，聚合时间间隔中未记录任何数据。

```
2 123456789010 eni-1235b8ca123456789 - - - - - - - 1431280876 1431280934 - NODATA
```

由于超过内部容量，VPC 流日志在聚合时间间隔期间无法捕获流日志数据时会跳过记录。单个跳过的记录可以表示聚合时间间隔期间网络接口未捕获的多个流。

```
2 123456789010 eni-11111111aaaaaaaaa - - - - - - - 1431280876 1431280934 - SKIPDATA
```

**注意**  
在聚合时间间隔内可能会跳过一些流日志记录（请参阅[可用字段](flow-log-records.md#flow-logs-fields)中的 *log-status*）。这可能是因为存在内部 Amazon 容量限制或内部错误。如果使用 Amazon Cost Explorer 查看 VPC 流日志费用，并且在流日志聚合时间间隔内跳过了一些流日志，则 Amazon Cost Explorer 中报告的流日志数量会高于 Amazon VPC 发布的流日志数量。

## 安全组和网络 ACL 规则
<a name="flow-log-example-security-groups"></a>

如果您正使用流日志来诊断过于严格或过于宽松的安全组规则或网络 ACL 规则，请注意这些资源的状态性。安全组是有状态的 — 这意味着对所允许流量的响应也会被允许，即使安全组中的规则不允许也是如此。相反，网络 ACL 是无状态的，因此对所允许流量的响应需要遵守网络 ACL 规则。

例如，您从家中的计算机（IP 地址为 203.0.113.12）对您的实例（网络接口的私有 IP 地址为 172.31.16.139）使用 **ping** 命令。您的安全组入站规则允许 ICMP 流量，但出站规则不允许 ICMP 流量。由于安全组是有状态的，允许从您的实例响应 ping。您的网络 ACL 允许入站 ICMP 流量，但不允许出站 ICMP 流量。由于网络 ACL 是无状态的，响应 Ping 将被丢弃，不会传输到您家中的计算机。在默认流日志中，它显示为两个流日志记录：
+ 网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的 ACCEPT 记录。
+ 网络 ACL 拒绝的响应 ping 的 REJECT 记录。

```
2 123456789010 eni-1235b8ca123456789 203.0.113.12 172.31.16.139 0 0 1 4 336 1432917027 1432917142 ACCEPT OK
```

```
2 123456789010 eni-1235b8ca123456789 172.31.16.139 203.0.113.12 0 0 1 4 336 1432917094 1432917142 REJECT OK
```

如果您的网络 ACL 允许出站 ICMP 流量，流日志会显示两个 ACCEPT 记录 (一个针对发起 ping，一个针对响应 ping)。如果您的安全组拒绝入站 ICMP 流量，流日志会显示一个 REJECT 记录，因为流量无权到达您的实例。

## IPv6 流量
<a name="flow-log-example-ipv6"></a>

以下是默认流日志记录的示例。在此示例中，允许从 IPv6 地址 2001:db8:1234:a100:8d6e:3477:df66:f105 到账户 123456789010 中的网络接口 eni-1235b8ca123456789 的 SSH 流量（端口 22）。

```
2 123456789010 eni-1235b8ca123456789 2001:db8:1234:a100:8d6e:3477:df66:f105 2001:db8:1234:a102:3304:8879:34cf:4071 34892 22 6 54 8855 1477913708 1477913820 ACCEPT OK
```

## TCP 标志序列
<a name="flow-log-example-tcp-flag"></a>

本节包含按照下列顺序捕获下列字段的自定义流日志的示例。

```
version vpc-id subnet-id instance-id interface-id account-id type srcaddr dstaddr srcport dstport pkt-srcaddr pkt-dstaddr protocol bytes packets start end action tcp-flags log-status
```

本节示例中的 tcp-flags 字段显示为流日志中的倒数第二的值。TCP 标志可帮助您确定流量的方向，例如，启动连接的服务器。

**注意**  
有关 tcp-flags 选项的更多信息和每个 TCP 标志的说明，请参阅 [可用字段](flow-log-records.md#flow-logs-fields)。

在以下记录（从晚上 7:47:55 开始，到晚上 7:48:53 结束）中，运行在端口 5001 上的客户端启动了两个与服务器的连接。服务器从客户端上的两个不同端口（43416 和 43418）收到两个 SYN 标志 (2)。对于每个 SYN，在对应的端口上从服务器向客户端发送一个 SYN-ACK (18)。

```
3 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-01234567890123456 eni-1235b8ca123456789 123456789010 IPv4 52.213.180.42 10.0.0.62 43416 5001 52.213.180.42 10.0.0.62 6 568 8 1566848875 1566848933 ACCEPT 2 OK
3 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-01234567890123456 eni-1235b8ca123456789 123456789010 IPv4 10.0.0.62 52.213.180.42 5001 43416 10.0.0.62 52.213.180.42 6 376 7 1566848875 1566848933 ACCEPT 18 OK
3 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-01234567890123456 eni-1235b8ca123456789 123456789010 IPv4 52.213.180.42 10.0.0.62 43418 5001 52.213.180.42 10.0.0.62 6 100701 70 1566848875 1566848933 ACCEPT 2 OK
3 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-01234567890123456 eni-1235b8ca123456789 123456789010 IPv4 10.0.0.62 52.213.180.42 5001 43418 10.0.0.62 52.213.180.42 6 632 12 1566848875 1566848933 ACCEPT 18 OK
```

在第二个聚合时间间隔中，上一个流期间建立的连接之一现在关闭。服务器在端口 43418 上为连接发送 FIN 标志 (1) 到客户端。客户端在端口 43418 上发送 FIN 到服务器。

```
3 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-01234567890123456 eni-1235b8ca123456789 123456789010 IPv4 10.0.0.62 52.213.180.42 5001 43418 10.0.0.62 52.213.180.42 6 63388 1219 1566848933 1566849113 ACCEPT 1 OK
3 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-01234567890123456 eni-1235b8ca123456789 123456789010 IPv4 52.213.180.42 10.0.0.62 43418 5001 52.213.180.42 10.0.0.62 6 23294588 15774 1566848933 1566849113 ACCEPT 1 OK
```

对于在单个聚合时间间隔中打开和关闭的短连接（例如，几秒），对于处于相同方向的流量流，标志必须在与流日志记录相同的行上设置。在以下示例中，连接在相同的聚合时间间隔中建立和完成。在第一行，TCP 标志值为 3，这表示有从客户端发送到服务器的 SYN 和 FIN 消息。在第二行，TCP 标志值为 19，这表示有从服务器发送回客户端的 SYN-ACK 和 FIN 消息。

```
3 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-01234567890123456 eni-1235b8ca123456789 123456789010 IPv4 52.213.180.42 10.0.0.62 43638 5001 52.213.180.42 10.0.0.62 6 1260 17 1566933133 1566933193 ACCEPT 3 OK
3 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-01234567890123456 eni-1235b8ca123456789 123456789010 IPv4 10.0.0.62 52.213.180.42 5001 43638  10.0.0.62 52.213.180.42 6 967 14 1566933133 1566933193 ACCEPT 19 OK
```

## 通过可用区 NAT 网关的流量
<a name="flow-log-example-nat"></a>

在此示例中，私有子网中的实例通过位于公有子网中的可用区 NAT 网关访问互联网。

![\[通过可用区 NAT 网关访问互联网\]](http://docs.amazonaws.cn/vpc/latest/userguide/images/flow-log-nat-gateway.png)


可用区 NAT 网关网络接口的以下自定义流日志按照下列顺序捕获下列字段。

```
instance-id interface-id srcaddr dstaddr pkt-srcaddr pkt-dstaddr
```

该流日志显示从实例 IP 地址 (10.0.1.5) 通过可用区 NAT 网关网络接口流向互联网上主机 (203.0.113.5) 的流量。可用区 NAT 网关网络接口是请求方管理的网络接口，因此 instance-id 字段在流日志记录中将显示一个“-”符号。以下行显示从源实例流向该可用区 NAT 网关网络接口的流量。dstaddr 和 pkt-dstaddr 字段的值不同。dstaddr 字段显示该可用区 NAT 网关网络接口的私有 IP 地址，pkt-dstaddr 字段显示该互联网上主机的最终目标 IP 地址。

```
- eni-1235b8ca123456789 10.0.1.5 10.0.0.220 10.0.1.5 203.0.113.5
```

接下来两行显示从该可用区 NAT 网关网络接口流向该互联网上目标主机的流量，以及从该主机发送到该 NAT 网关网络接口的响应流量。

```
- eni-1235b8ca123456789 10.0.0.220 203.0.113.5 10.0.0.220 203.0.113.5
- eni-1235b8ca123456789 203.0.113.5 10.0.0.220 203.0.113.5 10.0.0.220
```

以下行显示从该可用区 NAT 网关网络接口流向源实例的响应流量。srcaddr 和 pkt-srcaddr 字段的值不同。srcaddr 字段显示该 NAT 网关网络接口的私有 IP 地址，pkt-srcaddr 字段显示该互联网上主机的 IP 地址。

```
- eni-1235b8ca123456789 10.0.0.220 10.0.1.5 203.0.113.5 10.0.1.5
```

您可使用与以上相同的字段集创建另一个自定义流日志。您可为私有子网中的实例的网络接口创建流日志。在这种情况下，instance-id 字段返回与网络接口关联的实例的 ID，并且 dstaddr 和 pkt-dstaddr 字段与 srcaddr 和 pkt-srcaddr 字段没有不同。与可用区 NAT 网关的网络接口不同，该网络接口不是流量的中间网络接口。

```
i-01234567890123456 eni-1111aaaa2222bbbb3 10.0.1.5 203.0.113.5 10.0.1.5 203.0.113.5 #Traffic from the source instance to host on the internet
i-01234567890123456 eni-1111aaaa2222bbbb3 203.0.113.5 10.0.1.5 203.0.113.5 10.0.1.5 #Response traffic from host on the internet to the source instance
```

## 通过区域 NAT 网关的流量
<a name="flow-log-example-regional-nat"></a>

区域 NAT 网关可以连接到跨不同可用区的多个子网。此示例中的两个实例来自两个不同可用区的私有子网，通过同一个区域 NAT 网关访问互联网。以下流日志显示了从其中一个实例通过该区域 NAT 网关流向互联网的流量。

![\[通过区域 NAT 网关访问互联网\]](http://docs.amazonaws.cn/vpc/latest/userguide/images/flow-log-regional-nat-gateway.png)


区域 NAT 网关的以下自定义流日志按照下列顺序捕获下列字段。

```
resource-id instance-id interface-id subnet-id srcaddr dstaddr pkt-srcaddr pkt-dstaddr
```

该流日志显示从实例 IP 地址 (10.0.1.5) 通过区域 NAT 网关流向互联网上主机 (203.0.113.5) 的流量。instance-id、interface-id 和 subnet-id 不适用于区域 NAT 网关。因此，这些字段在流日志记录中将显示一个“-”符号。而 resource-id 字段会显示区域 NAT 网关的 ID。dstaddr 和 pkt-dstaddr 字段显示互联网上主机的最终目标 IP 地址。

```
nat-1234567890abcdef - - - 10.0.1.5 203.0.113.5 10.0.1.5 203.0.113.5
```

接下来两行显示从该区域 NAT 网关（公有 IP 地址 107.22.182.139）流向互联网上目标主机的流量，以及从该主机流向该区域 NAT 网关的响应流量。

```
nat-1234567890abcdef - - - 107.22.182.139 203.0.113.5 107.22.182.139 203.0.113.5
nat-1234567890abcdef - - - 203.0.113.5 107.22.182.139 203.0.113.5 107.22.182.139
```

以下行显示从该区域 NAT 网关流向源实例的响应流量。srcaddr 和 pkt-srcaddr 字段显示互联网上主机的 IP 地址。

```
nat-1234567890abcdef - - - 203.0.113.5 10.0.1.5 203.0.113.5 10.0.1.5
```

您可使用与以上相同的字段集创建另一个自定义流日志。您可为私有子网中的实例的网络接口创建流日志。在这种情况下，instance-id 字段会返回与该网络接口关联的实例的 ID，而 resource-id 显示为“-”。dstaddr 和 pkt-dstaddr 字段与 srcaddr 和 pkt-srcaddr 字段之间没有区别。

```
- i-01234567890123456 eni-1111aaaa2222bbbb3 subnet-aaaaaaaa012345678 10.0.1.5 203.0.113.5 10.0.1.5 203.0.113.5 #Traffic from the source instance to host on the internet
- i-01234567890123456 eni-1111aaaa2222bbbb3 subnet-aaaaaaaa012345678 203.0.113.5 10.0.1.5 203.0.113.5 10.0.1.5 #Response traffic from host on the internet to the source instance
```

## 通过中转网关的流量
<a name="flow-log-example-tgw"></a>

在此示例中，VPC A 中的客户端通过中转网关连接到 VPC B 中的 Web 服务器。客户端和服务器处于不同的可用区中。流量使用弹性网络接口 ID 抵达 VPC B 中的服务器（在本例中，假设该 ID 为 eni-11111111111111111），使用另一个 ID（例如 eni-22222222222222222）离开 VPC B。

![\[通过中转网关的流量\]](http://docs.amazonaws.cn/vpc/latest/userguide/images/flow-log-tgw.png)


您可使用以下格式为 VPC B 创建自定义流日志。

```
version interface-id account-id vpc-id subnet-id instance-id srcaddr dstaddr srcport dstport protocol tcp-flags type pkt-srcaddr pkt-dstaddr action log-status
```

来自流日志记录的以下行演示了 Web 服务器上网络接口的流量流。第一行是来自客户端的请求流量，最后一行是来自 Web 服务器的响应流量。

```
3 eni-33333333333333333 123456789010 vpc-abcdefab012345678 subnet-22222222bbbbbbbbb i-01234567890123456 10.20.33.164 10.40.2.236 39812 80 6 3 IPv4 10.20.33.164 10.40.2.236 ACCEPT OK
...
3 eni-33333333333333333 123456789010 vpc-abcdefab012345678 subnet-22222222bbbbbbbbb i-01234567890123456 10.40.2.236 10.20.33.164 80 39812 6 19 IPv4 10.40.2.236 10.20.33.164 ACCEPT OK
```

以下行是 eni-11111111111111111 上的请求流量，这是子网 subnet-11111111aaaaaaaaa 中的中转网关的请求方管理的网络接口。因此，以下日志记录为 instance-id 字段显示“-”符号。srcaddr 字段显示中转网关网络接口的私有 IP 地址，pkt-srcaddr 字段显示 VPC A 中客户端的源 IP 地址。

```
3 eni-11111111111111111 123456789010 vpc-abcdefab012345678 subnet-11111111aaaaaaaaa - 10.40.1.175 10.40.2.236 39812 80 6 3 IPv4 10.20.33.164 10.40.2.236 ACCEPT OK
```

以下行是 eni-22222222222222222 上的响应流量，这是子网 subnet-22222222bbbbbbbbb 中的中转网关的请求方管理的网络接口。dstaddr 字段显示中转网关网络接口的私有 IP 地址，pkt-dstaddr 字段显示 VPC A 中客户端的 IP 地址。

```
3 eni-22222222222222222 123456789010 vpc-abcdefab012345678 subnet-22222222bbbbbbbbb - 10.40.2.236 10.40.2.31 80 39812 6 19 IPv4 10.40.2.236 10.20.33.164 ACCEPT OK
```

## 服务名称、流量路径和流向
<a name="flow-log-example-traffic-path"></a>

下面是自定义流日志记录的字段示例。

```
version srcaddr dstaddr srcport dstport protocol start end type packets bytes account-id vpc-id subnet-id instance-id interface-id region az-id sublocation-type sublocation-id action tcp-flags pkt-srcaddr pkt-dstaddr pkt-src-aws-service pkt-dst-aws-service traffic-path flow-direction log-status
```

在以下示例中，版本为 5，因为记录包含版本 5 字段。EC2 实例调用 Amazon S3 服务。流日志将在实例的网络接口上捕获。第一条记录的流向为 ingress，第二条记录的流向为 egress。对于 egress 记录，traffic-path 为 8，表示流量经过互联网网关。traffic-path 流量不支持 ingress 字段。当 pkt-srcaddr 或 pkt-dstaddr 是公有 IP 地址时，将显示服务名称。

```
5 52.95.128.179 10.0.0.71 80 34210 6 1616729292 1616729349 IPv4 14 15044 123456789012 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-0c50d5961bcb2d47b eni-1235b8ca123456789 ap-southeast-2 apse2-az3 - - ACCEPT 19 52.95.128.179 10.0.0.71 S3 - - ingress OK
5 10.0.0.71 52.95.128.179 34210 80 6 1616729292 1616729349 IPv4 7 471 123456789012 vpc-abcdefab012345678 subnet-aaaaaaaa012345678 i-0c50d5961bcb2d47b eni-1235b8ca123456789 ap-southeast-2 apse2-az3 - - ACCEPT 3 10.0.0.71 52.95.128.179 - S3 8 egress OK
```

# 流日志限制
<a name="flow-logs-limitations"></a>

要使用流日志，您需要了解以下限制：
+ 创建流日志后，在您选择的网络接口、子网或 VPC 中有活跃流量之前，将无法看到流日志数据。
+ 您不能为与您的 VPC 对等的 VPC 启用流日志，除非该对等 VPC 在您的账户中。
+ 创建流日志后，将无法更改其配置或者流日志记录格式。例如，您无法将不同的 IAM 角色与流日志关联，或者在流日志记录中添加或删除字段。不过，您可以删除流日志并使用必需的配置创建新的流日志。
+ 如果网络接口有多个 IPv4 地址，并且流量发送到辅助私有 IPv4 地址，则流日志会在 `dstaddr` 字段中显示主要私有 IPv4 地址。要捕获原始目标 IP 地址，请使用 `pkt-dstaddr` 字段创建流日志。
+ 如果流量发送到某个网络接口而目标不是网络接口 IP 地址中的任何一个，则流日志会在 `dstaddr` 字段中显示主要私有 IPv4 地址。要捕获原始目标 IP 地址，请使用 `pkt-dstaddr` 字段创建流日志。
+  如果流量是从某个网络接口发送的，并且源不是任何网络接口的 IP 地址，则当日志记录用于传出流时，流日志会在 `srcaddr` 字段中显示主要私有 IPv4 地址。要捕获原始源 IP 地址，请使用 `pkt-srcaddr` 字段创建流日志。如果日志记录用于进入网络接口的入口流，则网络接口的主要私有 IP 将不会显示在 `srcaddr` 字段中。
+ 当您的网络接口附加到[基于 Nitro 的实例](https://docs.amazonaws.cn/ec2/latest/instancetypes/ec2-nitro-instances.html)时，无论指定的最大聚合时间间隔为多少，聚合时间间隔始终不超过 1 分钟。
+ 对于 `pkt-srcaddr` 和 `pkt-dstaddr` 字段，如果中间层启用了客户端 IP 地址保留，则此字段可能会显示保留的客户端 IP，而不是中间层的 IP 地址。
+ 对于 `traffic-path` 字段，流经同一 VPC 中资源的流和流经 Outpost 本地网关的流的值相同。
+ 在聚合时间间隔内可能会跳过一些流日志记录（请参阅[可用字段](flow-log-records.md#flow-logs-fields)中的 *log-status*）。这可能是因为存在内部 Amazon 容量限制或内部错误。如果使用 Amazon Cost Explorer 查看 VPC 流日志费用，并且在流日志聚合时间间隔内跳过了一些流日志，则 Amazon Cost Explorer 中报告的流日志数量会高于 Amazon VPC 发布的流日志数量。
+ 如果您使用 [VPC 屏蔽公共访问权限（BPA）](security-vpc-bpa-assess-impact-main.md#security-vpc-bpa-fl)：
  + VPC BPA 的流日志不包括[跳过的记录](flow-logs-records-examples.md#flow-log-example-no-data)。
  + 即使您在流日志中包含 `bytes` 字段，VPC BPA 的流日志也不会包含 [`bytes`](flow-log-records.md#flow-logs-fields)。

流日志不会捕获所有 IP 流量。以下类型的流量不予以记录：
+ 实例与 Amazon DNS 服务器联系时生成的流量。如果您使用自己的 DNS 服务器，则将记录到该 DNS 服务器的所有流量。
+ Windows 实例为 Amazon Windows 许可证激活而生成的流量。
+ 实例元数据传入和传出 `169.254.169.254` 的流量。
+ Amazon Time Sync Service 的传入和传出 `169.254.169.123` 的流量。
+ DHCP 流量。
+ [镜像](https://docs.amazonaws.cn/vpc/latest/mirroring/traffic-mirroring-how-it-works.html)源流量的流量。您只会看到镜像目标流量的流量。
+ 到默认 VPC 路由器的预留 IP 地址的流量。
+ 端点网络接口和网络负载均衡器网络接口之间的流量。
+ 地址解析协议（ARP）流量。
+ 短暂性区域 NAT 网关（在创建后几分钟就会被删除）上的流量。

特定于版本 7 中可用的 ECS 字段的限制：
+ 如果底层 ECS 任务不属于流日志订阅的所有者，则不计算 ECS 字段。例如，如果您与其他账户（`AccountB`）共享子网（`SubnetA`），然后为 `SubnetA` 创建流日志订阅，则如果 `AccountB` 在共享子网中启动 ECS 任务，则您的订阅将收到来自 `AccountB` 启动的 ECS 任务的流量日志，但出于安全考虑，将不会计算这些日志的 ECS 字段。
+ 如果在 VPC/子网资源级别创建带有 ECS 字段的流日志订阅，则也会为您的订阅传输为非 ECS 网络接口生成的所有流量。对于非 ECS IP 流量，ECS 字段的值将为“-”。例如，您有一个子网（`subnet-000000`），并且为该子网创建了带有 ECS 字段（`fl-00000000`）的流日志订阅。在 `subnet-000000` 中，您可以启动一个连接到互联网并正在积极生成 IP 流量的 EC2 实例（`i-0000000`）。您还可以在同一子网中启动正在运行的 ECS 任务（`ECS-Task-1`）。由于 `i-0000000` 和 `ECS-Task-1` 都在生成 IP 流量，因此您的流日志订阅 `fl-00000000` 将为两个实体提供流量日志。但是，仅 `ECS-Task-1` 会有您在 logFormat 中包含的 ECS 字段的实际 ECS 元数据。对于 `i-0000000` 相关流量，这些字段的值将为“-”。
+ `ecs-container-id` 和 `ecs-second-container-id` 在 VPC 流日志服务从 ECS 事件流接收它们时进行排序。不能保证它们的顺序与您在 ECS 控制台或 DescribeTask API 调用中看到的顺序相同。如果容器在任务仍在运行时进入“已停止”状态，则它可能会继续出现在您的日志中。
+ ECS 元数据和 IP 流量日志来自两个不同来源。当我们从上游依赖项中获得所有所需信息后，我们立即开始计算您的 ECS 流量。在您启动新任务后，我们将开始计算您的 ECS 字段：1) 当我们收到底层网络接口的 IP 流量时；2) 当我们收到包含您的 ECS 任务元数据的 ECS 事件以表明该任务正在运行时。在您停止任务后，我们会停止计算您的 ECS 字段：1) 当我们不再收到底层网络接口的 IP 流量或收到延迟超过一天的 IP 流量时；2) 当我们收到包含您的 ECS 任务元数据的 ECS 事件以表明您的任务不再运行时。
+ 仅支持在 `awsvpc` [网络模式](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/task-networking.html)下启动的 ECS 任务。

特定于 `encryption-status` 字段的限制：
+ 由于某些网络设备对加密状态报告实施了限制，某些流中的加密状态可能为“-”（不可用）。用户在分析中可以忽略这些流量。
+ 在监控模式下显示为加密并不代表在强制模式下允许该流量。反之亦然。
  + 如果流量在监控模式下加密，可能在强制模式下不合规：
    + 如果该流量涉及由某个 Amazon 服务创建的 ENI，则该服务需要支持加密控制。
    + 如果该流量通过 VPC 对等连接传输，则对等 VPC 可能不会强制执行加密控制。
  + 如果流量在监控模式下未加密，则在将与该流量相关的服务添加为排除项的前提下，该流量在强制模式下仍可能合规。

## 定价
<a name="flow-logs-pricing"></a>

发布流日志时，将收取已出售日志的数据摄取和存档费用。有关发布已出售日志时定价的更多信息，请打开 [Amazon CloudWatch 定价](https://www.amazonaws.cn/cloudwatch/pricing/)，选择 **Logs**（日志），然后找到 **Vended Logs**（已出售日志）。

若要跟踪发布流日志所产生的费用，您可以将成本分配标签应用到目的地资源。此后，您的 Amazon 成本分配报告中就会包含按这些标签汇总的用量和成本。您可以应用代表业务类别（例如成本中心、应用程序名称或拥有者）的标签，以便整理您的成本。有关更多信息，请参阅下列内容：
+ 《Amazon Billing 用户指南》中的[使用成本分配标签](https://docs.amazonaws.cn/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)
+ 《Amazon CloudWatch Logs 用户指南》**中的 [Tag log groups in Amazon CloudWatch Logs](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#log-group-tagging)
+ 《Amazon Simple Storage Service 用户指南》**中的[使用成本分配 S3 存储桶标签](https://docs.amazonaws.cn/AmazonS3/latest/userguide/CostAllocTagging.html)
+ 《Amazon Data Firehose Developer Guide》**中的 [Tagging Your Delivery Streams](https://docs.amazonaws.cn/firehose/latest/dev/firehose-tagging.html)

# 使用流日志
<a name="working-with-flow-logs"></a>

您可以使用 Amazon EC2 和 Amazon VPC 的控制台处理流日志。

**Topics**
+ [

## 1. 借助 IAM 控制对流日志的使用
](#controlling-use-of-flow-logs)
+ [

## 2. 创建流日志
](#create-flow-log)
+ [

## 3. 标记流日志
](#modify-tags-flow-logs)
+ [

## 4. 删除流日志
](#delete-flow-log)
+ [

## 命令行概述
](#flow-logs-api-cli)

## 1. 借助 IAM 控制对流日志的使用
<a name="controlling-use-of-flow-logs"></a>

默认情况下，用户无权使用流日志。您可以创建一个 IAM 角色，并附加向该角色授予流日志创建、描述和删除权限的策略。

下面是一个示例策略，该策略向用户授予创建、描述和删除流日志的完全权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DeleteFlowLogs",
        "ec2:CreateFlowLogs",
        "ec2:DescribeFlowLogs"
      ],
      "Resource": "*"
    }
  ]
}
```

------

 有关更多信息，请参阅 [Amazon VPC 如何与 IAM 配合使用](security_iam_service-with-iam.md)。

## 2. 创建流日志
<a name="create-flow-log"></a>

您可以为 VPC、子网或网络接口创建流日志。创建流日志时，您必须为流日志指定目的地。有关更多信息，请参阅下列内容：
+ [创建发布到 CloudWatch Logs 的流日志](flow-logs-cwl-create-flow-log.md)
+ [创建发布到 Amazon S3 的流日志](flow-logs-s3-create-flow-log.md)
+ [创建发布到 Amazon Data Firehose 的流日志](flow-logs-firehose-create-flow-log.md)

## 3. 标记流日志
<a name="modify-tags-flow-logs"></a>

您可以随时为流日志添加或删除标签。

**管理流日志的标签**

1. 请执行以下操作之一：
   + 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。在导航窗格中，选择**网络接口**。选中该网络接口的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Your VPCs**(您的 VPC)。选中该 VPC 的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Subnets**(子网)。选中子网的复选框。

1. 选择 **Flow Logs**（流日志）。

1. 依次选择 **Actions**（操作）、**Manage tags**（管理标签）。

1. 若要添加新标签，请选择 **Add new tag**（添加新标签），然后输入键和值。要删除标签，请选择**移除**。

1. 添加完或删除完标签后，选择 **Save**（保存）。

## 4. 删除流日志
<a name="delete-flow-log"></a>

您可以随时删除流日志。删除流日志之后，可能需要几分钟时间才能停止收集数据。

删除流日志不会从目的地中删除日志数据，也不会修改目的地资源。您必须使用目的地服务控制台，从目的地中直接删除现有流日志数据并清理目的地资源。

**删除流日志**

1. 请执行以下操作之一：
   + 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。在导航窗格中，选择**网络接口**。选中该网络接口的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Your VPCs**(您的 VPC)。选中该 VPC 的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Subnets**(子网)。选中子网的复选框。

1. 选择 **Flow Logs**（流日志）。

1. 依次选择 **Actions**（操作）、**Delete flow logs**（删除流日志）。

1. 提示进行确认时，键入 **delete**，然后选择 **Delete**（删除）。

## 命令行概述
<a name="flow-logs-api-cli"></a>

您可以使用命令行执行此页面上介绍的任务。

**创建流日志**
+ [create-flow-logs](https://docs.amazonaws.cn/cli/latest/reference/ec2/create-flow-logs.html)（Amazon CLI）
+ [New-EC2FlowLog](https://docs.amazonaws.cn/powershell/latest/reference/items/New-EC2FlowLog.html)（Amazon Tools for Windows PowerShell）

**描述流日志**
+ [describe-flow-logs](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-flow-logs.html)（Amazon CLI）
+ [Get-EC2FlowLog](https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2FlowLog.html)（Amazon Tools for Windows PowerShell）

**标记流日志**
+ [create-tags](https://docs.amazonaws.cn/cli/latest/reference/ec2/create-tags.html) 和 [delete-tags](https://docs.amazonaws.cn/cli/latest/reference/ec2/delete-tags.html) (Amazon CLI)
+ [New-EC2Tag](https://docs.amazonaws.cn/powershell/latest/reference/items/New-EC2Tag.html) 和 [Remove-EC2Tag](https://docs.amazonaws.cn/powershell/latest/reference/items/Remove-EC2Tag.html)（Amazon Tools for Windows PowerShell）

**删除流日志**
+ [delete-flow-logs](https://docs.amazonaws.cn/cli/latest/reference/ec2/delete-flow-logs.html)（Amazon CLI）
+ [Remove-EC2FlowLog](https://docs.amazonaws.cn/powershell/latest/reference/items/Remove-EC2FlowLog.html)（Amazon Tools for Windows PowerShell）

# 将流日志发布到 CloudWatch Logs
<a name="flow-logs-cwl"></a>

流日志可以将流日志数据直接发布到 Amazon CloudWatch。Amazon CloudWatch 是一项全面的监控和可观测性服务。该服务会收集并跟踪来自多种 Amazon 资源以及您自有应用程序和服务的指标、日志和事件数据。CloudWatch 可让您了解资源利用率、应用程序性能和运行状况，让您能够检测并响应系统范围的性能变化和潜在问题。您可以利用 CloudWatch 来设置警报、可视化日志和指标，并自动做出反应来收集并优化自己的云资源。CloudWatch 是保障基于云的基础设施与应用程序的可靠性、可用性和性能的重要工具。

在发布到 CloudWatch Logs 时，流日志数据将发布到日志组，并且每个网络接口在该日志组中有唯一的日志流。日志流包含流日志记录。您可以创建将数据发布到相同日志组的多个流日志。如果相同日志组中的一个或多个流日志存在相同网络接口，其中就会有一个组合日志流。如果您指定了一个流日志应该捕获已拒绝流量，而另一个流日志应该捕获已接受流量，则组合日志流会捕获所有流量。

在 CloudWatch Logs 中，**timestamp (时间戳)** 字段对应于流日志记录中捕获的开始时间。**ingestionTime** 字段指示 CloudWatch Logs 开始接收流日志记录的日期和时间。此时间戳晚于在流日志记录中捕获的结束时间。

有关 CloudWatch Logs 的更多信息，请参阅 *Amazon CloudWatch Logs 用户指南*中的[发送到 CloudWatch Logs 的日志](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-CWL)。

**定价**  
将流日志发布到 CloudWatch Logs 时，适用已出售日志的数据引入和存档费用。有关更多信息，请打开 **Amazon CloudWatch Pricing**（Amazon CloudWatch 定价），选择 **Logs**（日志），找到 [Vended Logs](https://www.amazonaws.cn/cloudwatch/pricing/)（已出售日志）。

**Topics**
+ [

# 用于将流日志发布到 CloudWatch Logs 的 IAM 角色
](flow-logs-iam-role.md)
+ [

# 创建发布到 CloudWatch Logs 的流日志
](flow-logs-cwl-create-flow-log.md)
+ [

# 借助 CloudWatch Logs 查看流日志记录
](view-flow-log-records-cwl.md)
+ [

# 搜索流日志记录
](search-flow-log-records-cwl.md)
+ [

# 处理 CloudWatch Logs 中的流日志记录
](process-records-cwl.md)

# 用于将流日志发布到 CloudWatch Logs 的 IAM 角色
<a name="flow-logs-iam-role"></a>

与您的流日志关联的 IAM 角色必须具有足够的权限，以便将流日志发布到 CloudWatch Logs 中的指定日志组。IAM 角色必须属于您的 Amazon 账户。

附加到您的 IAM 角色的 IAM 策略必须至少包括以下权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": "*"
    }
  ]
}
```

------

确保您的角色具有以下信任策略，允许流日志服务代入该角色。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

建议您使用 `aws:SourceAccount` 和 `aws:SourceArn` 条件键来防止出现[混淆代理人问题](https://docs.amazonaws.cn/IAM/latest/UserGuide/confused-deputy.html)。例如，您可以将以下条件块添加到以前的信任策略。源账户是流日志的所有者，并且源 ARN 是流日志 ARN。如果您不知道流日志 ID，则可以用通配符（\$1）替换 ARN 的该部分，然后在创建流日志后更新策略。

```
"Condition": {
    "StringEquals": {
        "aws:SourceAccount": "account_id"
    },
    "ArnLike": {
        "aws:SourceArn": "arn:aws:ec2:region:account_id:vpc-flow-log/flow-log-id"
    }
}
```

## 为流日志创建 IAM 角色
<a name="create-flow-logs-role"></a>

如上所述，您可以更新现有角色。或者，您可以使用以下步骤创建用于流日志的新角色。您将在创建流日志时指定该角色。

**为流日志创建 IAM 角色**

1. 打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 选择**创建策略**。

1. 在**创建策略**页面上，执行以下操作：

   1. 选择 **JSON**。

   1. 将此窗口的内容替换为此部分开头的权限策略。

   1. 选择**下一步**。

   1. 输入您的策略名称以及可选的描述和标签，然后选择**创建策略**。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 对于 **Trusted entity type**（可信实体类型），选择 **Custom trust policy**（自定义信任策略）。对于 **Custom trust policy**（自定义信任策略），将 `"Principal": {},` 替换为以下内容，然后选择 **Next**（下一步）。

   ```
   "Principal": {
      "Service": "vpc-flow-logs.amazonaws.com"
   },
   ```

1. 在 **Add permissions**（添加权限）页面上，选中您在此过程中先前创建的策略复选框，然后选择 **Next**（下一步）。

1. 输入您的角色的名称，并且可以选择提供描述。

1. 选择**Create role（创建角色）**。

# 创建发布到 CloudWatch Logs 的流日志
<a name="flow-logs-cwl-create-flow-log"></a>

您可以为 VPC、子网或网络接口创建流日志。如果以使用特定 IAM 角色的用户身份执行这些步骤，请确保该角色具有使用 `iam:PassRole` 操作的权限。

**先决条件**  
验证用于发出请求的 IAM 主体是否具有调用 `iam:PassRole` 操作的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::111122223333:role/flow-log-role-name"
        }
    ]
}
```

------

**使用控制台创建流日志**

1. 请执行以下操作之一：
   + 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。在导航窗格中，选择**网络接口**。选中该网络接口的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Your VPCs**(您的 VPC)。选中该 VPC 的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Subnets**(子网)。选中子网的复选框。

1. 选择 **Actions**（操作）、**Create flow log**（创建流日志）。

1. 对于**Filter（筛选条件）**，指定要记录的流量的类型。选择**All（全部）**将记录接受和拒绝的流量，选择 **Reject（拒绝）**将仅记录被拒绝的流量，选择 **Accept（接受）**将仅记录接受的流量。

1. 对于 **Maximum aggregation interval（最大聚合时间间隔）**，选择捕获流并聚合到一个流日志记录中的最大时间段。

1. 对于**Destination（目的地）**，选择**发送到 CloudWatch Logs**。

1. 对于**目标日志组**，选择现有日志组名称或输入新日志组名称。如果您输入名称，我们会在需要记录流量时创建日志组。

1. 对于**访问服务**，请选择有权将日志发布到 CloudWatch Logs 的现有 [IAM 服务角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/access.html)，或者选择创建新的服务角色。

1. 对于**Log record format（日志记录格式）**，选定流日志记录的格式。
   + 要使用默认格式，请选择**Amazondefault format（亚马逊云科技默认格式）**。
   + 要使用自定义格式，请选择**Custom format（自定义格式）**然后从**Log format（日志格式）**选择字段。

1. 对于**其他元数据**，选择是否要以日志格式包含来自 Amazon ECS 的元数据。

1. （可选）选择**Add new tag（添加新标签）**以将标签应用于流日志。

1. 选择 **Create flow log（创建流日志）**。

**使用命令行创建流日志**

使用以下命令之一。
+ [create-flow-logs](https://docs.amazonaws.cn/cli/latest/reference/ec2/create-flow-logs.html)（Amazon CLI）
+ [New-EC2FlowLog](https://docs.amazonaws.cn/powershell/latest/reference/items/New-EC2FlowLog.html)（Amazon Tools for Windows PowerShell）

以下 Amazon CLI 示例将创建流日志，该日志将捕获指定子网的所有已接受流量。流日志将传输到指定的日志组。`--deliver-logs-permission-arn` 参数指定发布到 CloudWatch Logs 所需的 IAM 角色。

```
aws ec2 create-flow-logs --resource-type Subnet --resource-ids subnet-1a2b3c4d --traffic-type ACCEPT --log-group-name my-flow-logs --deliver-logs-permission-arn arn:aws:iam::123456789101:role/publishFlowLogs
```

# 借助 CloudWatch Logs 查看流日志记录
<a name="view-flow-log-records-cwl"></a>

您可以使用 CloudWatch Logs 控制台查看流日志记录。创建流日志之后，可能需要几分钟才能在控制台中显示。

**查看使用控制台发布到 CloudWatch Logs 的流日志记录**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.amazonaws.cn/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，依次选择 **Logs**（日志）和 **Log groups**（日志组）。

1. 选择包含流日志的日志组名称以打开其详细信息页面。

1. 选择包含流日志记录的日志流名称。有关更多信息，请参阅 [流日志记录](flow-log-records.md)。

**使用命令行查看发布到 CloudWatch Logs 的流日志记录**
+ [get-log-events](https://docs.amazonaws.cn/cli/latest/reference/logs/get-log-events.html)（Amazon CLI）
+ [Get-CWLLogEvent](https://docs.amazonaws.cn/powershell/latest/reference/items/Get-CWLLogEvent.html)（Amazon Tools for Windows PowerShell）

# 搜索流日志记录
<a name="search-flow-log-records-cwl"></a>

您可以使用 CloudWatch Logs 控制台搜索发布到 CloudWatch Logs 的流日志记录。您可以使用[度量筛选器](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html)筛选流日志记录。流日志记录用空格分隔。

**使用 CloudWatch Logs 控制台搜索流日志记录**

1. 通过以下网址打开 CloudWatch 控制台：[https://console.aws.amazon.com/cloudwatch/](https://console.amazonaws.cn/cloudwatch/)。

1. 在导航窗格中，依次选择 **Logs**（日志）和 **Log groups**（日志组）。

1. 如果您知道要搜索的网络接口，请选择包含流日志的日志组，然后选择日志流。或者，选择 **Search log group**（搜索日志组）。如果日志组中有许多网络接口，或者根据您选择的时间范围，这可能需要一些时间。

1. 在**筛选事件**下，输入以下字符串。这假定流日志记录使用[默认格式](flow-log-records.md#flow-logs-default)。

   ```
   [version, accountid, interfaceid, srcaddr, dstaddr, srcport, dstport, protocol, packets, bytes, start, end, action, logstatus]
   ```

1. 通过为字段指定值，根据需要修改筛选器。以下示例按特定的源 IP 地址进行筛选。

   ```
   [version, accountid, interfaceid, srcaddr = 10.0.0.1, dstaddr, srcport, dstport, protocol, packets, bytes, start, end, action, logstatus]
   [version, accountid, interfaceid, srcaddr = 10.0.2.*, dstaddr, srcport, dstport, protocol, packets, bytes, start, end, action, logstatus]
   ```

   以下示例按目标端口、字节数以及流量是否被拒绝进行筛选。

   ```
   [version, accountid, interfaceid, srcaddr, dstaddr, srcport, dstport = 80 || dstport = 8080, protocol, packets, bytes, start, end, action, logstatus]
   [version, accountid, interfaceid, srcaddr, dstaddr, srcport, dstport = 80 || dstport = 8080, protocol, packets, bytes >= 400, start, end, action = REJECT, logstatus]
   ```

# 处理 CloudWatch Logs 中的流日志记录
<a name="process-records-cwl"></a>

您可以像处理由 CloudWatch Logs 收集的其余日志事件一样处理流日志记录。有关监控日志数据和指标筛选条件的更多信息，请参阅《*Amazon CloudWatch Logs 用户指南*》中的 [Creating metrics from log events using filter](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/MonitoringLogData.html)。

## 示例：为流日志创建 CloudWatch 指标筛选条件和警报
<a name="flow-logs-cw-alarm-example"></a>

在此示例中，您有一个适用于 `eni-1a2b3c4d` 的流日志。您要创建一个警报，如果 1 小时内有 10 次或超过 10 次通过 TCP 端口 22（SSH） 连接到您的实例的尝试遭到拒绝，该警报将向您发出提醒。首先，您必须创建一个指标筛选条件，该指标筛选条件与为其创建警报的流量的模式相匹配。然后，您可以为该指标筛选条件创建警报。

**为已拒绝的 SSH 流量创建指标筛选条件并为该筛选条件创建警报**

1. 通过以下网址打开 CloudWatch 控制台：[https://console.aws.amazon.com/cloudwatch/](https://console.amazonaws.cn/cloudwatch/)。

1. 在导航窗格中，依次选择 **Logs**（日志）和 **Log groups**（日志组）。

1. 选中日志组对应的复选框，然后选择 **Actions**（操作）、**Create metric filter**（创建指标筛选条件）。

1. 对于 **Filter Pattern**（筛选条件模式），输入以下字符串。

   ```
   [version, account, eni, source, destination, srcport, destport="22", protocol="6", packets, bytes, windowstart, windowend, action="REJECT", flowlogstatus]
   ```

1. 对于 **Select log data to test**（选择要测试的日志数据），选择您的网络接口对应的日志流。（可选）要查看与筛选条件模式匹配的日志数据行，请选择 **Test pattern**（测试模式）。

1. 准备就绪后，选择 **Next**（下一步）。

1. 输入筛选条件名称、指标命名空间和指标名称。将指标值设置为 1。完成后，选择 **Next**（下一步），然后选择 **Create metric filter**（创建指标筛选条件）。

1. 在导航窗格中，依次选择 **Alarms**（警报）和 **All alarms**（所有警报）。

1. 选择**Create alarm（创建警报）**。

1. 选择您创建的指标名称，然后选择**选择指标**。

1. 按如下所示配置警报，然后选择 **Next**（下一步）：
   + 对于 **Statistic（统计数据）**，选择 **Sum（总计）**。这可以确保您捕获指定时间段内的数据点的总数。
   + 对于 **Period**（周期），选择 **1 hour**（1 小时）。
   + 对于**每当 TimeSinceLastActive...**，选择**大于/等于**，然后输入 10 作为阈值。
   + 对于 **Additional configuration**（其他配置）、**Datapoints to alarm**（警报的数据点数），将默认值设为 1。

1. 选择**下一步**。

1. 对于 **Notification**（通知），选择现有的 SNS 主题，或选择 **Create new topic**（新建主题）创建一个新主题。选择 **Next**（下一步）。

1. 输入警报的名称和描述，然后选择 **Next**（下一步）。

1. 预览完警报后，选择**创建警报**。

# 将流日志发布到 Amazon S3
<a name="flow-logs-s3"></a>

流日志可以将流日志数据发布到 Amazon S3。Amazon S3（Simple Storage Service）是一种高度可扩展和持久的对象存储服务。该服务专为在 Web 的任何位置存储和检索任意数量的数据而构建。S3 具有业界领先的持久性和可用性，拥有内置的数据版本控制、加密和访问控制等功能。

在发布到 Amazon S3 时，流日志数据将发布到您指定的现有 Amazon S3 存储桶。所有受监控网络接口的流日志记录将发布到存储桶中存储的一系列日志文件对象。如果流日志捕获 VPC 的数据，流日志将发布选定 VPC 中所有网络接口的流日志记录。

要创建用于流日志的 Amazon S3 存储桶，请参阅《*Amazon S3 用户指南*》中的[创建桶](https://docs.amazonaws.cn/AmazonS3/latest/userguide/create-bucket-overview.html)。

有关如何简化 VPC 流日志摄取、流日志处理和流日志可视化的更多信息，请参阅 Amazon 解决方案库中的 [Centralized Logging with OpenSearch](https://www.amazonaws.cn/solutions/implementations/centralized-logging-with-opensearch/)。

有关 CloudWatch Logs 的更多信息，请参阅《Amazon CloudWatch Logs 用户指南》**中的 [Logs sent to Amazon S3](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-S3)。

**定价**  
将流日志发布到 Amazon S3 时，适用已出售日志的数据引入和存档费用。有关更多信息，请打开 **Amazon CloudWatch Pricing**（Amazon CloudWatch 定价），选择 **Logs**（日志），找到 [Vended Logs](https://www.amazonaws.cn/cloudwatch/pricing/)（已出售日志）。

**Topics**
+ [

# 流日志文件
](flow-logs-s3-path.md)
+ [

# 针对流日志的 Amazon S3 存储桶权限
](flow-logs-s3-permissions.md)
+ [

# 与 SSE-KMS 结合使用时必需的密钥策略
](flow-logs-s3-cmk-policy.md)
+ [

# Amazon S3 日志文件权限
](flow-logs-file-permissions.md)
+ [

# 创建发布到 Amazon S3 的流日志
](flow-logs-s3-create-flow-log.md)
+ [

# 借助 Amazon S3 查看流日志记录
](view-flow-log-records-s3.md)

# 流日志文件
<a name="flow-logs-s3-path"></a>

 VPC 流日志将进出您的 VPC 的 IP 流量的相关数据收集到日志记录，并将这些记录聚合到日志文件，然后每隔 5 分钟将日志文件发布到 Amazon S3 存储桶。可能会发布多个文件，并且每个日志文件可能包含在上一个 5 分钟内记录的 IP 流量的部分或全部流日志记录。

在 Amazon S3 中，流日志文件的 **Last modified**（上次修改时间）字段指示文件上传到 Amazon S3 存储桶的日期和时间。此时间要晚于文件名中的时间戳，并且不同于将文件上传到 Amazon S3 存储桶所花费的时间。

**日志文件格式**

您可为日志文件指定下列格式之一。每个文件都被压缩为单个 Gzip 文件。
+ **Text** – 纯文本。这是默认格式。
+ **Parquet** – Apache Pparquet 是一种列式数据格式。与对纯文本数据的查询相比，对 Passic 格式的数据进行查询速度快 10 到 100 倍。使用 Gzip 压缩的 Parquet 格式的数据比 Gzip 压缩的纯文本格式的数据占用的存储空间少 20％。

**注意**  
如果采用 Gzip 压缩的 Parquet 格式的数据在每个聚合周期内小于 100 KB，则由于 Parquet 文件内存要求，以 Parquet 格式存储数据可能比采用 Gzip 压缩的纯文本占用更多的空间。

**日志文件选项**

您也可以指定以下选项。
+ **Hive 兼容的 S3 前缀** – 启用 Hive兼容的前缀，而不是将分区导入 Hive 兼容工具中。请先使用 **MSCK REPAIR TABLE** 命令，然后再运行查询。
+ **每小时分区** – 如果您有大量日志并且通常将查询定位到特定小时，则可以通过每小时对日志进行分区来获得更快的结果并节省查询成本。

**日志文件 S3 存储桶结构**  
日志文件将保存到指定的 Amazon S3 存储桶，并使用由流日志的 ID、区域、创建日期及目标选项决定的文件夹结构。

默认情况下，文件传送到以下位置。

```
bucket-and-optional-prefix/AWSLogs/account_id/vpcflowlogs/region/year/month/day/
```

如果启用 Hive 兼容的 S3 前缀，则文件将传送到以下位置。

```
bucket-and-optional-prefix/AWSLogs/aws-account-id=account_id/aws-service=vpcflowlogs/aws-region=region/year=year/month=month/day=day/
```

如果启用每小时分区，则文件将传送到以下位置。

```
bucket-and-optional-prefix/AWSLogs/account_id/vpcflowlogs/region/year/month/day/hour/
```

如果启用 Hive 兼容的分区并每小时对流日志进行分区，则文件将传送到以下位置。

```
bucket-and-optional-prefix/AWSLogs/aws-account-id=account_id/aws-service=vpcflowlogs/aws-region=region/year=year/month=month/day=day/hour=hour/
```

**日志文件名称**  
日志文件的文件名基于流日志 ID、区域以及创建日期和时间。文件名使用以下格式。

```
aws_account_id_vpcflowlogs_region_flow_log_id_YYYYMMDDTHHmmZ_hash.log.gz
```

下面显示了一个流日志的日志文件的示例，该流日志由 Amazon 账户 123456789012 创建，用于 us-east-1 区域中的资源，创建时间为 June 20, 2018 16:20 UTC。该文件包含结束时间介于 16:20:00 和 16:24:59 之间的流日志记录。

```
123456789012_vpcflowlogs_us-east-1_fl-1234abcd_20180620T1620Z_fe123456.log.gz
```

# 针对流日志的 Amazon S3 存储桶权限
<a name="flow-logs-s3-permissions"></a>

默认情况下，Amazon S3 存储桶以及其中包含的对象都是私有的。只有存储桶拥有者才能访问存储桶和其中存储的对象。不过，存储桶拥有者可以通过编写访问策略来向其他资源和用户授予访问权限。

如果创建流日志的用户拥有存储桶并且对它具有 `PutBucketPolicy` 和 `GetBucketPolicy` 权限，则我们会自动将以下策略附加到存储桶。此策略将覆盖附加到存储桶的任何现有策略。

否则，存储桶拥有者必须将此策略添加到存储桶中，以指定流日志创建者的 Amazon 账户 ID，否则流日志创建失败。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》中的[使用存储桶策略](https://docs.amazonaws.cn/AmazonS3/latest/userguide/bucket-policies.html)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "123456789012",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:us-east-1:123456789012:*"
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "123456789012"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:us-east-1:123456789012:*"
                }
            }
        }
    ]
}
```

------

您为 *my-s3-arn* 指定的 ARN 取决于您是否使用 Hive 兼容的 S3 前缀。
+ 默认前缀

  ```
  arn:aws:s3:::bucket_name/optional_folder/AWSLogs/account_id/*
  ```
+ Hive 兼容的 S3 前缀

  ```
  arn:aws:s3:::bucket_name/optional_folder/AWSLogs/aws-account-id=account_id/*
  ```

最佳实践是向日志传输服务主体（而不是单个 Amazon Web Services 账户 ARN）授予这些权限。此外，最好是使用 `aws:SourceAccount` 和 `aws:SourceArn` 条件键来防止出现[混淆代理人问题](https://docs.amazonaws.cn/IAM/latest/UserGuide/confused-deputy.html)。源账户是流日志的所有者，并且源 ARN 是日志服务的通配符（\$1） ARN。

请注意，日志传输服务调用 `HeadBucket` Amazon S3 API 操作来验证 S3 存储桶的存在及位置。您无需授予日志传输服务调用此操作的权限；即使它无法确认 S3 存储桶的存在及其位置，仍会传输 VPC 流日志。但是，CloudTrail 日志中会出现 `HeadBucket` 调用 `AccessDenied` 错误。

# 与 SSE-KMS 结合使用时必需的密钥策略
<a name="flow-logs-s3-cmk-policy"></a>

您可以通过启用 Amazon S3 托管式密钥的服务器端加密 (SSE-S3) 或 S3 存储桶上 KMS 密钥（SSE-KMS）的服务器端加密 (SSE-KMS) 来保护 Amazon S3 存储桶中的数据。有关详情，请参阅《Amazon S3 用户指南》中的[使用服务器端加密保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/serv-side-encryption.html)。

如果选择 SSE-S3，则不需要额外的配置。Amazon S3 处理加密密钥。

如果您选择 SSE-KMS，则必须使用客户自主管理型密钥 ARN。如果您使用密钥 ID，则在创建流日志时可能会遇到 [LogDestination 无法送达](flow-logs-troubleshooting.md#flow-logs-troubleshooting-kms-id) 错误。此外，您还必须更新客户自主管理型密钥的密钥政策，以确保日志传输账户可以写入您的 S3 存储桶。有关与 SSE-KMS 结合使用时必需的密钥策略的更多信息，请参阅 *Amazon CloudWatch Logs 用户指南*中的 [Amazon S3 存储桶服务器端加密](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-SSE-KMS-S3)。

# Amazon S3 日志文件权限
<a name="flow-logs-file-permissions"></a>

除了必需的存储桶策略之外，Amazon S3 使用访问控制列表（ACL） 管理对流日志创建的日志文件的访问。默认情况下，存储桶拥有者对每个日志文件具有 `FULL_CONTROL` 权限。如果日志传输拥有者与存储桶拥有者不同，则没有权限。日志传输账户具有 `READ` 和 `WRITE` 权限。有关更多信息，请参阅《*Amazon S3 用户指南*》中的[访问控制列表 (ACL) 概述](https://docs.amazonaws.cn/AmazonS3/latest/userguide/acl-overview.html)。

# 创建发布到 Amazon S3 的流日志
<a name="flow-logs-s3-create-flow-log"></a>

在您创建和配置 Amazon S3 存储桶后，您可以为网络接口、子网和 VPC 创建流日志。

**先决条件**

创建流日志的 IAM 主体必须使用具有以下权限的 IAM 角色，才能将流日志发布到目标 Amazon S3 存储桶。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogDelivery",
        "logs:DeleteLogDelivery"
      ],
      "Resource": "*"
    }
  ]
}
```

------

**使用控制台创建流日志**

1. 请执行以下操作之一：
   + 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。在导航窗格中，选择**网络接口**。选中该网络接口的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Your VPCs**(您的 VPC)。选中该 VPC 的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Subnets**(子网)。选中子网的复选框。

1. 选择 **Actions**（操作）、**Create flow log**（创建流日志）。

1. 对于 **Filter（筛选条件）**，指定要记录的 IP 流量数据的类型。
   + **已接受** – 仅记录接受的流量。
   + **已拒绝** – 仅记录拒绝的流量。
   + **All（所有流量）**– 记录接受的和拒绝的流量。

1. 对于 **Maximum aggregation interval（最大聚合时间间隔）**，选择捕获流并聚合到一个流日志记录中的最大时间段。

1. 对于 **Destination (目标)**，选择 **Send to an Amazon S3 bucket (发送到 Amazon S3 存储桶)**。

1. 对于 **S3 bucket ARN（S3 存储桶 ARN）**，指定某个现有 Amazon S3 存储桶的 Amazon Resource Name（ARN）。您可以选择包含子文件夹。例如，要指定名为 `my-logs` 的存储桶中名为 `my-bucket` 的子文件夹，请使用以下 ARN：

   `arn:aws:s3:::my-bucket/my-logs/`

   存储桶不能使用 `AWSLogs` 作为子文件夹名称，因为这是保留项。

   如果您拥有该存储桶，我们会自动创建资源策略并将它附加到该存储桶。有关更多信息，请参阅 [针对流日志的 Amazon S3 存储桶权限](flow-logs-s3-permissions.md)。

1. 对于 **Log record format（日志记录格式）**，选定流日志记录的格式。
   + 要使用默认流日志记录格式，请选择 **Amazon default format（亚马逊云科技默认格式）**。
   + 要创建自定义格式，请选择**Custom format**（自定义格式）。对于**Log format**（日志行格式），选择要包括在流日志记录中的字段。

1. 对于**其他元数据**，选择是否要以日志格式包含来自 Amazon ECS 的元数据。

1. 对于 **Log file format（日志文件格式）**，指定日志文件的格式。
   + **Text** – 纯文本。这是默认格式。
   + **Parquet** – Apache Pparquet 是一种列式数据格式。与对纯文本数据的查询相比，对 Passic 格式的数据进行查询速度快 10 到 100 倍。使用 Gzip 压缩的 Parquet 格式的数据比 Gzip 压缩的纯文本格式的数据占用的存储空间少 20％。

1. （可选）要使用 Hive 兼容的 S3 前缀，请选择 **Hive-compatible S3 prefix（Hive 兼容的 S3 前缀）**、**Enable（启用）**。

1. （可选）要每小时对流日志进行分区，请选择 **Every 1 hour（60 mins）（每 1 小时（60 分钟））**。

1. （可选）要向流日志添加标签，请选择 **Add new tag（添加新标签）**并指定标签键和值。

1. 选择 **Create flow log（创建流日志）**。

**使用命令行创建发布到 Amazon S3 的流日志**

使用以下命令之一：
+ [create-flow-logs](https://docs.amazonaws.cn/cli/latest/reference/ec2/create-flow-logs.html)（Amazon CLI）
+ [New-EC2FlowLog](https://docs.amazonaws.cn/powershell/latest/reference/items/New-EC2FlowLog.html)（Amazon Tools for Windows PowerShell）

以下 Amazon CLI 示例将创建流日志，以捕获指定 VPC 的所有流量并将流日志传输到指定 Amazon S3 存储桶。`--log-format` 参数指定流日志记录的自定义格式。

```
aws ec2 create-flow-logs --resource-type VPC --resource-ids vpc-00112233344556677 --traffic-type ALL --log-destination-type s3 --log-destination arn:aws:s3:::flow-log-bucket/custom-flow-logs/ --log-format '${version} ${vpc-id} ${subnet-id} ${instance-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${tcp-flags} ${type} ${pkt-srcaddr} ${pkt-dstaddr}'
```

# 借助 Amazon S3 查看流日志记录
<a name="view-flow-log-records-s3"></a>

您可以使用 Amazon S3 控制台查看流日志记录。创建流日志之后，可能需要几分钟才能在控制台中显示。

日志文件是压缩文件。如果您使用 Amazon S3 控制台打开这些日志文件，则将对其进行解压缩，并且将显示流日志记录。如果您下载这些文件，则必须对其进行解压才能查看流日志记录。

**查看发布到 Amazon S3 的流日志记录**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择存储桶的名称以打开其详细信息页面。

1. 导航到包含日志文件的文件夹。例如，*prefix*/AWSLogs/*account\$1id*/vpcflowlogs/*region*/*year*/*month*/*day*/。

1. 选中文件名旁边的复选框，然后选择 **Download**（下载）。

您还可以使用 Amazon Athena 查询日志文件中的流日志记录。Amazon Athena 是一种交互式查询服务，让您能够更轻松地使用标准 SQL 分析 Amazon S3 中的数据。有关更多信息，请参阅 *Amazon Athena 用户指南* 中的[查询 Amazon VPC 流日志](https://docs.amazonaws.cn/athena/latest/ug/vpc-flow-logs.html)。

# 将流日志发布到 Amazon Data Firehose
<a name="flow-logs-firehose"></a>

流日志可以将流日志数据直接发布到 Amazon Data Firehose。Amazon Data Firehose 是一项完全托管的服务，可收集、转换实时数据流并将此类数据流传送到各种 Amazon 数据存储和分析服务中。该服务可代表您处理数据摄取任务。

就 VPC 流日志而言，Firehose 非常适用。VPC 流日志可捕获有关在 VPC 中传入和传出网络接口的 IP 流量的信息。此类数据对于安全监控、性能分析和监管合规性至关重要。不过，管理这种持续日志数据流的存储和处理可能是一项复杂的资源密集型任务。

通过将 Firehose 与 VPC 流日志集成，您可以将此类数据传输到首选目标，例如 Amazon S3 或 Amazon Redshift。Firehose 会就处理 VPC 流日志摄取、转换和传输等任务进行扩展，从而减轻您的运营负担，让您可以专注于分析日志和获取洞察，而不必担心底层基础设施。

此外，Firehose 还提供数据转换、压缩和加密等功能，可以提高 VPC 流日志处理管道的效率和安全性。将 Firehose 用于 VPC 流日志可以简化数据管理工作，让您能够从网络流量数据中获得洞察。

流日志数据发布到 Amazon Data Firehose 时，会以纯文本格式发布到 Amazon Data Firehose 传输流。

**定价**  
将收取标准摄取和传输费用。有关更多信息，请打开 **Amazon CloudWatch Pricing**（Amazon CloudWatch 定价），选择 **Logs**（日志），找到 [Vended Logs](https://www.amazonaws.cn/cloudwatch/pricing/)（已出售日志）。

**Topics**
+ [

# 用于跨账户传输的 IAM 角色
](firehose-cross-account-delivery.md)
+ [

# 创建发布到 Amazon Data Firehose 的流日志
](flow-logs-firehose-create-flow-log.md)

# 用于跨账户传输的 IAM 角色
<a name="firehose-cross-account-delivery"></a>

发布到 Amazon Data Firehose 时，您可以选择与要监控的资源位于同一账户（源账户）或不同账户（目的地账户）中的传输流。要启用跨账户将流日志传输到 Amazon Data Firehose，您必须在源账户中创建 IAM 角色，并在目的地账户中创建 IAM 角色。

**Topics**
+ [

## 源账户角色
](#firehose-source-account-role)
+ [

## 目的地账户角色
](#firehose-destination-account-role)

## 源账户角色
<a name="firehose-source-account-role"></a>

在源账户中，创建授予以下权限的角色。在此示例中，角色的名称为 `mySourceRole`，但您也可以为该角色选择其他名称。最后一条语句允许目的地账户中的角色代入该角色。条件语句确保该角色仅传递给日志传输服务，并且仅在监控指定资源时传递。创建策略时，使用条件键 `iam:AssociatedResourceARN` 指定要监控的 VPC、网络接口或子网。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::123456789012:role/mySourceRole",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "delivery.logs.amazonaws.com"
                },
                "StringLike": {
                    "iam:AssociatedResourceARN": [
                        "arn:aws:ec2:us-east-1:123456789012:vpc/vpc-00112233344556677"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogDelivery",
                "logs:DeleteLogDelivery",
                "logs:ListLogDeliveries",
                "logs:GetLogDelivery"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::111122223333:role/AWSLogDeliveryFirehoseCrossAccountRole"
        }
    ]
}
```

------

确保该角色具有以下信任策略，允许日志传输服务代入该角色。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

使用以下步骤从源账户中创建角色。

**创建源账户角色**

1. 打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 选择**创建策略**。

1. 在**创建策略**页面上，执行以下操作：

   1. 选择 **JSON**。

   1. 将此窗口的内容替换为此部分开头的权限策略。

   1. 选择**下一步**。

   1. 输入您的策略名称以及可选的描述和标签，然后选择**创建策略**。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 对于 **Trusted entity type**（可信实体类型），选择 **Custom trust policy**（自定义信任策略）。对于 **Custom trust policy**（自定义信任策略），将 `"Principal": {},` 替换为以下内容，以指定日志传输服务。选择**下一步**。

   ```
   "Principal": {
      "Service": "delivery.logs.amazonaws.com"
   },
   ```

1. 在 **Add permissions**（添加权限）页面上，选中您在此过程中先前创建的策略复选框，然后选择 **Next**（下一步）。

1. 输入您的角色的名称，并且可以选择提供描述。

1. 选择**Create role（创建角色）**。

## 目的地账户角色
<a name="firehose-destination-account-role"></a>

在目的地账户中，创建名称以 **AWSLogDeliveryFirehoseCrossAccountRole** 开头的角色。该角色必须授予以下权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
          "iam:CreateServiceLinkedRole",
          "firehose:TagDeliveryStream"
      ],
      "Resource": "*"
    }
  ]
}
```

------

确保该角色具有以下信任策略，允许您在源账户中创建的角色代入该角色。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/mySourceRole"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

使用以下步骤从目的地账户中创建角色。

**创建目的地账户角色**

1. 打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 选择**创建策略**。

1. 在**创建策略**页面上，执行以下操作：

   1. 选择 **JSON**。

   1. 将此窗口的内容替换为此部分开头的权限策略。

   1. 选择**下一步**。

   1. 输入以 **AWSLogDeliveryFirehoseCrossAccountRole** 为开头的策略名称，然后选择 **Create policy**（创建策略）。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 对于 **Trusted entity type**（可信实体类型），选择 **Custom trust policy**（自定义信任策略）。对于 **Custom trust policy**（自定义信任策略），将 `"Principal": {},` 替换为以下内容，以指定源账户角色。选择**下一步**。

   ```
   "Principal": {
      "AWS": "arn:aws:iam::source-account:role/mySourceRole"
   },
   ```

1. 在 **Add permissions**（添加权限）页面上，选中您在此过程中先前创建的策略复选框，然后选择 **Next**（下一步）。

1. 输入您的角色的名称，并且可以选择提供描述。

1. 选择**Create role（创建角色）**。

# 创建发布到 Amazon Data Firehose 的流日志
<a name="flow-logs-firehose-create-flow-log"></a>

您可以为 VPC、子网或网络接口创建流日志。

**先决条件**
+ 创建目的地 Amazon Data Firehose 传输流。使用 **Direct Put** 作为来源。有关更多信息，请参阅[创建 Amazon Data Firehose 传输流](https://docs.amazonaws.cn/firehose/latest/dev/basic-create.html)。
+ 创建流日志的账户使用的 IAM 角色必须授予下列权限，以将流日志发布到 Amazon Data Firehose。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "logs:CreateLogDelivery",
                  "logs:DeleteLogDelivery",
                  "iam:CreateServiceLinkedRole",
                  "firehose:TagDeliveryStream"
              ],
              "Resource": "*"
          }
      ]
  }
  ```

------
+ 要将流日志发布到不同账户，请创建所需的 IAM 角色，如 [用于跨账户传输的 IAM 角色](firehose-cross-account-delivery.md) 中所述。

**创建发布到 Amazon Data Firehose 的流日志**

1. 请执行以下操作之一：
   + 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。在导航窗格中，选择**网络接口**。选中该网络接口的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Your VPCs**(您的 VPC)。选中该 VPC 的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Subnets**(子网)。选中子网的复选框。

1. 选择 **Actions**（操作）、**Create flow log**（创建流日志）。

1. 对于**Filter（筛选条件）**，指定要记录的流量的类型。
   + **Accepted**（已接受）– 仅记录接受的流量
   + **Rejected**（已拒绝）– 仅记录拒绝的流量
   + **All**（所有流量）– 记录接受和拒绝的流量

1. 对于 **Maximum aggregation interval（最大聚合时间间隔）**，选择捕获流并聚合到一个流日志记录中的最大时间段。

1. 对于 **Destination**（目的地），请选择下列选项之一：
   + **发送到同一个账户中的 Amazon Data Firehose** – 传输流和要监控的资源位于同一账户中。
   + **发送到不同账户中的 Amazon Data Firehose** – 传输流和要监控的资源位于不同账户中。

1. 对于 **Amazon Data Firehose** 流名称，选择您创建的传输流。

1. [仅限跨账户传输] 对于**服务访问**，请选择具有发布日志权限的现有 [IAM 服务角色进行跨账户传输](firehose-cross-account-delivery.md)，或者选择**设置权限**以打开 IAM 控制台并创建服务角色。

1. 对于 **Log record format（日志记录格式）**，选定流日志记录的格式。
   + 要使用默认流日志记录格式，请选择 **Amazon default format（亚马逊云科技默认格式）**。
   + 要创建自定义格式，请选择**Custom format**（自定义格式）。对于**Log format**（日志行格式），选择要包括在流日志记录中的字段。

1. 对于**其他元数据**，选择是否要以日志格式包含来自 Amazon ECS 的元数据。

1. （可选）选择**添加标签**以将标签应用于流日志。

1. 选择 **Create flow log（创建流日志）**。

**使用命令行创建发布到 Amazon Data Firehose 的流日志**

使用以下命令之一：
+ [create-flow-logs](https://docs.amazonaws.cn/cli/latest/reference/ec2/create-flow-logs.html)（Amazon CLI）
+ [New-EC2FlowLog](https://docs.amazonaws.cn/powershell/latest/reference/items/New-EC2FlowLog.html)（Amazon Tools for Windows PowerShell）

以下 Amazon CLI 示例将创建流日志，用于捕获指定 VPC 的所有流量，并将流日志传输到同一账户中的指定 Amazon Data Firehose 传输流。

```
aws ec2 create-flow-logs --traffic-type ALL \
  --resource-type VPC \
  --resource-ids vpc-00112233344556677 \
  --log-destination-type kinesis-data-firehose \
  --log-destination arn:aws:firehose:us-east-1:123456789012:deliverystream/flowlogs_stream
```

以下 Amazon CLI 示例将创建流日志，用于捕获指定 VPC 的所有流量，并将流日志传输到不同账户中的指定 Amazon Data Firehose 传输流。

```
aws ec2 create-flow-logs --traffic-type ALL \
  --resource-type VPC \
  --resource-ids vpc-00112233344556677 \
  --log-destination-type kinesis-data-firehose \
  --log-destination arn:aws:firehose:us-east-1:123456789012:deliverystream/flowlogs_stream \
  --deliver-logs-permission-arn arn:aws:iam::source-account:role/mySourceRole \ 
  --deliver-cross-account-role arn:aws:iam::destination-account:role/AWSLogDeliveryFirehoseCrossAccountRole
```

由于创建了流日志，您可以从为传输流配置的目标获取流日志数据。

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

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

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

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

**Topics**
+ [

# 使用控制台生成 CloudFormation 模板
](flow-logs-generate-template-console.md)
+ [

# 使用 Amazon 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 进行集成。

**要求**
+ 选择的区域必须支持 Amazon 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 堆栈）**，以在 Amazon 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 角色。

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

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

使用下面的 [get-flow-logs-integration-template](https://docs.amazonaws.cn/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.amazonaws.cn/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 模板提供了一组预定义查询，您可以运行这些查询，以快速获取有关Amazon网络中的流量的有意义见解。创建堆栈并验证所有资源都创建正确后，您可以运行其中一个预定义查询。

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

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 地址记录的流量。

# VPC 流日志疑难解答
<a name="flow-logs-troubleshooting"></a>

下面是您在使用流日志时可能遇到的问题。

**Topics**
+ [

## 未完成的流日志记录
](#flow-logs-troubleshooting-incomplete-records)
+ [

## 流日志处于活动状态，但没有流日志记录或日志组
](#flow-logs-troubleshooting-no-log-group)
+ [

## “LogDestinationNotFoundException”或“Access Denied for LogDestination”错误
](#flow-logs-troubleshooting-not-found)
+ [

## 超出 Amazon S3 存储桶策略限制
](#flow-logs-troubleshooting-policy-limit)
+ [

## LogDestination 无法送达
](#flow-logs-troubleshooting-kms-id)
+ [

## 流日志数据大小与账单数据不匹配
](#flow-logs-data-size-mismatch)

## 未完成的流日志记录
<a name="flow-logs-troubleshooting-incomplete-records"></a>

**问题**  
您的流日志记录不完整或者已不再发布。

**原因**  
将流日志传送到 CloudWatch Logs 日志组时可能会出现问题，或者[可能存在 SkipData 条目](flow-logs-records-examples.md#flow-log-example-no-data)。

**解决方案**  
查看 VPC、子网或网络接口的**流日志**选项卡。请注意，您无法描述与您共享的 VPC 或子网的流日志，但可以描述在与您共享的 VPC 或子网中由您创建的网络接口的流日志。如果存在任何错误，将会在**状态**列中显示。或者，使用 [describe-flow-logs](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-flow-logs.html) 命令，然后检查 `DeliverLogsErrorMessage` 字段中返回的值。

状态可能出现的错误值如下所示：
+ `Rate limited`：如果应用了 CloudWatch Logs 日志节流，则当某个网络接口的流日志记录数超过了可以在特定时间范围内发布的最大记录数时，会出现此错误。如果已达到您可创建的 CloudWatch Logs 日志组数量的配额，也可能出现此错误。有关更多信息，请参阅[《Amazon CloudWatch 用户指南》](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/cloudwatch_limits.html)中的 *CloudWatch 服务配额*。
+ `Access error`：出现此错误的原因为以下之一：
  + 您的流日志的 IAM 角色没有足够的权限，无法将流日志记录发布到 CloudWatch 日志组
  + IAM 角色与流日志服务没有信任关系
  + 信任关系不指定用作委托人的流日志服务

  有关更多信息，请参阅 [用于将流日志发布到 CloudWatch Logs 的 IAM 角色](flow-logs-iam-role.md)。
+ `Unknown error`：流日志服务中出现内部错误。

## 流日志处于活动状态，但没有流日志记录或日志组
<a name="flow-logs-troubleshooting-no-log-group"></a>

**问题**  
您已创建流日志，并且 Amazon VPC 或 Amazon EC2 控制台会将流日志显示为 `Active`。但是，您无法看到 CloudWatch Logs 中的任何日志流或 Amazon S3 存储桶中的日志文件。

**可能的原因**
+ 流日志仍在创建中。在某些情况下，当您为要创建的日志组创建流日志后，有时会需要数十分钟或更长时间才会显示数据。
+ 还没有为您的网络接口记录任何流量。只有在记录流量时，才会创建 CloudWatch Logs 中的日志组。

**解决方案**  
等待几分钟，以便系统创建日志组，或者记录流量。

## “LogDestinationNotFoundException”或“Access Denied for LogDestination”错误
<a name="flow-logs-troubleshooting-not-found"></a>

**问题**  
当您创建流日志时，会出现 `Access Denied for LogDestination` 或 `LogDestinationNotFoundException` 错误。

**可能的原因**
+ 创建将数据发布到 Amazon S3 存储桶的流日志时，此错误表示找不到指定的 S3 存储桶或存储桶策略不允许将日志传送到存储桶。
+ 创建将数据发布到 Amazon CloudWatch Logs 的流日志时，此错误表示 IAM 角色不允许将日志传送到日志组。

**解决方案**
+ 发布到 Amazon S3 时，请确保您指定了现有 S3 存储桶的 ARN，并且该 ARN 的格式正确。如果您不拥有 S3 存储桶，请验证[存储桶策略](flow-logs-s3-permissions.md)具有所需的权限，并在 ARN 中使用正确的账户 ID 和存储桶名称。
+ 发布到 CloudWatch Logs 时，请验证 [IAM 角色](flow-logs-iam-role.md)具有所需的权限。

## 超出 Amazon S3 存储桶策略限制
<a name="flow-logs-troubleshooting-policy-limit"></a>

**问题**  
在您尝试创建流日志时收到了以下错误：`LogDestinationPermissionIssueException`

**可能的原因**  
Amazon S3 存储桶策略有 20 KB 的大小限制。

每次创建发布到 Amazon S3 存储桶的流日志时，我们都会自动将指定的存储桶 ARN（包括文件夹路径）添加到存储桶策略中的 `Resource` 元素。

创建发布到同一个存储桶的多个流日志可能会导致超出存储桶策略限制。

**解决方案**
+ 通过删除不再需要的流日志条目来清理存储桶策略。
+ 通过使用以下内容替换各个流日志条目，为整个存储桶授予权限。

  ```
  arn:aws:s3:::bucket_name/*
  ```

  如果您授予整个存储桶的权限，则新的流日志订阅不会向存储桶策略添加新权限。

## LogDestination 无法送达
<a name="flow-logs-troubleshooting-kms-id"></a>

**问题**  
在您尝试创建流日志时收到了以下错误：`LogDestination <bucket name> is undeliverable`

**可能的原因**  
目标 Amazon S3 存储桶将使用 Amazon KMS（SSE-KMS）和服务器端加密进行加密，并且存储桶的默认加密方式为 KMS 密钥 ID。

**解决方案**  
该值必须为 KMS 密钥 ARN。将默认 S3 加密类型从 KMS 密钥 ID 更改为 KMS 密钥 ARN。有关更多信息，请参阅《Amazon Simple Storage Service 控制台用户指南》中的 [配置默认加密](https://docs.amazonaws.cn/AmazonS3/latest/userguide/default-bucket-encryption.html)**。

## 流日志数据大小与账单数据不匹配
<a name="flow-logs-data-size-mismatch"></a>

**问题**  
流日志的总数据大小与账单数据报告的大小不匹配。

**可能的原因**  
您的流日志中可能有 SKIPDATA 条目。有关 SKIPDATA 条目的说明，请参阅 [无数据和跳过的记录](flow-logs-records-examples.md#flow-log-example-no-data)。

**解决方案**  
通过在日志状态字段中查询日志中的不同条目，确认日志条目中是否存在 SKIPDATA 条目。

检查 SKIPDATA 的示例查询：

CW Insights：

```
fields @timestamp, @message, @logStream, @log
| filter interfaceId = 'eni-123'
| stats count(*) by interfaceId, logStatus
| sort by interfaceId, logStatus
```

Athena：

```
SELECT log_status, interface_id, count(1)
FROM vpc_flow_logs
WHERE interface_id IN ('eni-1', 'eni-2', 'eni-3')
GROUP BY log_status, interface_id
```