

# 在 AWS Global Accelerator 中配置和使用流日志
<a name="monitoring-global-accelerator.flow-logs"></a>

流日志允许您在 AWS Global Accelerator 中捕获有关进出加速器中的网络接口的 IP 地址流量的信息。流日志数据将发布到 Amazon S3，创建流日志后，您可以在其中检索和查看您的数据。

**注意**  
您必须在控制台中或使用 AWS CLI 查看美国西部（俄勒冈州）区域中 Global Accelerator 的 CloudWatch 指标和日志。使用 AWS CLI 时，请通过加入以下参数为您的命令指定美国西部（俄勒冈州）区域：`--region us-west-2`。

流日志可帮助您处理许多任务。例如，您可以排查特定流量未到达端点的原因，这反过来可帮助您诊断限制过于严格的安全组规则。您还可以使用流日志作为安全工具来监视到达您的端点的流量。

流日志记录代表您的流日志中的网络流。每个记录捕获特定捕获窗口中的特定 5 元组的网络流。5 元组是一组 5 个不同的值，用于指定 IP 流的源、目标和协议。捕获窗口是一段持续时间，在这段时间内流日志服务会聚合数据，然后再发布流日志记录。捕获窗口最长为 1 分钟。也就是说，日志的发布频率可能会高于每分钟一次，但至少每分钟发布一次。

使用流日志时会收取 CloudWatch Logs 费用，即使日志直接发布到 Amazon S3。有关更多信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)页面上*日志*选项卡中的*已出售日志*。

**提示**  
将 Amazon Athena 和 Amazon QuickSight 与 Global Accelerator 流日志数据配合使用，可以帮助您解决应用程序的可达性问题、识别安全漏洞，以及概要了解用户如何访问您的应用程序。要了解更多信息，请参阅以下 AWS 博客文章：[Analyzing and visualizing AWS Global Accelerator flow logs using Amazon Athena and Amazon QuickSight](https://aws.amazon.com/blogs/networking-and-content-delivery/analyzing-and-visualizing-aws-global-accelerator-flow-logs-using-amazon-athena-and-amazon-quicksight/)。

**Topics**
+ [启用流日志](#monitoring-global-accelerator.flow-logs-publishing-S3.enable)
+ [处理流日志记录](#monitoring-global-accelerator.flow-logs-publishing-S3.processing)
+ [发布到 Amazon S3](#monitoring-global-accelerator.flow-logs-publishing-S3)
+ [日志文件时间](#monitoring-global-accelerator.flow-logs.timing)
+ [流日志记录语法](#monitoring-global-accelerator.flow-logs.records.syntax)

## 启用将流日志发布到 Amazon S3 的功能
<a name="monitoring-global-accelerator.flow-logs-publishing-S3.enable"></a>

要在 AWS Global Accelerator 中启用流日志，请执行此程序中的步骤。本章的其它章节提供了配置 Amazon S3 存储桶和设置权限的步骤，以便可以发布和访问流日志。

## 在 AWS Global Accelerator 中启用流日志的步骤


1. 在 AWS 账户中为流日志创建 Amazon S3 存储桶。

1. 为启用流日志的 AWS 用户添加所需的 IAM 策略。有关更多信息，请参阅 [用于将流日志发布到 Amazon S3 的 IAM 角色](#monitoring-global-accelerator.flow-logs-publishing-S3.roles)。

1. 使用您要在日志文件中使用的 Amazon S3 存储桶名称和前缀运行以下 AWS CLI 命令：

   ```
   aws globalaccelerator update-accelerator-attributes 
          --accelerator-arn arn:aws:globalaccelerator::012345678901:accelerator/1234abcd-abcd-1234-abcd-1234abcdefgh 
          --region us-west-2
          --flow-logs-enabled
          --flow-logs-s3-bucket s3-bucket-name 
          --flow-logs-s3-prefix s3-bucket-prefix
   ```

## 处理 Amazon S3 中的流日志记录
<a name="monitoring-global-accelerator.flow-logs-publishing-S3.processing"></a>

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

## 将流日志发布到 Amazon S3
<a name="monitoring-global-accelerator.flow-logs-publishing-S3"></a>

发布到 Amazon S3 的 AWS Global Accelerator 流日志将发布到您指定的现有 S3 存储桶。流日志记录将发布到在存储桶中存储的一系列日志文件对象。

要创建用于流日志的 Amazon S3 存储桶，请参阅《Amazon Simple Storage Service 用户指南》**中的[创建您的第一个 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)。

### 流日志文件
<a name="monitoring-global-accelerator.flow-logs-publishing-S3.files"></a>

流日志收集流日志记录，将它们合并到日志文件，然后每隔 5 分钟将日志文件发布到 Amazon S3 存储桶。也就是说，日志文件每 5 分钟写入一次，并且每个日志文件包含在上一个 5 分钟内记录的 IP 地址流量的流日志记录。

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

日志文件将保存到指定的 Amazon S3 存储桶，并使用由流日志的 ID、区域及其创建日期决定的文件夹结构。存储桶文件夹结构使用以下格式：

```
s3-bucket_name/s3-bucket-prefix/AWSLogs/aws_account_id/globalaccelerator/region/yyyy/mm/dd/
```

同样，流日志文件名由流日志的 ID、区域及其创建日期和时间决定。文件名使用以下格式：

```
aws_account_id_globalaccelerator_accelerator_id_flow_log_id_timestamp_hash.log.gz
```

请注意以下有关日志文件的文件夹和文件名结构的信息：
+ 时间戳使用 `YYYYMMDDTHHmmZ` 格式。
+ 如果您为 S3 存储桶前缀指定斜杠（/），则日志文件存储桶文件夹结构将包含双斜杠（//），如下所示：

  ```
  s3-bucket_name//AWSLogs/aws_account_id
  ```

以下示例显示了 AWS 账户 `123456789012` 于 UTC 时间 2018 年 11 月 23 日 00:05 为 ID 为 `1234abcd-abcd-1234-abcd-1234abcdefgh` 的加速器创建的流日志的日志文件的文件夹结构和文件名。

```
amzn-s3-demo-bucket/prefix1/AWSLogs/123456789012/globalaccelerator/us-west-2/2018/11/23/123456789012_globalaccelerator_1234abcd-abcd-1234-abcd-1234abcdefgh_20181123T0005Z_1fb1234.log.gz
```

单个流日志文件包含具有多条 5 元组记录的交错条目，即：`client_ip`、`client_port`、`accelerator_ip`、`accelerator_port`、`protocol`。要查看加速器的所有流日志文件，请查找 `accelerator_id` 和您的 `account_id` 汇总的条目。

### 用于将流日志发布到 Amazon S3 的 IAM 角色
<a name="monitoring-global-accelerator.flow-logs-publishing-S3.roles"></a>

IAM 主体（例如，IAM 角色或用户）必须具有足够的权限才能将流日志发布到 Amazon S3 存储桶。IAM 策略必须包含以下权限：

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DeliverLogs",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogDelivery",
                "logs:DeleteLogDelivery"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowGlobalAcceleratorService",
            "Effect": "Allow",
            "Action": [
                "globalaccelerator:*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "s3Perms",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketPolicy",
                "s3:PutBucketPolicy"
            ],
            "Resource": "*"
        }
    ]
}
```

### 针对流日志的 Amazon S3 存储桶权限
<a name="monitoring-global-accelerator.flow-logs-publishing-S3.bucket-permissions"></a>

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

如果创建流日志的用户拥有存储桶，服务会自动向存储桶附加以下策略，以授予流日志将日志发布到存储桶的权限。

```
{
    "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": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {"Service": "delivery.logs.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::bucket_name"
        }
    ]
}
```

如果创建流日志的用户不拥有存储桶，也没有存储桶的 `GetBucketPolicy` 和 `PutBucketPolicy` 权限，流日志创建操作会失败。在这种情况下，存储桶拥有者必须手动将上述策略添加到存储桶，并指定流日志创建者的 AWS 账户 ID。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用 Amazon S3 控制台添加存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/gsg/add-bucket-policy.html)。如果存储桶从多个账户接收流日志，则将 `Resource` 元素条目添加到每个账户的 `AWSLogDeliveryWrite` 策略声明。

例如，以下存储桶策略允许 AWS 账户 123123123123 和 456456456456 将流日志发布到 `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": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {"Service": "delivery.logs.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::log-bucket"
        }
    ]
}
```

**注意**  
我们建议您向日志传输服务主体（而不是单个 AWS 账户 ARN）授予 `AWSLogDeliveryAclCheck` 和 `AWSLogDeliveryWrite` 权限。

### 与 SSE-KMS 存储桶结合使用时必需的 CMK 密钥策略
<a name="monitoring-global-accelerator.flow-logs-publishing-S3.encrypt-kms"></a>

如果使用具有客户托管的 CMK 的 AWS KMS 托管密钥（SSE-KMS）为 Amazon S3 存储桶启用了服务器端加密，则必须将以下内容添加到 CMK 的密钥政策中，以便流日志可以将日志文件写入存储桶。

```
{
    "Sid": "Allow AWS Global Accelerator Flow Logs to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": [
            "delivery.logs.amazonaws.com"
        ]
    },
    "Action": "kms:GenerateDataKey*",
    "Resource": "*"
}
```

### Amazon S3 日志文件权限
<a name="monitoring-global-accelerator.flow-logs-publishing-S3.log-file-permissions"></a>

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

## 日志文件传输时间
<a name="monitoring-global-accelerator.flow-logs.timing"></a>

AWS Global Accelerator 每小时最多可为配置好的加速器提交数次日志文件。一般而言，流日志文件包含有关加速器在给定时间段内收到的请求的信息。Global Accelerator 通常会在日志中所显示事件发生后的一个小时内将该时间段内的日志文件传输至 Amazon S3 存储桶。某个时间段内的某些或所有日志文件条目有时可延迟长达 24 小时。当日志条目延迟后，Global Accelerator 会将它们保存在其文件名包括请求发生时间段的日期和时间（而不是文件传输日期和时间）的日志文件中。

创建日志文件时，Global Accelerator 会在日志文件涵盖的时间段内从收到请求的所有边缘站点整合加速器信息。

Global Accelerator 在您启用日志记录后大约四个小时开始可靠地传输日志文件。您可能会获得一些在此时间之前的日志文件。

**注意**  
如果在此期间没有用户连接您的加速器，您就不会收到该期间的任何日志文件。

## 流日志记录语法
<a name="monitoring-global-accelerator.flow-logs.records.syntax"></a>

流日志记录是以空格分隔的字符串，采用以下格式：

 `<version> <aws_account_id> <accelerator_id> <client_ip> <client_port> <accelerator_ip> <accelerator_port> <endpoint_ip> <endpoint_port> <protocol> <ip_address_type> <packets> <bytes> <start_time> <end_time> <action> <log-status> <globalaccelerator_source_ip> <globalaccelerator_source_port> <endpoint_region> <globalaccelerator_region> <direction> <vpc_id>` 

版本 1.0 格式不包括 VPC 标识符 `vpc_id`。版本 2.0 格式（包括 `vpc_id`）是在 Global Accelerator 向启用了客户端 IP 地址保留的端点发送流量时生成的。

下表描述了流日志记录的各个字段。


****  

| 字段 | 描述 | 
| --- | --- | 
| `version` | 流日志版本。 | 
| `aws_account_id` | 流日志的 AWS 账户 ID。 | 
| `accelerator_id` | 已记录其流量的加速器的 ID。 | 
| `client_ip` | 源 IPv4 或 IPv6 地址。 | 
| `client_port` | 源端口。 | 
| `accelerator_ip` | 加速器的 IP 地址。 | 
| `accelerator_port` | 加速器的端口。 | 
| `endpoint_ip` | 流量的目标 IP 地址。 | 
| `endpoint_port` | 流量的目标端口。 | 
| `protocol` | 流量的 IANA 协议编号。有关更多信息，请参阅[分配的 Internet 协议编号](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)。 | 
| `ip_address_type` | IPv4 或 IPv6。 | 
| `packets` | 捕获窗口中传输的数据包的数量。当数据包数量为 0（零）时，流处于活动状态，但在捕获窗口中不显示该方向上的数据包。 | 
| `bytes` | 捕获窗口中传输的字节数。 | 
| `start_time` | 捕获窗口启动的时间，采用 Unix 秒的格式。 | 
| `end_time` | 捕获窗口结束的时间，采用 Unix 秒的格式。 | 
| `action` | 与流量关联的操作： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/global-accelerator/latest/dg/monitoring-global-accelerator.flow-logs.html)  | 
| `log-status` | 流日志的日志记录状态： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/global-accelerator/latest/dg/monitoring-global-accelerator.flow-logs.html)  | 
| `globalaccelerator_source_ip` | Global Accelerator 网络接口使用的 IP 地址。如果启用了客户端 IP 地址保留，则此值将设置为“-”（连字符）。 有关更多信息，请参阅 [在 AWS Global Accelerator 中保留客户端 IP 地址](preserve-client-ip-address.md)。 | 
| `globalaccelerator_source_port` | Global Accelerator 网络接口使用的端口。如果启用了客户端 IP 地址保留，则此值设置为 0（零）。 有关更多信息，请参阅 [在 AWS Global Accelerator 中保留客户端 IP 地址](preserve-client-ip-address.md)。 | 
| `endpoint_region` | 端点所在的 AWS 区域。 | 
| `globalaccelerator_region` | 已对请求进行处理的边缘站点（接入点）。每个边缘站点代码均由含三个字母的代码和一个任意分配的数字组成，例如 DFW3。三个字母代码通常对应邻近节点位置的机场的国际航空协会机场代码。（这些缩写将来可能会更改。） | 
| `direction` | 流量方向。表示进入 Global Accelerator 网络（`INGRESS`）或返回客户端（`EGRESS`）的流量。 | 
| `vpc_id` | VPC 标识符。当 Global Accelerator 向启用了客户端 IP 地址保留的端点发送流量时，会包含在版本 2.0 流日志中。 | 

如果某个字段不适用于特定记录，则记录会针对该条目显示一个“-”符号。