

# 将流日志发布到 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.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

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

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

**定价**  
将流日志发布到 Amazon S3 时，适用已出售日志的数据引入和存档费用。有关更多信息，请打开 **Amazon CloudWatch Pricing**（Amazon CloudWatch 定价），选择 **Logs**（日志），找到 [Vended Logs](https://aws.amazon.com/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
```

下面显示了一个流日志的日志文件的示例，该流日志由 AWS 账户 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` 权限，则我们会自动将以下策略附加到存储桶。此策略将覆盖附加到存储桶的任何现有策略。

否则，存储桶拥有者必须将此策略添加到存储桶中，以指定流日志创建者的 AWS 账户 ID，否则流日志创建失败。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》中的[使用存储桶策略](https://docs.aws.amazon.com/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/*
  ```

最佳实践是向日志传输服务主体（而不是单个 AWS 账户 ARN）授予这些权限。此外，最好是使用 `aws:SourceAccount` 和 `aws:SourceArn` 条件键来防止出现[混淆代理人问题](https://docs.aws.amazon.com/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.aws.amazon.com/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.aws.amazon.com/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.aws.amazon.com/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.aws.amazon.com/ec2/)。在导航窗格中，选择**网络接口**。选中该网络接口的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 打开 Amazon VPC 控制台。在导航窗格中，选择 **Your VPCs**(您的 VPC)。选中该 VPC 的复选框。
   + 通过 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/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（日志记录格式）**，选定流日志记录的格式。
   + 要使用默认流日志记录格式，请选择 **AWS 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.aws.amazon.com/cli/latest/reference/ec2/create-flow-logs.html)（AWS CLI）
+ [New-EC2FlowLog](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2FlowLog.html)（AWS Tools for Windows PowerShell）

以下 AWS 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.aws.amazon.com/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.aws.amazon.com/athena/latest/ug/vpc-flow-logs.html)。