将流日志发布到 Amazon S3 - Amazon Virtual Private Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

将流日志发布到 Amazon S3

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

将流日志发布到 Amazon S3 时,适用已出售日志的数据引入和存档费用。有关更多信息,请参阅 Amazon CloudWatch 定价

要创建用于流日志的 Amazon S3 存储桶,请参阅《Amazon Simple Storage Service 用户指南》中的创建存储桶

有关多账户日志记录的更多信息,请参阅 Amazon 解决方案库中的集中日志记录

流日志文件

VPC 流日志收集流日志记录,将它们合并到日志文件,然后每隔 5 分钟将日志文件发布到 Amazon S3 存储桶。每个日志文件包含在上一个 5 分钟期间内记录的 IP 流量的流日志记录。

日志文件的最大文件大小为 75 MB。如果日志文件在 5 分钟期间内达到文件大小限制,流日志会停止向它添加流日志记录。然后将它发布到 Amazon S3 存储桶,并创建一个新的日志文件。

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

日志文件格式

您可为日志文件指定下列格式之一。每个文件都被压缩为单个 Gzip 文件。

  • Text – 纯文本。这是默认格式。

  • Parquet – Apache Pparquet 是一种列式数据格式。与对纯文本数据的查询相比,对 Passic 格式的数据进行查询速度快 10 到 100 倍。使用 Gzip 压缩的 Parquet 格式的数据比 Gzip 压缩的纯文本格式的数据占用的存储空间少 20%。

日志文件选项

您也可以指定以下选项。

  • 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/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/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 的 IAM 委托人的 IAM 策略

您账户中的 IAM 委托人(例如,IAM 用户)必须具有足够的权限才能将流日志发布到 Amazon S3 存储桶。这包括使用特定 logs: 操作以创建和发布流日志的权限。IAM 策略必须包含以下权限。

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

针对流日志的 Amazon S3 存储桶权限

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

以下存储桶策略授予流日志向其发布日志的权限。如果存储桶已经有一个策略具有以下权限,则该策略将按原样保留。我们建议您向日志传输服务委托人(而不是单个Amazon账户 ARN)授予这些权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSLogDeliveryWrite", "Effect": "Allow", "Principal": {"Service": "delivery.logs.amazonaws.com"}, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::bucket_name/optional_folder/AWSLogs/account_id/*", "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}} }, { "Sid": "AWSLogDeliveryCheck", "Effect": "Allow", "Principal": {"Service": "delivery.logs.amazonaws.com"}, "Action": ["s3:GetBucketAcl", "s3:ListBucket"], "Resource": "arn:aws:s3:::bucket_name" } ] }

如果创建流日志的用户拥有存储桶、具有存储桶的 PutBucketPolicy 权限且存储桶不包括具有足够日志传送权限的策略,则我们会自动将前述策略附加到存储桶。此策略将覆盖附加到存储桶的任何现有策略。

如果创建流日志的用户不拥有存储桶,也没有存储桶的 GetBucketPolicyPutBucketPolicy 权限,流日志创建操作会失败。在这种情况下,存储桶拥有者必须手动将上述策略添加到存储桶,并指定流日志创建者的Amazon账户 ID。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的如何添加 S3 存储桶策略? 如果存储桶从多个账户接收流日志,则将 Resource 元素条目添加到每个账户的 AWSLogDeliveryWrite 策略声明。例如,以下存储桶策略允许Amazon账户 123123123123456456456456 将流日志发布到 log-bucket 存储桶中的 flow-logs 文件夹。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSLogDeliveryWrite", "Effect": "Allow", "Principal": {"Service": "delivery.logs.amazonaws.com"}, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::log-bucket/flow-logs/AWSLogs/123123123123/*", "arn:aws:s3:::log-bucket/flow-logs/AWSLogs/456456456456/*" ], "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}} }, { "Sid": "AWSLogDeliveryCheck", "Effect": "Allow", "Principal": {"Service": "delivery.logs.amazonaws.com"}, "Action": ["s3:GetBucketAcl", "s3:ListBucket"], "Resource": "arn:aws:s3:::log-bucket" } ] }

与 SSE-KMS 结合使用时必需的密钥策略

您可以通过启用 Amazon S3 托管式密钥的服务器端加密(SSE-S3)或 KMS 密钥的服务器端加密(SSE-KMS)来保护 Amazon S3 存储桶中的数据。有关详情,请参阅 Amazon S3 用户指南中的使用服务器端加密保护数据

通过 SSE-KMS,您可以使用 Amazon 托管式密钥或客户托管式密钥。使用 Amazon 托管式密钥,您无法使用跨账户传输。流日志是从日志传输账户传输的,因此您必须授予跨账户传输的访问权限。要授予对 S3 存储桶的跨账户访问权限,请在启用存储桶加密时使用客户托管式密钥并指定客户托管式密钥的 Amazon Resource Name(ARN)。有关详情,请参阅《Amazon S3 用户指南》中的使用 Amazon KMS 指定服务器端加密

当您将 SSE-KMS 与客户托管式密钥结合使用时,必须将以下内容添加到密钥的密钥策略(不是 S3 存储桶的存储桶策略)中,以便 VPC 流日志可以写入 S3 存储桶。

{ "Sid": "Allow VPC Flow Logs to use the key", "Effect": "Allow", "Principal": { "Service": [ "delivery.logs.amazonaws.com" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }

Amazon S3 日志文件权限

除了必需的存储桶策略之外,Amazon S3 使用访问控制列表 (ACL) 管理对流日志创建的日志文件的访问。默认情况下,存储桶拥有者对每个日志文件具有 FULL_CONTROL 权限。如果日志传输拥有者与存储桶拥有者不同,则没有权限。日志传输账户具有 READWRITE 权限。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的访问控制列表(ACL)概述

创建发布到 Amazon S3 的流日志

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

使用控制台为网络接口创建流日志

  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择 Network Interfaces

  3. 选中一个或多个网络接口的复选框。

  4. 选择 Actions(操作)Create flow log(创建流日志)

  5. 配置流日志设置。有关更多信息,请参阅配置流日志设置

使用控制台为子网创建流日志

  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

  2. 在导航窗格中,选择 Subnets (子网)

  3. 选中一个或多个子网的复选框。

  4. 选择 Actions(操作)Create flow log(创建流日志)

  5. 配置流日志设置。有关更多信息,请参阅配置流日志设置

使用控制台为 VPC 创建流日志

  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

  2. 在导航窗格中,选择 Your VPCs

  3. 选中一个或多个 VPC 的复选框。

  4. 选择 Actions(操作)Create flow log(创建流日志)

  5. 配置流日志设置。有关更多信息,请参阅配置流日志设置

使用控制台配置流日志设置

  1. 对于 Filter (筛选条件),指定要记录的 IP 流量数据的类型。

    • Accepted(已接受)– 仅记录接受的流量。

    • Rejected(已拒绝)– 仅记录拒绝的流量。

    • All(所有流量)– 记录接受的和拒绝的流量。

  2. 对于 Maximum aggregation interval (最大聚合时间间隔),选择捕获流并聚合到一个流日志记录中的最大时间段。

  3. 对于 Destination(目的地),选择 Send to an S3 bucket(发送到 S3 存储桶)

  4. 对于 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 存储桶权限

  5. 对于 Log record format(日志记录格式),选定流日志记录的格式。

    • 要使用默认流日志记录格式,请选择 Amazon default format (亚马逊云科技默认格式)

    • 要创建自定义格式,请选择自定义格式。对于日志行格式,选择要包括在流日志记录中的字段。

    • 要创建包括默认格式字段的自定义流日志,请选择 Amazon default format(亚马逊云科技默认格式),复制 Format preview(格式预览)中的字段,然后选择 Custom format(自定义格式)并将字段粘贴到文本框中。

  6. 对于 Log file format(日志文件格式),指定日志文件的格式。

    • Text – 纯文本。这是默认格式。

    • Parquet – Apache Pparquet 是一种列式数据格式。与对纯文本数据的查询相比,对 Passic 格式的数据进行查询速度快 10 到 100 倍。使用 Gzip 压缩的 Parquet 格式的数据比 Gzip 压缩的纯文本格式的数据占用的存储空间少 20%。

  7. (可选)要使用 Hive 兼容的 S3 前缀,请选择 Hive-compatible S3 prefix(Hive 兼容的 S3 前缀)Enable(启用)

  8. (可选)要每小时对流日志进行分区,请选择 Every 1 hour (60 mins)(每 1 小时 (60 分钟))

  9. (可选)要向流日志添加标签,请选择 Add new tag(添加新标签)并指定标签键和值。

  10. 选择 Create flow log (创建流日志)

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

使用以下命令之一。

以下 Amazon CLI 示例创建流日志,以捕获 VPC vpc-00112233344556677 的所有流量并将流日志传送到名为 flow-log-bucket 的 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/my-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 中的流日志记录

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

您还可以使用 Amazon Athena 查询日志文件中的流日志记录。Amazon Athena 是一种交互式查询服务,让您能够更轻松地使用标准 SQL 分析 Amazon S3 中的数据。有关更多信息,请参阅 Amazon Athena 用户指南 中的查询 Amazon VPC 流日志