

# CloudFront 和边缘函数日志记录
<a name="logging"></a>

Amazon CloudFront 提供不同类型的日志记录。您可以记录到达您的 CloudFront 分配的查看器请求，也可以在 AWS 账户中记录 CloudFront 服务活动（API 活动）。您还可以从 CloudFront Functions 和 Lambda @Edge 函数获取日志。

## 记录请求
<a name="logging-requests"></a>

CloudFront 提供了以下方法来记录到达分配的请求。

**访问日志（标准日志）**  
CloudFront 访问日志提供有关向分配发出的每个请求的详细记录。您可以将日志用于安全和访问审计等场景。  
CloudFront 访问日志将传输到您指定的传输目标。  
在需要完成以下任务时，可使用访问日志：  
+ 进行历史分析和报告
+ 满足安全性审计与合规性要求
+ 实现经济实惠的长期日志保留
有关更多信息，请参阅 [访问日志（标准日志）](AccessLogs.md)。

**实时访问日志**  
CloudFront 实时访问日志会在接收到请求后的数秒内完成传输，并且可实时提供有关向分配发出的请求的信息。您可以选择实时访问日志的*采样率*，即希望接收实时访问日志记录的请求的百分比。您还可以选择希望在日志记录中接收的特定字段。实时访问日志非常适合实时监控内容分发性能。  
CloudFront 实时访问日志将传送到 Amazon Kinesis Data Streams 中您选择的数据流。CloudFront 除了收取因使用 Kinesis Data Streams 产生的费用外，还针对实时访问日志进行收费。  
在以下需求场景下，可使用实时访问日志：  
+ 实时监控并发送警报
+ 实时控制面板与运营洞察
有关更多信息，请参阅 [使用实时访问日志](real-time-logs.md)。

**连接日志**  
连接日志为已启用 mTLS 的分配提供有关服务器和客户端之间的连接的详细信息。通过查看连接日志，可以了解客户端证书信息、mTLS 身份验证失败的原因以及已允许还是拒绝连接。  
与访问日志（标准日志）类似，连接日志将传输到您指定的传输目标。  
 要启用连接日志，您必须先为分配[启用 mTLS](mtls-authentication.md)。
在需要完成以下任务时，可使用连接日志：  
+ 了解 TLS 握手过程中连接成功或失败的原因 
+ 获取客户端证书信息
有关更多信息，请参阅 [使用连接日志实现可观测性](connection-logs.md)。

## 记录边缘函数
<a name="logging-edge-functions"></a>

可以使用 Amazon CloudWatch Logs 获取边缘函数（包括 Lambda@Edge 和 CloudFront Functions）的日志。可以使用 CloudWatch 控制台或 CloudWatch Logs API 访问日志。有关更多信息，请参阅 [边缘函数日志](edge-functions-logs.md)。

## 记录服务活动
<a name="logging-service-activity"></a>

您可以使用 AWS CloudTrail 在您的 AWS 账户中记录 CloudFront 服务活动（API 活动）。CloudTrail 提供了用户、角色或 AWS 服务在 CloudFront 中所执行 API 操作的记录。使用 CloudTrail 收集的信息，您可以确定向 CloudFront 发出了什么 API 请求、发出请求的 IP 地址、何人发出的请求、发出请求的时间以及其他详细信息。

有关更多信息，请参阅 [使用 AWS CloudTrail 记录 Amazon CloudFront API 调用](logging_using_cloudtrail.md)。

有关日志记录的更多信息，请参阅以下主题：

**Topics**
+ [记录请求](#logging-requests)
+ [记录边缘函数](#logging-edge-functions)
+ [记录服务活动](#logging-service-activity)
+ [访问日志（标准日志）](AccessLogs.md)
+ [使用实时访问日志](real-time-logs.md)
+ [边缘函数日志](edge-functions-logs.md)
+ [使用 AWS CloudTrail 记录 Amazon CloudFront API 调用](logging_using_cloudtrail.md)

# 访问日志（标准日志）
<a name="AccessLogs"></a>

您可以配置 CloudFront 使其创建日志文件，其中包含有关 CloudFront 接收的每个用户（查看器）请求的详细信息。这些日志称为*访问日志*，也称为*标准日志*。

每个日志都包含各种信息，例如，收到请求的时间、处理时间、请求路径和服务器响应。您可以使用这些访问日志来分析服务性能和排查问题。

下图显示了 CloudFront 如何记录有关对您的对象的请求的信息。在本示例中，分配配置为将访问日志发送到 Amazon S3 存储桶。

![\[访问日志的基本流程\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/images/Logging.png)


1. 在此示例中，您有 A 和 B 两个网站，以及两个对应的 CloudFront 分配。用户使用与您的分配相关联的 URL 来请求您的对象。

1. CloudFront 会将每个请求路由到适当的边缘站点。

1. CloudFront 将每个请求的数据写入分配特定的日志文件。在本示例中，与分配 A 相关的请求信息将写入分配 A 的日志文件，与分配 B 相关的请求信息将写入分配 B 的日志文件。

1. CloudFront 会定期将有关分配的日志文件保存在您启用日志记录时指定的 Amazon S3 存储桶。然后，CloudFront 开始将有关后续请求的信息保存在关于该分配的新日志文件中。

   如果在给定时间内没有查看器访问您的内容，您在该时间内不会接收任何日志文件。

**注意**  
建议您使用日志来了解内容的请求性质，而不是作为所有请求的完整描述。CloudFront 将尽力提供访问日志。特定请求的日志条目可能会在实际处理该请求之后很久才进行传输，而且极少数情况下，可能根本不会传输日志条目。当访问日志中省略了日志条目时，访问日志中的条目数将与 AWS 账单和使用率报告中出现的使用率不匹配。

CloudFront 支持两个版本的标准日志记录。标准日志记录（旧版）*仅*支持将您的访问日志发送到 Amazon S3。标准日志记录（v2）支持其他传输目标。您可以为分配配置两个日志记录选项或其中之一。有关更多信息，请参阅以下主题：

**Topics**
+ [配置标准日志记录（v2）](standard-logging.md)
+ [配置标准日志记录（旧版）](standard-logging-legacy-s3.md)
+ [标准日志记录引用](standard-logs-reference.md)

**提示**  
CloudFront 还提供了实时访问日志，可以实时向您提供有关向分配发出的请求的信息（日志在收到请求后的几秒钟内传输）。您可以使用实时访问日志来进行监控和分析，并根据内容交付性能采取相应措施。有关更多信息，请参阅 [使用实时访问日志](real-time-logs.md)。

# 配置标准日志记录（v2）
<a name="standard-logging"></a>

您可以在创建或更新分配时启用访问日志（标准日志）。标准日志记录（v2）包括以下功能：
+ 将访问日志传输到 Amazon CloudWatch Logs、Amazon Data Firehose 和 Amazon Simple Storage Service（Amazon S3）。
+ 选择所需的日志字段。您也可以选择[实时访问日志字段的子集](#standard-logging-real-time-log-selection)。
+ 选择其他[输出日志文件](#supported-log-file-format)格式。

如果您使用 Amazon S3，则有以下可选功能：
+ 发送日志到选择的 AWS 区域。
+ 通过分区整理日志。
+ 启用与 Hive 兼容的文件名。

有关更多信息，请参阅 [将日志发送到 Amazon S3](#send-logs-s3)。

要开始使用标准日志记录，请完成以下步骤：

1. 为将接收您的日志的指定 AWS 服务 设置所需权限。

1. 使用 CloudFront 控制台或 CloudWatch API 配置标准日志记录。

1. 查看您的访问日志。

**注意**  
如果您启用标准日志记录（v2），这不会影响或更改标准日志记录（旧版）。对于您的分配，在使用标准日志记录（v2）之外，您还可以继续使用标准日志记录（旧版）。有关更多信息，请参阅 [配置标准日志记录（旧版）](standard-logging-legacy-s3.md)。
如果您已经启用了标准日志记录（旧版），并且想要启用在 Amazon S3 中进行标准日志记录（v2），我们建议您指定*不同*的 Amazon S3 存储桶，或在同一存储桶中使用*单独的路径*（例如，使用日志前缀或分区）。这可以帮助您跟踪哪些日志文件与哪个分配相关联，并防止日志文件相互覆盖。

## 权限
<a name="permissions-standard-logging"></a>

CloudFront 使用 CloudWatch 公开发布的日志来传输访问日志。为此，您需要具有指定 AWS 服务 的权限才能启用日志记录传输。

要查看在各个日志记录目标上需要的权限，请选择《Amazon CloudWatch Logs User Guide》**中的以下主题。
+ [CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-CloudWatchLogs)
+ [Firehose](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-Firehose)
+ [Amazon S3](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-S3)

在您设置了日志记录目标上的权限后，您可以为分配启用标准日志记录。

**注意**  
CloudFront 支持向不同 AWS 账户（跨账户）发送访问日志。要启用跨账户传输，两个账户（您的账户和接收账户）都必须具有所需的权限。有关更多信息，请参阅[为跨账户传输启用标准日志记录](#enable-standard-logging-cross-accounts)一节或《Amazon CloudWatch Logs User Guide》**中的 [Cross-account delivery example](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#vended-logs-crossaccount-example)。

## 启用标准日志记录
<a name="set-up-standard-logging"></a>

要启用标准日志记录，您可以使用 CloudFront 控制台或 CloudWatch API。

**Contents**
+ [启用标准日志记录（CloudFront 控制台）](#access-logging-console)
+ [启用标准日志记录（CloudWatch API）](#enable-access-logging-api)

### 启用标准日志记录（CloudFront 控制台）
<a name="access-logging-console"></a>

**为 CloudFront 分配启用标准日志记录（控制台）**

1. 使用 CloudFront 控制台[更新现有分配](HowToUpdateDistribution.md#HowToUpdateDistributionProcedure)。

1. 选择**日志记录**选项卡。

1. 选择**添加**，然后选择要接收日志的服务：
   + CloudWatch Logs
   + Firehose
   + Amazon S3

1. 对于**目标**，选择您的服务的资源。如果您尚未创建资源，则可以选择**创建**或查看以下文档。
   + 对于 CloudWatch Logs，输入**[日志组名称](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)**。
   + 对于 Firehose，输入 **[Firehose 传输流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)**。
   + 对于 Amazon S3，输入**[存储桶名称](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)**。
**提示**  
要指定前缀，请在存储桶名称之后输入前缀，例如 `amzn-s3-demo-bucket.s3.amazonaws.com/MyLogPrefix`。如果您未指定前缀，CloudFront 会自动为您添加前缀。有关更多信息，请参阅 [将日志发送到 Amazon S3](#send-logs-s3)。

1. 对于**其他设置 – *可选***，您可以指定以下选项：

   1. 对于**字段选择**，请选择要传输到目标的日志字段名称。您可以选择[访问日志字段](standard-logs-reference.md#BasicDistributionFileFormat)以及[实时访问日志字段](#standard-logging-real-time-log-selection)的子集。

   1. （仅限 Amazon S3）对于**分区**，请指定日志文件数据分区的路径。

   1. （仅限 Amazon S3）对于**与 Hive 兼容的文件格式**，您可以选中复选框，使用与 Hive 兼容的 S3 路径。这有助于简化将新数据加载到与 Hive 兼容的工具中的过程。

   1. 对于**输出格式**，指定您偏好的格式。
**注意**  
如果您选择 **Parquet**，则需要将您的访问日志转换为 Apache Parquet，因而此选项会产生 CloudWatch 费用。有关更多信息，请参阅 [CloudWatch 定价中的“公开日志”部分](https://aws.amazon.com/cloudwatch/pricing/)。

   1. 在**字段分隔符**中，指定如何分隔日志字段。

1. 完成更新或创建分配的步骤。

1. 要添加其它目标，请重复步骤 3–6。

1. 在**日志**页面中，验证分配旁边的标准日志状态是否为**已启用**。

1. （可选）要启用 Cookie 日志记录，请选择**管理**、**设置**并开启 **Cookie 日志记录**，然后选择**保存更改**。
**提示**  
Cookie 日志记录是一项全局设置，应用到您的分配的*所有*标准日志记录。您不能为单独的传输目标覆盖此设置。

有关标准日志传输和日志字段的更多信息，请参阅[标准日志记录引用](standard-logs-reference.md)。

### 启用标准日志记录（CloudWatch API）
<a name="enable-access-logging-api"></a>

您还可以使用 CloudWatch API 来为分配启用标准日志记录。

**备注**  
在调用 CloudWatch API 以启用标准日志记录时，您必须指定美国东部（弗吉尼亚州北部）区域（`us-east-1`），即使您想要启用跨区域传输到其他目标也是如此。例如，如果您要将访问日志发送到欧洲地区（爱尔兰）区域的 S3 存储桶（`eu-west-1`），请使用 `us-east-1` 区域的中的 CloudWatch API。
系统还提供了一个选项，用于在标准日志记录中包含 Cookie。在 CloudFront API 中，这是 `IncludeCookies` 参数。如果您使用 CloudWatch API 配置访问日志并指定要包含 Cookie，则必须使用 CloudFront 控制台或 CloudFront API 来更新您的分配以包含 Cookie。否则，CloudFront 无法向您的日志目标发送 Cookie。有关更多信息，请参阅 [Cookie 日志记录](DownloadDistValuesGeneral.md#DownloadDistValuesCookieLogging)。

**为分配启用标准日志记录（CloudWatch API）**

1. 在您创建分配之后，需要获取 Amazon 资源名称（ARN）。

   您可以在 CloudFront 控制台的**分配**页面中找到 ARN，也可以使用 [GetDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_GetDistribution.html) API 操作。分配 ARN 遵循以下格式：`arn:aws:cloudfront::123456789012:distribution/d111111abcdef8`

1. 接下来，使用 CloudWatch [PutDeliverySource](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html) API 操作为分配创建传输源。

   1. 输入传输源的名称。

   1. 传递分配的 `resourceArn`。

   1. 对于 `logType`，指定 `ACCESS_LOGS` 作为要收集的日志的类型。

   1.   
**Example AWS CLI put-delivery-source 命令示例**  

      以下示例为分配配置传输源。

      ```
      aws logs put-delivery-source --name S3-delivery --resource-arn arn:aws:cloudfront::123456789012:distribution/d111111abcdef8 --log-type ACCESS_LOGS
      ```

      **Output**

      ```
      {
       "deliverySource": {
       "name": "S3-delivery",
       "arn": "arn:aws:logs:us-east-1:123456789012:delivery-source:S3-delivery",
       "resourceArns": [
       "arn:aws:cloudfront::123456789012:distribution/d111111abcdef8"
       ],
       "service": "cloudfront",
       "logType": "ACCESS_LOGS"
       }
      }
      ```

1. 使用 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html) API 操作配置日志的存储位置。

   1. 对于 `destinationResourceArn`，指定目标的 ARN。这可以是 CloudWatch 日志组、Firehose 传输流或 Amazon S3 存储桶。

   1. 对于 `outputFormat`，请指定日志的输出格式。

   1.   
**Example AWS CLI put-delivery-destination 命令示例**  

      以下示例将传输目标配置为 Amazon S3 存储桶。

      ```
      aws logs put-delivery-destination --name S3-destination --delivery-destination-configuration destinationResourceArn=arn:aws:s3:::amzn-s3-demo-bucket
      ```

      **Output**

      ```
      {
          "name": "S3-destination",
          "arn": "arn:aws:logs:us-east-1:123456789012:delivery-destination:S3-destination",
          "deliveryDestinationType": "S3",
          "deliveryDestinationConfiguration": {
              "destinationResourceArn": "arn:aws:s3:::amzn-s3-demo-bucket"
          }
      }
      ```
**注意**  
如果您要跨账户传输日志，则必须使用 [PutDeliveryDestinationPolicy](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html) API 操作，将 AWS Identity and Access Management（IAM）策略分配到目标账户。IAM 策略支持将日志从一个账户传输到另一个账户。

1. 使用 [CreateDelivery](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html) API 操作，将传输源关联到您在前面的步骤中创建的目标。此 API 操作会将传输源与最终目标关联起来。

   1. 对于 `deliverySourceName`，指定源名称。

   1. 对于 `deliveryDestinationArn`，指定传输目标的 ARN。

   1. 对于 `fieldDelimiter`，指定用于分隔各日志字段的字符串。

   1. 对于 `recordFields`，指定所需的日志字段。

   1. 如果您使用 S3，请指定是否使用 `enableHiveCompatiblePath` 和 `suffixPath`。  
**Example AWS CLI create-delivery 命令示例**  

   以下示例创建传输。

   ```
   aws logs create-delivery --delivery-source-name cf-delivery --delivery-destination-arn arn:aws:logs:us-east-1:123456789012:delivery-destination:S3-destination
   ```

   **Output**

   ```
   {
       "id": "abcNegnBoTR123",
       "arn": "arn:aws:logs:us-east-1:123456789012:delivery:abcNegnBoTR123",
       "deliverySourceName": "cf-delivery",
       "deliveryDestinationArn": "arn:aws:logs:us-east-1:123456789012:delivery-destination:S3-destination",
       "deliveryDestinationType": "S3",
       "recordFields": [
           "date",
           "time",
           "x-edge-location",
           "sc-bytes",
           "c-ip",
           "cs-method",
           "cs(Host)",
           "cs-uri-stem",
           "sc-status",
           "cs(Referer)",
           "cs(User-Agent)",
           "cs-uri-query",
           "cs(Cookie)",
           "x-edge-result-type",
           "x-edge-request-id",
           "x-host-header",
           "cs-protocol",
           "cs-bytes",
           "time-taken",
           "x-forwarded-for",
           "ssl-protocol",
           "ssl-cipher",
           "x-edge-response-result-type",
           "cs-protocol-version",
           "fle-status",
           "fle-encrypted-fields",
           "c-port",
           "time-to-first-byte",
           "x-edge-detailed-result-type",
           "sc-content-type",
           "sc-content-len",
           "sc-range-start",
           "sc-range-end",
           "c-country",
           "cache-behavior-path-pattern"
       ],
        "fieldDelimiter": ""
   }
   ```

1. 在 CloudFront 控制台的**日志**页面中，验证分配旁边的标准日志状态是否为**已启用**。

   有关标准日志传输和日志字段的更多信息，请参阅[标准日志记录引用](standard-logs-reference.md)。

**注意**  
要使用 AWS CloudFormation 为 CloudFront 启用标准日志记录（v2），您可以使用以下 CloudWatch Logs 属性：  
[Delivery](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-delivery.html)
[DeliveryDestination](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-deliverydestination.html)
[DeliverySource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-deliverysource.html)
`ResourceArn` 是 CloudFront 分配，`LogType` 必须是支持的日志类型的 `ACCESS_LOGS`。

## 为跨账户传输启用标准日志记录
<a name="enable-standard-logging-cross-accounts"></a>

如果您为 AWS 账户启用了标准日志记录功能，并且希望将访问日志传输到其它账户，请确保正确配置源账户和目标账户。CloudFront 分配的*源账户*将其访问日志发送到*目标账户*。

在此示例过程中，源账户（*111111111111*）将其访问日志发送到目标账户（*222222222222*）中的 Amazon S3 存储桶。要将访问日志发送到目标账户中的 Amazon S3 存储桶，请使用 AWS CLI。

### 配置目标账户
<a name="steps-destination-account"></a>

对于目标账户，请完成以下过程。

**配置目标账户**

1. 要创建日志传输目标，您可以输入以下 AWS CLI 命令。此示例使用 `MyLogPrefix` 字符串为您的访问日志创建前缀。

   ```
   aws logs put-delivery-destination --name cloudfront-delivery-destination --delivery-destination-configuration "destinationResourceArn=arn:aws:s3:::amzn-s3-demo-bucket-cloudfront-logs/MyLogPrefix"
   ```

   **Output**

   ```
   {
       "deliveryDestination": {
           "name": "cloudfront-delivery-destination",
           "arn": "arn:aws:logs:us-east-1:222222222222:delivery-destination:cloudfront-delivery-destination",
           "deliveryDestinationType": "S3",
           "deliveryDestinationConfiguration": {"destinationResourceArn": "arn:aws:s3:::amzn-s3-demo-bucket-cloudfront-logs/MyLogPrefix"}
       }
   }
   ```
**注意**  
如果您指定 S3 存储桶而*不带*前缀，CloudFront 会自动附加 `AWSLogs/<account-ID>/CloudFront` 作为前缀，该前缀显示在 S3 传输目标的 `suffixPath` 中。有关更多信息，请参阅 [S3DeliveryConfiguration](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_S3DeliveryConfiguration.html)。

1. 为日志传输目标添加资源策略，以允许源账户创建日志传输。

   在以下策略中，将 *111111111111* 替换为源账户 ID，并指定步骤 1 输出中的传输目标 ARN。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowCreateDelivery",
               "Effect": "Allow",
               "Principal": {"AWS": "111111111111"},
               "Action": ["logs:CreateDelivery"],
               "Resource": "arn:aws:logs:us-east-1:222222222222:delivery-destination:cloudfront-delivery-destination"
           }
       ]
   }
   ```

------

1. 保存文件，例如 `deliverypolicy.json`。

1. 要将之前的策略附加到传输目标，请输入以下 AWS CLI 命令。

   ```
   aws logs put-delivery-destination-policy --delivery-destination-name cloudfront-delivery-destination --delivery-destination-policy file://deliverypolicy.json
   ```

1. 将以下语句添加到目标 Amazon S3 存储桶策略中，替换资源 ARN 和源账户 ID。此策略允许 `delivery.logs.amazonaws.com` 服务主体执行 `s3:PutObject` 操作。

   ```
   {
       "Sid": "AWSLogsDeliveryWrite",
       "Effect": "Allow",
       "Principal": {"Service": "delivery.logs.amazonaws.com"},
       "Action": "s3:PutObject",
       "Resource": "arn:aws:s3:::amzn-s3-demo-bucket-cloudfront-logs/*",
       "Condition": {
           "StringEquals": {
               "s3:x-amz-acl": "bucket-owner-full-control",
               "aws:SourceAccount": "111111111111"
           },
           "ArnLike": {"aws:SourceArn": "arn:aws:logs:us-east-1:111111111111:delivery-source:*"}
       }
   }
   ```

1. 如果您为存储桶使用 AWS KMS，请在 KMS 密钥策略中添加以下语句，用于向 `delivery.logs.amazonaws.com` 服务主体授予权限。

   ```
   {
       "Sid": "Allow Logs Delivery to use the key",
       "Effect": "Allow",
       "Principal": {"Service": "delivery.logs.amazonaws.com"},
       "Action": [
           "kms:Encrypt",
           "kms:Decrypt",
           "kms:ReEncrypt*",
           "kms:GenerateDataKey*",
           "kms:DescribeKey"
       ],
       "Resource": "*",
       "Condition": {
           "StringEquals": {"aws:SourceAccount": "111111111111"},
           "ArnLike": {"aws:SourceArn": "arn:aws:logs:us-east-1:111111111111:delivery-source:*"}
       }
   }
   ```

### 配置源账户
<a name="steps-source-account"></a>

配置目标账户之后，请按照以下过程创建传输源，并在源账户中为分配启用日志记录。

**配置源账户**

1. 为 CloudFront 标准日志记录创建传输源，以便您可以将日志文件发送到 CloudWatch Logs。

   您可以输入以下 AWS CLI 命令，替换名称和您的分配 ARN。

   ```
   aws logs put-delivery-source --name s3-cf-delivery --resource-arn arn:aws:cloudfront::111111111111:distribution/E1TR1RHV123ABC --log-type ACCESS_LOGS
   ```

   **Output**

   ```
   {
       "deliverySource": {
           "name": "s3-cf-delivery",
           "arn": "arn:aws:logs:us-east-1:111111111111:delivery-source:s3-cf-delivery",
           "resourceArns": ["arn:aws:cloudfront::111111111111:distribution/E1TR1RHV123ABC"],
           "service": "cloudfront",
           "logType": "ACCESS_LOGS"
       }
   }
   ```

1. 创建传输，将源账户的日志传输源对应到目标账户的日志传输目标。

   在以下 AWS CLI 命令中，指定[步骤 1：配置目标账户](#steps-destination-account)的输出中的传输目标 ARN。

   ```
   aws logs create-delivery --delivery-source-name s3-cf-delivery --delivery-destination-arn arn:aws:logs:us-east-1:222222222222:delivery-destination:cloudfront-delivery-destination
   ```

   **Output**

   ```
   {
       "delivery": {
           "id": "OPmOpLahVzhx1234",
           "arn": "arn:aws:logs:us-east-1:111111111111:delivery:OPmOpLahVzhx1234",
           "deliverySourceName": "s3-cf-delivery",
           "deliveryDestinationArn": "arn:aws:logs:us-east-1:222222222222:delivery-destination:cloudfront-delivery-destination",
           "deliveryDestinationType": "S3",
           "recordFields": [
               "date",
               "time",
               "x-edge-location",
               "sc-bytes",
               "c-ip",
               "cs-method",
               "cs(Host)",
               "cs-uri-stem",
               "sc-status",
               "cs(Referer)",
               "cs(User-Agent)",
               "cs-uri-query",
               "cs(Cookie)",
               "x-edge-result-type",
               "x-edge-request-id",
               "x-host-header",
               "cs-protocol",
               "cs-bytes",
               "time-taken",
               "x-forwarded-for",
               "ssl-protocol",
               "ssl-cipher",
               "x-edge-response-result-type",
               "cs-protocol-version",
               "fle-status",
               "fle-encrypted-fields",
               "c-port",
               "time-to-first-byte",
               "x-edge-detailed-result-type",
               "sc-content-type",
               "sc-content-len",
               "sc-range-start",
               "sc-range-end",
               "c-country",
               "cache-behavior-path-pattern"
           ],
           "fieldDelimiter": "\t"
       }
   }
   ```

1. 验证跨账户传输是否成功。

   1. 从*源*账户，登录 CloudFront 控制台并选择您的分配。在**日志记录**选项卡的**类型**下，您将看到一个为 S3 跨账户日志传输创建的条目。

   1. 从*目标*账户，登录 Amazon S3 控制台，然后选择您的 Amazon S3 存储桶。在存储桶名称以及传输到该文件夹的所有访问日志中，您会看到前缀 `MyLogPrefix`。

## 输出文件格式
<a name="supported-log-file-format"></a>

根据选择的传输目标，您可以为日志文件指定下列格式之一：
+ JSON
+ 纯文本
+ w3c
+ Raw
+ Parquet（仅限 Amazon S3）

**注意**  
您只能在首次创建传输目标时设置输出格式。以后，无法对其进行更新。要更改输出格式，请删除传输并重新创建。

有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html)。

## 编辑标准日志记录设置
<a name="standard-logs-v2-edit-settings"></a>

您可以使用 [CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)或 CloudWatch API，来启用或禁用日志记录和更新其他日志设置。您对日志记录设置的更改将在 12 小时内生效。

有关更多信息，请参阅以下主题：
+ 要使用 CloudFront 控制台更新分配，请参阅[更新分配](HowToUpdateDistribution.md)。
+ 要使用 CloudFront API 更新分配，请参阅《Amazon CloudFront API Reference》**中的 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 有关 CloudWatch Logs API 操作的更多信息，请参阅[《Amazon CloudWatch Logs API Reference》](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.html)。

## 访问日志字段
<a name="standard-logging-real-time-log-selection"></a>

您可以选择标准日志记录（旧版）支持的相同日志字段。有关更多信息，请参阅[日志文件字段](standard-logs-reference.md#BasicDistributionFileFormat)。

此外，您还可以选择以下[实时访问日志字段](real-time-logs.md#understand-real-time-log-config)。

1. `timestamp(ms)` – 时间戳，以毫秒为单位。

1. `origin-fbl` – CloudFront 与您的源之间第一字节延迟的秒数。

1. `origin-lbl` – CloudFront 与您的源之间最后一个字节延迟的秒数。

1. `asn` – 查看器的自治系统编号（ASN）。

1. `c-country` – 表示查看器的地理位置的国家/地区代码，由查看器的 IP 地址决定。有关国家/地区代码的列表，请参阅 [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)。

1. `cache-behavior-path-pattern` – 标识与查看器请求匹配的缓存行为的路径模式。

## 将日志发送到 CloudWatch Logs
<a name="send-logs-cloudwatch-logs"></a>

要向 CloudWatch Logs 发送日志，请创建或使用现有的 CloudWatch Logs 日志组。有关配置 CloudWatch Logs 日志组的更多信息，请参阅[使用日志组和日志流](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)。

创建日志组后，您必须具有所需的权限来启用标准日志记录。有关所需权限的更多信息，请参阅《**Amazon CloudWatch Logs User Guide》中的 [Logs sent to CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-CloudWatchLogs)。

**备注**  
在您指定 CloudWatch Logs 日志组的名称时，请仅使用正则表达式模式 `[\w-]`。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html#API_PutDeliveryDestination_RequestSyntax) API 操作。
确认您的日志组资源策略未超过大小限制。请参阅 CloudWatch Logs 主题中的 [Log group resource policy size limit considerations](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-CloudWatchLogs) 部分。

### 将访问日志发送到 CloudWatch Logs 示例
<a name="example-access-logs-cwl"></a>

```
{ 
"date": "2024-11-14", 
"time": "21:34:06", 
"x-edge-location": "SOF50-P2", 
"asn": "16509", 
"timestamp(ms)": "1731620046814", 
"origin-fbl": "0.251", 
"origin-lbl": "0.251", 
"x-host-header": "d111111abcdef8.cloudfront.net", 
"cs(Cookie)": "examplecookie=value" 
}
```

## 发送日志至 Firehose
<a name="send-logs-kinesis"></a>

要将日志发送到 Firehose，请创建或使用现有的 Firehose 传输流。然后，将 Firehose 传输流指定为日志传输目标。您必须在美国东部（弗吉尼亚州北部）us-east-1 区域中指定一个 Firehose 传输流。

有关创建传输流的信息，请参阅[创建 Amazon Data Firehose 传输流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

创建传输流之后，您必须具有所需的权限来启用标准日志记录。有关的更多信息，请参阅**《Amazon CloudWatch Logs User Guide》中的 [Logs sent to Firehose](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-Firehose)。

**注意**  
在您指定 Firehose 流的名称时，请仅使用正则表达式模式 `[\w-]`。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html#API_PutDeliveryDestination_RequestSyntax) API 操作。

### 将日志发送到 Firehose 示例
<a name="example-access-logs-firehose"></a>

```
{"date":"2024-11-15","time":"19:45:51","x-edge-location":"SOF50-P2","asn":"16509","timestamp(ms)":"1731699951183","origin-fbl":"0.254","origin-lbl":"0.254","x-host-header":"d111111abcdef8.cloudfront.net","cs(Cookie)":"examplecookie=value"}
{"date":"2024-11-15","time":"19:45:52","x-edge-location":"SOF50-P2","asn":"16509","timestamp(ms)":"1731699952950","origin-fbl":"0.125","origin-lbl":"0.125","x-host-header":"d111111abcdef8.cloudfront.net","cs(Cookie)":"examplecookie=value"}
```

## 将日志发送到 Amazon S3
<a name="send-logs-s3"></a>

要将访问日志发送到 Amazon S3，请创建或使用现有 S3 存储桶。当您在 CloudFront 中启用日志记录时，请指定存储桶名称。有关创建存储桶的信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

创建存储桶之后，您必须具有所需的权限来启用标准日志记录。有关的更多信息，请参阅《Amazon CloudWatch Logs 用户指南》中的 [发送到 Amazon S3 的日志](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-S3)**。
+ 启用日志记录后，AWS 会自动为您添加所需的存储桶策略。
+ 您还可以使用[所选 AWS 区域](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html) 中的 S3 存储桶。

**注意**  
如果您已经启用了标准日志记录（旧版），并且想要启用在 Amazon S3 中进行标准日志记录（v2），我们建议您指定*不同*的 Amazon S3 存储桶，或在同一存储桶中使用*单独的路径*（例如，使用日志前缀或分区）。这可以帮助您跟踪哪些日志文件与哪个分配相关联，并防止日志文件相互覆盖。

**Topics**
+ [指定 S3 存储桶](#prefix-s3-buckets)
+ [分区](#partitioning)
+ [与 Hive 兼容的文件名格式](#hive-compatible-file-name-format)
+ [访问日志的路径示例](#bucket-path-examples)
+ [发送到 Amazon S3 的访问日志示例](#example-access-logs-s3)

### 指定 S3 存储桶
<a name="prefix-s3-buckets"></a>

在指定 S3 存储桶作为传输目标时，请注意以下几点。

S3 存储桶名称只能使用正则表达式模式 `[\w-]`。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html#API_PutDeliveryDestination_RequestSyntax) API 操作。

如果您为 S3 存储桶指定了前缀，则您的日志将出现在该路径下。如果您未指定前缀，CloudFront 会自动为您附加 `AWSLogs/{account-id}/CloudFront` 前缀。

有关更多信息，请参阅 [访问日志的路径示例](#bucket-path-examples)。

### 分区
<a name="partitioning"></a>

当 CloudFront 将访问日志发送到您的 S3 存储桶时，您可以使用分区来整理这些日志。这让您可以按照所需的路径组织和查找访问日志。

您可以使用以下变量来创建文件夹路径。
+ `{DistributionId}` 或 `{distributionid}`
+ `{yyyy}`
+ `{MM}`
+ `{dd}`
+ `{HH}`
+ `{accountid}`

您可以使用任意数量的变量，还可以在路径中指定文件夹名称。然后，CloudFront 使用此路径在 S3 存储桶中为您创建文件夹结构。

**示例**
+ `my_distribution_log_data/{DistributionId}/logs`
+ `/cloudfront/{DistributionId}/my_distribution_log_data/{yyyy}/{MM}/{dd}/{HH}/logs `

**注意**  
 可以在后缀路径中将任一变量用于分配 ID。但是，如果您要向 AWS Glue 发送访问日志，则必须使用 `{distributionid}` 变量，因为 AWS Glue 要求分区名称必须为小写。更新 CloudFront 中的现有日志配置，以便将 `{DistributionId}` 替换为 `{distributionid}`。

### 与 Hive 兼容的文件名格式
<a name="hive-compatible-file-name-format"></a>

您可以使用此选项，这样包含所传输访问日志的 S3 对象会使用允许与 Apache Hive 集成的前缀结构。有关更多信息，请参阅 [CreateDelivery](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html) API 操作。

**Example 示例**  

```
/cloudfront/DistributionId={DistributionId}/my_distribution_log_data/year={yyyy}/month={MM}/day={dd}/hour={HH}/logs
```

有关分区和与 Hive 兼容的选项，请参阅《Amazon CloudWatch Logs API Reference》**中的 [S3DeliveryConfiguration](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_S3DeliveryConfiguration.html) 元素。

### 访问日志的路径示例
<a name="bucket-path-examples"></a>

在指定 S3 存储桶作为目标时，您可以使用以下选项来创建访问日志的路径：
+ Amazon S3 存储桶，带或不带前缀
+ 分区，使用 CloudFront 提供的变量或输入您自己的分区
+ 启用与 Hive 兼容选项

下表根据您选择的选项，显示访问日志出现在存储桶中的方式。

#### 带前缀的 Amazon S3 存储桶
<a name="bucket-with-prefix"></a>


| Amazon S3 存储桶名称 | 您在后缀路径中指定的分区 | 更新的后缀路径 | 是否启用了与 Hive 兼容？ | 访问日志发送至 | 
| --- | --- | --- | --- | --- | 
| amzn-s3-demo-bucket/MyLogPrefix | 无 | 无 | 否 | amzn-s3-demo-bucket/MyLogPrefix/ | 
| amzn-s3-demo-bucket/MyLogPrefix | myFolderA/ | myFolderA/ | 否 | amzn-s3-demo-bucket/MyLogPrefix/myFolderA/ | 
| amzn-s3-demo-bucket/MyLogPrefix | myFolderA/\$1yyyy\$1 | myFolderA/\$1yyyy\$1 | 是 | amzn-s3-demo-bucket/MyLogPrefix/myFolderA/year=2025 | 

#### 不带前缀的 Amazon S3 存储桶
<a name="bucket-without-prefix"></a>


| Amazon S3 存储桶名称 | 您在后缀路径中指定的分区 | 更新的后缀路径 | 是否启用了与 Hive 兼容？ | 访问日志发送至 | 
| --- | --- | --- | --- | --- | 
| amzn-s3-demo-bucket | 无 | AWSLogs/\$1account-id\$1/CloudFront/ | 否 | amzn-s3-demo-bucket/AWSLogs/<your-account-ID>/CloudFront/ | 
| amzn-s3-demo-bucket | myFolderA/ | AWSLogs/\$1account-id\$1/CloudFront/myFolderA/ | 否 | amzn-s3-demo-bucket/AWSLogs/<your-account-ID>/CloudFront/myFolderA/ | 
| amzn-s3-demo-bucket | myFolderA/ | AWSLogs/\$1account-id\$1/CloudFront/myFolderA/ | 是 | amzn-s3-demo-bucket/AWSLogs/aws-account-id=<your-account-ID>/CloudFront/myFolderA/ | 
| amzn-s3-demo-bucket | myFolderA/\$1yyyy\$1 | AWSLogs/\$1account-id\$1/CloudFront/myFolderA/\$1yyyy\$1 | 是 | amzn-s3-demo-bucket/AWSLogs/aws-account-id=<your-account-ID>/CloudFront/myFolderA/year=2025 | 

#### AWS 账户 ID 作为分区
<a name="bucket-account-id-partition"></a>


| Amazon S3 存储桶名称 | 您在后缀路径中指定的分区 | 更新的后缀路径 | 是否启用了与 Hive 兼容？ | 访问日志发送至 | 
| --- | --- | --- | --- | --- | 
| amzn-s3-demo-bucket | 无 | AWSLogs/\$1account-id\$1/CloudFront/ | 支持 | amzn-s3-demo-bucket/AWSLogs/aws-account-id=<your-account-ID>/CloudFront/ | 
| amzn-s3-demo-bucket | myFolderA/\$1accountid\$1 | AWSLogs/\$1account-id\$1/CloudFront/myFolderA/\$1accountid\$1 | 是 | amzn-s3-demo-bucket/AWSLogs/aws-account-id=<your-account-ID>/CloudFront/myFolderA/accountid=<your-account-ID> | 

**备注**  
`{account-id}` 变量是 CloudFront 的保留变量。如果您指定*不带*前缀的 Amazon S3 存储桶，CloudFront 会自动将此变量添加到您的后缀路径中。如果您的日志与 Hive 兼容，则此变量显示为 `aws-account-id`。
您可以使用 `{accountid}` 变量，让 CloudFront 将您的账户 ID 添加到后缀路径中。如果您的日志与 Hive 兼容，则此变量显示为 `accountid`。
有关后缀路径的更多信息，请参阅 [S3DeliveryConfiguration](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_S3DeliveryConfiguration.html)。

### 发送到 Amazon S3 的访问日志示例
<a name="example-access-logs-s3"></a>

```
#Fields: date time x-edge-location asn timestamp(ms) x-host-header cs(Cookie)
2024-11-14    22:30:25    SOF50-P2    16509    1731623425421    
d111111abcdef8.cloudfront.net    examplecookie=value2
```

## 禁用标准日志记录
<a name="delete-standard-log-destination"></a>

如果您不再需要标准日志记录，可以在分配上禁用日志记录。

**禁用标准日志记录**

1. 登录 CloudFront 控制台。

1. 选择**分配**，然后选择您的分配 ID。

1. 选择**日志记录**，然后在**访问日志目标**下选择目标。

1. 选择**管理**，然后选择**删除**。

1. 如果您有多个标准日志记录，请重复上一步操作。

**注意**  
当您从 CloudFront 控制台中删除标准日志记录时，此操作仅删除传输和传输目标。它不会从您的 AWS 账户中删除传输源。要删除传输源，请在 `aws logs delete-delivery-source --name DeliverySourceName` 命令中指定传输源名称。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [DeleteDeliverySource](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteDeliverySource.html)。

## 故障排除
<a name="troubleshooting-access-logs-v2"></a>

当您使用 CloudFront 标准日志记录（v2）时，可以使用以下信息来修复常见问题。

### 传输源已存在
<a name="access-logging-resource-already-used"></a>

在为分配启标准日志记录时，您会创建传输源。然后，您可以使用该传输源，来创建对所需的目标类型的传输：CloudWatch Logs、Firehose、Amazon S3。目前，每个分配只能有一个传输源。如果您尝试为同一个分配创建其他传输源，则会显示以下错误消息。

```
This ResourceId has already been used in another Delivery Source in this account
```

要创建其他传输源，请先删除现有的传输源。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [DeleteDeliverySource](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteDeliverySource.html)。

### 我更改了后缀路径，但 Amazon S3 存储桶无法接收我的日志
<a name="access-logging-s3-permission"></a>

如果您启用了标准日志记录（v2）并指定了不带前缀的存储桶 ARN，CloudFront 将在后缀路径后附加以下默认值：`AWSLogs/{account-id}/CloudFront`。如果您使用 CloudFront 控制台或 [UpdateDeliveryConfiguration](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateDeliveryConfiguration.html) API 操作来指定不同的后缀路径，则必须更新 Amazon S3 存储桶策略来使用相同的路径。

**Example 示例：更新后缀路径**  

1. 默认后缀路径是 `AWSLogs/{account-id}/CloudFront`，但您可以将其替换为 `myFolderA`。

1. 由于新的后缀路径与在 Amazon S3 存储桶策略中指定的路径不同，因此不会传输您的访问日志。

1. 您可以执行以下步骤之一：
   + 将 Amazon S3 存储桶权限从 `amzn-s3-demo-bucket/AWSLogs/<your-account-ID>/CloudFront/*` 更新为 `amzn-s3-demo-bucket/myFolderA/*`。
   + 更新日志记录配置，以便再次使用默认后缀：`AWSLogs/{account-id}/CloudFront`
有关更多信息，请参阅 [权限](#permissions-standard-logging)。

## 删除日志文件
<a name="standard-logs-v2-delete"></a>

CloudFront 不会自动删除目标中的日志文件。有关删除日志文件的信息，请参阅以下主题：

**Amazon S3**
+ 《Amazon Simple Storage Service 控制台用户指南》**中的[删除对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjects.html)

**CloudWatch Logs**
+ **《Amazon CloudWatch Logs User Guide》中的 [Working with log groups and log streams](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html) 
+ 《**Amazon CloudWatch Logs API Reference》中的 [DeleteLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteLogGroup.html)

**Firehose**
+ 《**Amazon Data Firehose API Reference》中的 [DeleteDeliveryStream](https://docs.aws.amazon.com/firehose/latest/APIReference/API_DeleteDeliveryStream.html)

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

对于启用标准日志，CloudFront 不收取任何费用。但是，根据您选择的日志传输目标，可能会产生传输、摄取、存储或访问费用。有关更多信息，请参阅 [Amazon CloudWatch Logs 定价](https://aws.amazon.com/cloudwatch/pricing/)。在**付费套餐**下，选择**日志**选项卡，然后在**公开发布的日志**下，查看每个传输目标的信息。

有关每项 AWS 服务 服务定价的更多信息，请参阅以下主题：
+ [Amazon CloudWatch Logs 定价](https://aws.amazon.com/cloudwatch/pricing/)
+ [Amazon Data Firehose 定价](https://aws.amazon.com/kinesis/data-firehose/pricing/)
+ [Amazon S3 定价](https://aws.amazon.com/s3/pricing/) 
**注意**  
日志传输到 Amazon S3 不会产生额外费用，但存储和访问日志文件将产生 Amazon S3 费用。如果您启用 **Parquet** 选项将您的访问日志转换为 Apache Parquet，则此选项会产生 CloudWatch 费用。有关更多信息，请参阅 [CloudWatch 定价中的“公开日志”部分](https://aws.amazon.com/cloudwatch/pricing/)。

# 配置标准日志记录（旧版）
<a name="standard-logging-legacy-s3"></a>

**备注**  
本主题适用于标准日志记录的之前版本。有关最新版本，请参阅[配置标准日志记录（v2）](standard-logging.md)。
如果您已经启用了标准日志记录（旧版），并且想要启用在 Amazon S3 中进行标准日志记录（v2），我们建议您指定*不同*的 Amazon S3 存储桶，或在同一存储桶中使用*单独的路径*（例如，使用日志前缀或分区）。这可以帮助您跟踪哪些日志文件与哪个分配相关联，并防止日志文件相互覆盖。

要开始使用标准日志记录（旧版），请完成以下步骤：

1. 选择用于接收您的日志的 Amazon S3 存储桶，并添加所需的权限。

1. 使用 CloudFront 控制台或 CloudFront API 配置标准日志记录（旧版）。您只能选择 Amazon S3 存储桶来接收日志。

1. 查看您的访问日志。

## 为标准日志选择 Amazon S3 存储桶
<a name="access-logs-choosing-s3-bucket"></a>

当您对分配启用日志记录时，需要指定您希望 CloudFront 将日志文件存储到其中的 Amazon S3 存储桶。如果您使用 Amazon S3 作为源，建议您对日志文件使用*单独的*存储桶。

指定您希望 CloudFront 用于存储访问日志的 Amazon S3 存储桶，例如 `amzn-s3-demo-bucket.s3.amazonaws.com`。

可将多个分配的日志文件存储在同一存储桶中。当您启用日志记录时，可为文件名指定一个可选前缀，以便您可以跟踪哪些日志文件与哪些分配相关联。

**关于选择 S3 存储桶**  
您的存储桶必须启用访问控制列表 (ACL)。如果从 CloudFront 控制台选择了未启用 ACL 的存储桶，则会出现一条错误消息。请参阅[权限](#AccessLogsBucketAndFileOwnership)。
不要选择 [S3 对象所有权](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)设置为**强制桶拥有者**的 Amazon S3 存储桶。该设置对存储桶以及其中的对象禁用 ACL，这会阻止 CloudFront 将日志文件传输到存储桶。[标准日志记录 V2](standard-logging.md)[AWS 区域](https://docs.aws.amazon.com/global-infrastructure/latest/regions/aws-regions.html)

## 权限
<a name="AccessLogsBucketAndFileOwnership"></a>

**重要**  
从 2023 年 4 月开始，您必须为用于 CloudFront 标准日志的新 S3 存储桶启用 S3 ACL。您可以在[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-ownership-new-bucket.html)时启用 ACL，也可以为[现有存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-ownership-existing-bucket.html)启用 ACL。  
有关这些更改的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[新 S3 桶的原定设置常见问题解答](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-faq.html)和《AWS 新闻博客》**中的[提醒：Amazon S3 安全更改将于 2023 年 4 月发布](https://aws.amazon.com/blogs/aws/heads-up-amazon-s3-security-changes-are-coming-in-april-of-2023/)。

您的 AWS 账户必须对您为日志文件指定的存储桶拥有以下权限：
+ 存储桶的 ACL 必须向您授予 `FULL_CONTROL` 如果您是存储桶拥有者，则默认情况下，您的账户具有此权限。如果您不是，则存储桶拥有者必须更新存储桶的 ACL。
+ `s3:GetBucketAcl`
+ `s3:PutBucketAcl`

**存储桶的 ACL**  
当您创建或更新分配并启用日志记录时，CloudFront 会使用这些权限更新存储桶的 ACL，以授予 `awslogsdelivery` 账户 `FULL_CONTROL` 权限。`awslogsdelivery` 账户将日志文件写入存储桶。如果您的账户没有更新 ACL 所需的权限，则创建或更新分配将会失败。  
在某些情况下，如果以编程方式提交请求以创建存储桶，但具有指定名称的存储桶已存在，则 S3 将存储桶上的权限重置为默认值。如果您已将 CloudFront 配置为将访问日志保存在 S3 存储桶中，并停止获取该存储桶中的日志，请检查存储桶上的权限，以确保 CloudFront 具有必要的权限。

**恢复存储桶的 ACL**  
如果您删除对 `awslogsdelivery` 账户的权限，则 CloudFront 无法将日志保存到 S3 存储桶。要使 CloudFront 能够再次开始保存您的分配的日志，请通过执行以下操作之一恢复 ACL 权限：  
+ 在 CloudFront 中对您的分配禁用日志记录，然后再次启用它。有关更多信息，请参阅 [标准日志记录](DownloadDistValuesGeneral.md#DownloadDistValuesLoggingOnOff)。
+ 通过在 Amazon S3 控制台中导航到 S3 存储桶并添加权限，手动为 `awslogsdelivery` 添加 ACL 权限。要为 `awslogsdelivery` 添加 ACL，您必须提供账户的规范 ID，如下所示：

  `c4c1ede66af53448b93c283ce9448c4ba468c9432aa01d700d3878632f77d2d0`

  

  有关将 ACL 添加到 S3 存储桶的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[配置 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/managing-acls.html)。

**每个日志文件的 ACL**  
除了存储桶上的 ACL 之外，每个日志文件上还有一个 ACL。存储桶拥有者对每个日志文件均具有 `FULL_CONTROL` 权限，分配所有者（如果与存储桶拥有者不同）没有权限，而 `awslogsdelivery` 账户具有读取和写入权限。

**禁用日志记录**  
如果您禁用日志记录，则 CloudFront 并不会删除存储桶或日志文件的 ACL。如果需要，您可以删除 ACL。

### SSE-KMS 存储桶的必需密钥策略
<a name="AccessLogsKMSPermissions"></a>

如果标准日志的 S3 存储桶通过客户自主管理型密钥使用具有 AWS KMS keys的服务器端加密（SSE-KMS），您必须向客户自主管理型密钥的密钥策略添加以下语句。这样一来，CloudFront 可以将日志文件写入存储桶中。您无法将 SSE-KMS 与 AWS 托管式密钥结合使用，因为 CloudFront 无法将日志文件写入存储桶。

```
{
    "Sid": "Allow CloudFront to use the key to deliver logs",
    "Effect": "Allow",
    "Principal": {
        "Service": "delivery.logs.amazonaws.com"
    },
    "Action": "kms:GenerateDataKey*",
    "Resource": "*"
}
```

如果标准日志的 S3 存储桶将 SSE-KMS 与 [S3 存储桶密钥](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html)结合使用，您还需要将 `kms:Decrypt` 权限添加到策略语句中。在这种情况下，完整的策略语句如下所示。

```
{
    "Sid": "Allow CloudFront to use the key to deliver logs",
    "Effect": "Allow",
    "Principal": {
        "Service": "delivery.logs.amazonaws.com"
    },
    "Action": [
        "kms:GenerateDataKey*",
        "kms:Decrypt"
    ],
    "Resource": "*"
}
```

**注意**  
当您为 S3 存储桶启用 SSE-KMS 时，请指定客户自主管理型密钥的完整 ARN。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[借助 AWS KMS keys（SSE-KMS）指定服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-kms-encryption.html)。

## 启用标准日志记录（旧版）
<a name="standard-logs-legacy-enable"></a>

要启用标准日志记录，您可以使用 CloudFront 控制台或 CloudFront API。

**Contents**
+ [启用标准日志记录（旧版）（CloudFront 控制台）](#standard-logs-legacy-enable-console)
+ [启用标准日志记录（旧版）（CloudFront API）](#standard-logs-legacy-enable-api)

### 启用标准日志记录（旧版）（CloudFront 控制台）
<a name="standard-logs-legacy-enable-console"></a>

**为 CloudFront 分配启用标准日志（控制台）**

1. 使用 CloudFront 控制台创建[新分配](distribution-web-creating-console.md)或[更新现有分配](HowToUpdateDistribution.md#HowToUpdateDistributionProcedure)。

1. 对于**标准日志记录**部分的**日志传输**，选择**开启**。

1. （可选）对于 **Cookie 日志记录**，如果您希望在日志中包含 Cookie，请选择**开启**。有关更多信息，请参阅 [Cookie 日志记录](DownloadDistValuesGeneral.md#DownloadDistValuesCookieLogging)。
**提示**  
Cookie 日志记录是一项全局设置，应用到您的分配的*所有*标准日志。您不能为单独的传输目标覆盖此设置。

1. 对于**交付至**部分，指定 **Amazon S3（旧版）**。

1. 指定您的 Amazon S3 存储桶。如果您还没有存储桶，可以选择**创建**，或者查看文档来[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

1. （可选）对于**日志前缀**，指定您希望 CloudFront 作为此分配的访问日志文件名前缀的字符串（如有），例如 `exampleprefix/`。尾随斜杠 (/) 是可选的，但建议简化浏览您的日志文件。有关更多信息，请参阅 [日志前缀](DownloadDistValuesGeneral.md#DownloadDistValuesLogPrefix)。

1. 完成更新或创建分配的步骤。

1. 在**日志**页面中，验证分配旁边的标准日志状态是否为**已启用**。

   有关标准日志传输和日志字段的更多信息，请参阅[标准日志记录引用](standard-logs-reference.md)。

### 启用标准日志记录（旧版）（CloudFront API）
<a name="standard-logs-legacy-enable-api"></a>

您还可以使用 CloudFront API 来为分配启用标准日志记录。

**为分配启用标准日志（CloudFront API）**
+ 使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html) 或 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html) API 操作，配置 [LoggingConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_LoggingConfig.html) 对象。

## 编辑标准日志记录设置
<a name="ChangeSettings"></a>

您可通过使用 [CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)或 CloudFront API 来启用或禁用日志记录、更改存储日志的 Amazon S3 存储桶以及更改日志文件的前缀。您对日志记录设置的更改将在 12 小时内生效。

有关更多信息，请参阅以下主题：
+ 要使用 CloudFront 控制台更新分配，请参阅[更新分配](HowToUpdateDistribution.md)。
+ 要使用 CloudFront API 更新分配，请参阅 *Amazon CloudFront API 参考*中的 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。

## 将日志发送到 Amazon S3
<a name="standard-logs-in-s3"></a>

当您向 Amazon S3 发送日志时，日志将显示为以下格式。

### 文件名格式
<a name="AccessLogsFileNaming"></a>

CloudFront 保存在您的 Amazon S3 存储桶中的每个日志文件的名称使用以下文件名格式：

`<optional prefix>/<distribution ID>.YYYY-MM-DD-HH.unique-ID.gz`

日期和时间用协调世界时 (UTC) 表示。

例如，如果您使用 `example-prefix` 作为前缀，并且您的分配 ID 为 `EMLARXS9EXAMPLE`，则您的文件名看起来类似于以下内容：

`example-prefix/EMLARXS9EXAMPLE.2019-11-14-20.RT4KCN4SGK9.gz`

当您对分配启用日志记录时，可为文件名指定一个可选前缀，以便您可以跟踪哪些日志文件与哪些分配相关联。如果您包含日志文件前缀的值，并且您的前缀不以正斜杠 (`/`) 结尾，CloudFront 则会自动追加一个。如果您的前缀以正斜杠结尾，则 CloudFront 不会添加另一个斜杠。

文件名末尾的 `.gz` 表示 CloudFront 已使用 gzip 压缩日志文件。

## 标准日志文件格式
<a name="LogFileFormat"></a>

日志文件中的每个条目分别提供有关单个查看器请求的详细信息。日志文件具有以下特征：
+ 使用 [W3C 扩展日志文件格式](https://www.w3.org/TR/WD-logfile.html)。
+ 包含制表符分隔的值。
+ 包含不一定按时间顺序排列的记录。
+ 包含两个标题行：一个具有文件格式版本，另一个列出了包含在每个记录中的 W3C 字段。
+ 包含字段值中的空格和某些其他字符的 URL 编码等效值。

  URL 编码的等效值用于以下字符：
  + ASCII 字符代码 0 到 32（含这两个值）
  + ASCII 字符代码 127 及更大值
  + 下表中的所有字符

  URL 编码标准在 [RFC 1738](https://tools.ietf.org/html/rfc1738.html) 中定义。


|  URL 编码值  |  字符  | 
| --- | --- | 
|  %3C  |  <  | 
|  %3E  |  >  | 
|  %22  |  "  | 
|  %23  |  \$1  | 
|  %25  |  %  | 
|  %7B  |  \$1  | 
|  %7D  |  \$1  | 
|  %7C  |  \$1  | 
|  %5C  |  \$1  | 
|  %5E  |  ^  | 
|  %7E  |  \$1  | 
|  %5B  |  [  | 
|  %5D  |  ]  | 
|  %60  |  `  | 
|  %27  |  '  | 
|  %20  |  空格  | 

## 删除日志文件
<a name="DeletingLogFiles"></a>

CloudFront 不会自动从您的 Amazon S3 存储桶中删除日志文件。有关从 Amazon S3 存储桶中删除日志文件的信息，请参阅《*Amazon Simple Storage Service 控制台用户指南*》中的[删除对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjects.html)。

## 定价
<a name="AccessLogsCharges"></a>

标准日志记录是 CloudFront 的一个可选功能。对于启用标准日志，CloudFront 不收取任何费用。但是，在 Amazon S3 上存储和访问文件会产生常规的 Amazon S3 费用。不过您可以随时删除这些文件。

有关 Amazon S3 定价的更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

有关 CloudFront 定价的更多信息，请参阅 [CloudFront 定价](https://aws.amazon.com/cloudfront/pricing/)。

# 标准日志记录引用
<a name="standard-logs-reference"></a>

以下各节适用于标准日志记录（v2）和标准日志记录（旧版）。

**Topics**
+ [日志文件传输时间](#access-logs-timing)
+ [当请求 URL 或标头超出最大大小时如何记录请求](#access-logs-request-URL-size)
+ [日志文件字段](#BasicDistributionFileFormat)
+ [分析日志](#access-logs-analyzing)

## 日志文件传输时间
<a name="access-logs-timing"></a>

CloudFront 每个小时会为分配传输若干次日志。一般而言，日志文件包含有关 CloudFront 在给定时间段内收到的请求的信息。CloudFront 通常会在日志中所显示事件发生后的一个小时内，将该时间段内的日志文件传输至目标。但是，请注意，某个时间段内的某些或所有日志文件条目有时可延迟长达 24 小时。当日志条目延迟时，CloudFront 会将它们保存在日志文件中，其文件名称包括*发生*请求的时间段的日期和时间（而不是文件传输的日期和时间）。

创建日志文件时，CloudFront 将在日志文件涵盖的时间段内从收到对象请求的所有边缘站点整合分配信息。

CloudFront 可为某个时间段保存多个文件，具体取决于 CloudFront 收到的针对与分配相关联的对象的请求数。

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

**注意**  
如果在此期间没有用户请求您的对象，您就不会收到该期间的任何日志文件。

## 当请求 URL 或标头超出最大大小时如何记录请求
<a name="access-logs-request-URL-size"></a>

如果所有请求标头（包括 Cookie）的总大小超过 20KB，或者如果 URL 超过 8192 字节，则 CloudFront 无法完整解析并记录请求。由于未记录该请求，因此您在日志文件中看不到返回的 HTTP 错误状态代码。

如果请求正文超出最大大小，则会记录请求，包括 HTTP 错误状态代码。

## 日志文件字段
<a name="BasicDistributionFileFormat"></a>

分配的日志文件包含 33 个字段。以下列表包含每个字段名称（按顺序）以及该字段中信息的描述。

1. **`date`**

   事件发生日期的格式为 `YYYY-MM-DD`。例如：`2019-06-30`。日期和时间用协调世界时 (UTC) 表示。对于 WebSocket 连接，这是关闭连接的日期。

1. **`time`**

   CloudFront 服务器完成响应请求的时间（采用 UTC 时间），例如 `01:42:39`。对于 WebSocket 连接，这是关闭连接的时间。

1. **`x-edge-location`**

   服务请求的边缘站点。每个边缘站点由三个字母的代码和任意分配的数字来确定（例如，DFW3）。三个字母代码通常对应邻近边缘站点的地理位置的机场的国际航空协会（IATA）机场代码。（这些缩写将来可能会更改。）

1. **`sc-bytes`**

   服务器在响应请求时向查看器提供的字节的总数，包括标头。对于 WebSocket 和 gRPC 连接，这是通过连接从服务器发送到客户端的字节的总数。

1. **`c-ip`**

   已发出请求的查看器的 IP 地址，例如 `192.0.2.183` 或 `2001:0db8:85a3::8a2e:0370:7334`。如果查看器已使用 HTTP 代理或负载均衡器发送请求，则此字段的值为该代理或负载均衡器的 IP 地址。另请参阅 `x-forwarded-for` 字段。

1. **`cs-method`**

   从查看器接收的 HTTP 请求方法。

1. **`cs(Host)`**

   CloudFront 分配的域名（例如，d111111abcdef8.cloudfront.net）。

1. **`cs-uri-stem`**

   请求 URL 中标识路径和对象的部分（例如 `/images/cat.jpg`）。URL 和查询字符串中的问号 (?) 不包含在日志中。

1. **`sc-status`**

   包含下列值之一：
   + 服务器响应的 HTTP 状态代码（例如 `200`）。
   + `000`，表示查看器已在服务器可以响应请求之前关闭连接。如果查看器在服务器开始发送响应后关闭连接，则此字段包含服务器开始发送的响应的 HTTP 状态代码。

1. **`cs(Referer)`**

   请求中的 `Referer` 标头的值。这是发出请求的域的名称。常见引用站点包括搜索引擎、直接链接到您的对象的其他网站及您自己的网站。

1. **`cs(User-Agent)`**

   请求中的 `User-Agent` 标头的值。`User-Agent` 标头标识请求的来源，例如提交请求的设备和浏览器的类型，如果请求来自搜索引擎，则标识具体的搜索引擎。

1. **`cs-uri-query`**

   请求 URL 的查询字符串部分（如果有）。

   如果 URL 不包含查询字符串，则此字段的值为连字符 (-)。有关更多信息，请参阅 [根据查询字符串参数缓存内容](QueryStringParameters.md)。

1. **`cs(Cookie)`**

   请求中的 `Cookie` 标头，包括名称/值对和关联的属性。

   如果您启用了 Cookie 日志记录，无论您选择将哪种 Cookie 转发到源，CloudFront 都将记录所有请求中的 Cookie。当请求不包含 Cookie 标头时，此字段的值为连字符 (-)。有关 cookies 的更多信息，请参阅 [根据 Cookie 缓存内容](Cookies.md)。

1. **`x-edge-result-type`**

   在最后一个字节离开服务器后服务器如何对响应进行分类。在某些情况下，结果类型可能会在服务器准备发送响应的时间与完成发送响应的时间之间发生变化。另请参阅 `x-edge-response-result-type` 字段。

   例如，在 HTTP 流中，假设服务器在缓存中发现流的一个区段。在这种情况下，此字段的值通常为 `Hit`。但是，如果查看器在服务器传送整个区段之前关闭连接，则最终结果类型（以及此字段的值）为 `Error`。

   WebSocket 和 gRPC 连接的此字段的值为 `Miss`，因为内容不可缓存，并直接代理到源。

   可能的值包括：
   + `Hit` – 服务器从缓存中将对象提供给查看器。
   + `RefreshHit` – 服务器在缓存中找到了对象，但该对象已过期，因此，服务器联系了源，以验证缓存是否具有该对象的最新版本。
   + `Miss` – 缓存中的对象无法满足请求，因此，服务器将请求转发到源并将结果返回到查看器。
   + `LimitExceeded` – 请求被拒绝，因为超出了 CloudFront 配额（以前称为限制）。
   + `CapacityExceeded` – 服务器返回了 HTTP 503 状态代码，因为它在请求时没有足够的容量来服务对象。
   + `Error` – 通常，这意味着请求会导致客户端错误（`sc-status` 字段的值在 `4xx` 范围内）或服务器错误（`sc-status` 字段的值在 `5xx` 范围内）。如果 `sc-status` 字段的值为 `200`，或者如果此字段的值为 `Error` 且 `x-edge-response-result-type` 字段的值不是 `Error`，则表示 HTTP 请求已成功，但客户端在接收所有字节之前断开连接。
   + `Redirect` – 服务器已根据分发设置将查看器从 HTTP 重定向到 HTTPS。
   + `LambdaExecutionError`：由于关联格式错误、函数超时、AWS 依赖关系问题或其它正式发布问题，与分配关联的 Lambda@Edge 函数未完成。

1. **`x-edge-request-id`**

   唯一地标识请求的不透明字符串。CloudFront 还会在 `x-amz-cf-id` 响应标头中发送此字符串。

1. **`x-host-header`**

   查看器在该请求的 `Host` 标头中包含的值。如果您在对象 URL 中使用 CloudFront 域名（如 d111111abcdef8.cloudfront.net），则此字段将包含该域名。如果在您的对象 URL（例如 www.example.com）中使用的是备用域名（CNAME），则此字段将包含备用域名。

   如果您使用的是备用域名，请参阅与您的分配关联的域名的字段 7 中的 `cs(Host)`。

1. **`cs-protocol`**

   查看器请求的协议（`http`、`https`、`grpcs`、`ws` 或 `wss`）。

1. **`cs-bytes`**

   查看器包含在请求中的数据字节总数，包括标头。对于 WebSocket 和 gRPC 连接，这是通过连接从客户端发送到服务器的字节的总数。

1. **`time-taken`**

   服务器收到查看器的请求的时间与服务器将响应的最后一个字节写入输出队列的时间之间相隔的秒数（精确至千分之一秒，例如 0.082），以服务器上测量的时间为准。从查看器的角度看，由于网络延迟和 TCP 缓冲的原因，获得完整响应的总时间将会超过该值。

1. **`x-forwarded-for`**

   如果查看器已使用 HTTP 代理或负载均衡器发送请求，则 `c-ip` 字段的值为该代理或负载均衡器的 IP 地址。在本例中，此字段为发出请求的查看器的 IP 地址。此字段可以包含多个逗号分隔的 IP 地址。每个 IP 地址可以是 IPv4 地址（如 `192.0.2.183`）或 IPv6 地址（如 `2001:0db8:85a3::8a2e:0370:7334`）。

   如果查看器未使用 HTTP 代理或负载均衡器，则此字段的值为连字符 (-)。

1. **`ssl-protocol`**

   如果请求使用了 HTTPS，则此字段包含查看器和服务器协商用于传输请求和响应的 SSL/TLS 协议。有关可能的值的列表，请参阅[查看器和 CloudFront 之间支持的协议和密码](secure-connections-supported-viewer-protocols-ciphers.md)中支持的 SSL/TLS 协议。

   如果字段 17 中的 `cs-protocol` 为 `http`，则此字段的值为连字符 (-)。

1. **`ssl-cipher`**

   如果请求使用了 HTTPS，则此字段包含查看器和服务器协商用于加密请求和响应的 SSL/TLS 密码。有关可能的值的列表，请参阅[查看器和 CloudFront 之间支持的协议和密码](secure-connections-supported-viewer-protocols-ciphers.md)中支持的 SSL/TLS 密码。

   如果字段 17 中的 `cs-protocol` 为 `http`，则此字段的值为连字符 (-)。

1. **`x-edge-response-result-type`**

   服务器在将响应返回到查看器之前如何对响应进行分类。另请参阅 `x-edge-result-type` 字段。可能的值包括：
   + `Hit` – 服务器从缓存中将对象提供给查看器。
   + `RefreshHit` – 服务器在缓存中找到了对象，但该对象已过期，因此，服务器联系了源，以验证缓存是否具有该对象的最新版本。
   + `Miss` – 缓存中的对象无法满足请求，因此，服务器将请求转发到源服务器并将结果返回到查看器。
   + `LimitExceeded` – 请求被拒绝，因为超出了 CloudFront 配额（以前称为限制）。
   + `CapacityExceeded` – 服务器返回了 503 错误，因为它在请求时没有足够的容量来服务对象。
   + `Error` – 通常，这意味着请求会导致客户端错误（`sc-status` 字段的值在 `4xx` 范围内）或服务器错误（`sc-status` 字段的值在 `5xx` 范围内）。

     如果 `x-edge-result-type` 字段的值为 `Error`，而此字段的值不是 `Error`，则客户端在下载完成前已断开连接。
   + `Redirect` – 服务器已根据分发设置将查看器从 HTTP 重定向到 HTTPS。
   + `LambdaExecutionError`：由于关联格式错误、函数超时、AWS 依赖关系问题或其它正式发布问题，与分配关联的 Lambda@Edge 函数未完成。

1. **`cs-protocol-version`**

   查看器在请求中指定的 HTTP 版本。可能的值包括 `HTTP/0.9`、`HTTP/1.0`、`HTTP/1.1`、`HTTP/2.0` 和 `HTTP/3.0`。

1. **`fle-status`**

   在为分配配置[字段级加密](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html)时，此字段包含一个指示是否已成功处理请求正文的代码。如果服务器成功处理了请求正文，加密了指定字段中的值并将请求转发到源，则此字段的值为 `Processed`。在这种情况下，`x-edge-result-type` 的值仍可以指示客户端或服务器端错误。

   此字段的可能值包括：
   + `ForwardedByContentType` – 由于没有配置内容类型，因此服务器将请求转发到了源，而不进行解析或加密。
   + `ForwardedByQueryArgs` – 由于请求包含的查询参数不在字段级加密的配置中，因此服务器将请求转发到了源，而不进行解析或加密。
   + `ForwardedDueToNoProfile` – 由于在字段级加密的配置中没有指定配置文件，因此服务器将请求转发到了源，而不进行解析或加密。
   + `MalformedContentTypeClientError` – 由于 `Content-Type` 标头值的格式无效，因此，服务器拒绝了该请求并向查看器返回了 HTTP 400 状态代码。
   + `MalformedInputClientError` – 由于请求正文的格式无效，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `MalformedQueryArgsClientError` – 由于查询参数为空或格式无效，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `RejectedByContentType` – 由于在字段级加密的配置中没有指定内容类型，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `RejectedByQueryArgs` – 由于在字段级加密的配置中没有指定查询参数，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `ServerError` – 源服务器返回了错误。

   如果请求超出字段级加密配额（以前称作限制），则此字段包含下列错误代码之一，并且服务器向查看器返回 HTTP 状态代码 400。有关字段级加密的当前配额的列表，请参[对字段级加密的配额](cloudfront-limits.md#limits-field-level-encryption)。
   + `FieldLengthLimitClientError` – 配置为加密的字段超出允许的最大长度。
   + `FieldNumberLimitClientError` – 将分配配置为加密的请求包含的字段数超过允许值。
   + `RequestLengthLimitClientError` – 在配置了字段级加密时，请求正文的长度超出允许的最大长度。

   如果没有为分配配置字段级加密，则此字段的值为连字符 (-)。

1. **`fle-encrypted-fields`**

   服务器加密并转发到源的[字段级加密](field-level-encryption.md)字段的数量。CloudFront 服务器在加密数据时会将处理的请求传输到源，这样一来，即使 `fle-status` 的值为错误，此字段也会具有值。

   如果没有为分配配置字段级加密，则此字段的值为连字符 (-)。

1. **`c-port`**

   查看器发出的请求的端口号。

1. **`time-to-first-byte`**

   从收到请求到写入响应的第一个字节之间的秒数（在服务器上测量）。

1. **`x-edge-detailed-result-type`**

   此字段包含与 `x-edge-result-type` 字段相同的值，但以下情况除外：
   + 当对象从[源护盾](origin-shield.md)层提供给查看器时，该字段包含 `OriginShieldHit`。
   + 当对象不在 CloudFront 缓存中并且响应是由[源请求 Lambda@Edge 函数](lambda-at-the-edge.md)生成时，此字段包含 `MissGeneratedResponse`。
   + 当 `x-edge-result-type` 字段的值为 `Error` 时，此字段包含以下值之一，其中包含有关错误的更多信息：
     + `AbortedOrigin` – 服务器遇到了源方面的问题。
     + `ClientCommError` – 由于服务器与查看器之间的通信问题，对查看器的响应已中断。
     + `ClientGeoBlocked` - 将分配配置为拒绝来自查看器地理位置的请求。
     + `ClientHungUpRequest` - 查看器在发送请求时提前停止。
     + `Error` – 出现错误，其错误类型不适合任何其他类别。当服务器从缓存提供错误响应时，可能会发生此类型的错误。
     + `InvalidRequest` – 服务器收到了来自查看器的无效请求。
     + `InvalidRequestBlocked` - 阻止对所请求资源的访问。
     + `InvalidRequestCertificate` - 分配与建立 HTTPS 连接的 SSL/TLS 证书不匹配。
     + `InvalidRequestHeader` - 请求包含无效的标头。
     + `InvalidRequestMethod` - 未将分配配置为处理所使用的 HTTP 请求方法。当分配仅支持可缓存请求时，可能会发生这种情况。
     + `OriginCommError` – 连接到源或从源读取数据时，请求超时。
     + `OriginConnectError` – 服务器无法连接到源。
     + `OriginContentRangeLengthError` - 源响应中的 `Content-Length` 标头与 `Content-Range` 标头中的长度不匹配。
     + `OriginDnsError` – 服务器无法解析源的域名。
     + `OriginError` - 源返回不正确的响应。
     + `OriginHeaderTooBigError` - 源返回的标头太大，边缘服务器无法处理。
     + `OriginInvalidResponseError` - 源返回无效响应。
     + `OriginReadError` – 服务器无法从源读取。
     + `OriginWriteError` – 服务器无法写入到源。
     + `OriginZeroSizeObjectError` - 从源发送的零大小对象会导致错误。
     + `SlowReaderOriginError` - 查看器读取导致源错误的消息时速度较慢。

1. **`sc-content-type`**

   响应的 HTTP `Content-Type` 标头的值。

1. **`sc-content-len`**

   响应的 HTTP `Content-Length` 标头的值。

1. **`sc-range-start`**

   当响应包含 HTTP `Content-Range` 标头时，此字段包含范围起始值。

1. **`sc-range-end`**

   当响应包含 HTTP `Content-Range` 标头时，此字段包含范围结束值。

1. **`distribution-tenant-id`**

   分配租户的 ID。

1. **`connection-id`**

   TLS 连接的唯一标识符。

   您必须先为分配启用 mTLS，之后才能获取此字段的信息。有关更多信息，请参阅 [CloudFront 的双向 TLS 身份验证（查看器 mTLS）源双向 TLS 与 CloudFront 结合使用](mtls-authentication.md)。

   

以下是分配的日志文件示例：

```
#Version: 1.0
#Fields: date time x-edge-location sc-bytes c-ip cs-method cs(Host) cs-uri-stem sc-status cs(Referer) cs(User-Agent) cs-uri-query cs(Cookie) x-edge-result-type x-edge-request-id x-host-header cs-protocol cs-bytes time-taken x-forwarded-for ssl-protocol ssl-cipher x-edge-response-result-type cs-protocol-version fle-status fle-encrypted-fields c-port time-to-first-byte x-edge-detailed-result-type sc-content-type sc-content-len sc-range-start sc-range-end
2019-12-04	21:02:31	LAX1	392	192.0.2.100	GET	d111111abcdef8.cloudfront.net	/index.html	200	-	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Hit	SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ==	d111111abcdef8.cloudfront.net	https	23	0.001	-	TLSv1.2	ECDHE-RSA-AES128-GCM-SHA256	Hit	HTTP/2.0	-	-	11040	0.001	Hit	text/html	78	-	-
2019-12-04	21:02:31	LAX1	392	192.0.2.100	GET	d111111abcdef8.cloudfront.net	/index.html	200	-	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Hit	k6WGMNkEzR5BEM_SaF47gjtX9zBDO2m349OY2an0QPEaUum1ZOLrow==	d111111abcdef8.cloudfront.net	https	23	0.000	-	TLSv1.2	ECDHE-RSA-AES128-GCM-SHA256	Hit	HTTP/2.0	-	-	11040	0.000	Hit	text/html	78	-	-
2019-12-04	21:02:31	LAX1	392	192.0.2.100	GET	d111111abcdef8.cloudfront.net	/index.html	200	-	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Hit	f37nTMVvnKvV2ZSvEsivup_c2kZ7VXzYdjC-GUQZ5qNs-89BlWazbw==	d111111abcdef8.cloudfront.net	https	23	0.001	-	TLSv1.2	ECDHE-RSA-AES128-GCM-SHA256	Hit	HTTP/2.0	-	-	11040	0.001	Hit	text/html	78	-	-	
2019-12-13	22:36:27	SEA19-C1	900	192.0.2.200	GET	d111111abcdef8.cloudfront.net	/favicon.ico	502	http://www.example.com/	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Error	1pkpNfBQ39sYMnjjUQjmH2w1wdJnbHYTbag21o_3OfcQgPzdL2RSSQ==	www.example.com	http	675	0.102	-	-	-	Error	HTTP/1.1	-	-	25260	0.102	OriginDnsError	text/html	507	-	-
2019-12-13	22:36:26	SEA19-C1	900	192.0.2.200	GET	d111111abcdef8.cloudfront.net	/	502	-	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Error	3AqrZGCnF_g0-5KOvfA7c9XLcf4YGvMFSeFdIetR1N_2y8jSis8Zxg==	www.example.com	http	735	0.107	-	-	-	Error	HTTP/1.1	-	-	3802	0.107	OriginDnsError	text/html	507	-	-
2019-12-13	22:37:02	SEA19-C2	900	192.0.2.200	GET	d111111abcdef8.cloudfront.net	/	502	-	curl/7.55.1	-	-	Error	kBkDzGnceVtWHqSCqBUqtA_cEs2T3tFUBbnBNkB9El_uVRhHgcZfcw==	www.example.com	http	387	0.103	-	-	-	Error	HTTP/1.1	-	-	12644	0.103	OriginDnsError	text/html	507	-	-
```

## 分析日志
<a name="access-logs-analyzing"></a>

由于您每小时可以收到多个访问日志，因此建议您将给定时段内接收的所有日志文件合并成一个文件。然后，您可更准确更全面地分析该时期内的数据。

分析访问日志的一种方式是使用 [Amazon Athena](https://aws.amazon.com/athena/)。Athena 是一项交互式查询服务，可以帮助您为 AWS 服务（包括 CloudFront）分析数据。要了解更多信息，请参阅《Amazon Athena 用户指南》**中的[查询 Amazon CloudFront 日志](https://docs.aws.amazon.com/athena/latest/ug/cloudfront-logs.html) 。

此外，以下 AWS 博客文章讨论了分析访问日志的一些方式。
+ [Amazon CloudFront 请求日志记录](https://aws.amazon.com/blogs/aws/amazon-cloudfront-request-logging/)（针对通过 HTTP 提供的内容）
+ [增强的 CloudFront 日志，现在包含查询字符串](https://aws.amazon.com/blogs/aws/enhanced-cloudfront-logs-now-with-query-strings/)

# 使用实时访问日志
<a name="real-time-logs"></a>

利用 CloudFront 实时访问日志，您可以实时获取有关向分配发出的请求的信息（日志在收到请求后的几秒钟内传输）。您可以使用实时访问日志来进行监控和分析，并根据内容交付性能采取相应措施。

CloudFront 实时访问日志是可配置的。您可以选择：
+ 实时日志的*采样率*，即希望接收实时访问日志记录的请求的百分比。
+ 希望在日志记录中接收的特定字段。
+ 要接收实时日志的特定缓存行为（路径模式）。

CloudFront 实时访问日志将传送到 Amazon Kinesis Data Streams 中您选择的数据流。您可以构建自己的 [Kinesis 数据流消费程序](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-consumers.html)，或使用 Amazon Data Firehose 将日志数据发送到 Amazon Simple Storage Service（Amazon S3）、Amazon Redshift、Amazon OpenSearch Service（OpenSearch Service）或第三方日志处理服务。

CloudFront 除了收取因使用 Kinesis Data Streams 产生的费用外，还针对实时访问日志进行收费。有关定价的更多信息，请参阅 [Amazon CloudFront 定价](https://aws.amazon.com/cloudfront/pricing/)和 [Amazon Kinesis Data Streams 定价](https://aws.amazon.com/kinesis/data-streams/pricing/)。

**重要**  
建议您使用日志来了解内容的请求性质，而不是作为所有请求的完整描述。CloudFront 将尽力提供实时访问日志。特定请求的日志条目可能会在实际处理该请求之后很久才进行传输，而且极少数情况下，可能根本不会传输日志条目。当实时访问日志中省略了日志条目时，实时访问日志中的条目数将与 AWS 账单和使用情况报告中显示的使用情况不匹配。

**Topics**
+ [创建并使用实时访问日志配置](#create-real-time-log-config)
+ [了解实时访问日志配置](#understand-real-time-log-config)
+ [创建 Kinesis Data Streams 使用者](#real-time-log-consumer-guidance)
+ [实时访问日志问题排查](#real-time-log-troubleshooting)

## 创建并使用实时访问日志配置
<a name="create-real-time-log-config"></a>

要实时获取向分配发出的请求的相关信息，您可以使用实时访问日志配置。日志将在收到请求后的几秒钟内传送。您可以在 CloudFront 控制台中、使用 AWS Command Line Interface（AWS CLI）或 CloudFront API 创建实时访问日志配置。

要使用实时访问日志配置，请将它附加到 CloudFront 分配中的一个或多个缓存行为。

------
#### [ Console ]

**创建实时访问日志配置**

1. 登录 AWS 管理控制台 并通过以下网址在 CloudFront 控制台中打开**日志**页面：[https://console.aws.amazon.com/cloudfront/v4/home?#/logs](https://console.aws.amazon.com/cloudfront/v4/home?#/logs)。

1. 选择**实时配置**选项卡。

1. 选择**创建配置**。

1. 对于**名称**，请输入配置名称。

1. 对于**采样率**，请输入您希望接收其日志记录的请求的百分比。

1. 对于**字段**，请选择要在实时访问日志中接收的字段。
   + 要在日志中包含所有 [CMCD 字段](#CMCD-real-time-logging-fields)，请选择 **CMCD 所有键**。

1. 对于**端点**，请选择一个或多个 Kinesis Data Streams 来接收实时访问日志。
**注意**  
CloudFront 实时访问日志将传送到您在 Kinesis Data Streams 中指定的数据流。要读取和分析实时访问日志，您可以构建自己的 Kinesis 数据流使用者。您也可以使用 Firehose 将日志数据发送到 Amazon S3、Amazon Redshift、Amazon OpenSearch Service 或第三方日志处理服务。

1. 对于 **IAM 角色**，请选择**创建新服务角色**或选择现有角色。您必须具有创建 IAM 角色的权限。

1. （可选）对于**分配**，请选择要附加到实时访问日志配置的 CloudFront 分配和缓存行为。

1. 选择**创建配置**。

如果成功，控制台将显示您刚创建的实时访问日志配置的详细信息。

有关更多信息，请参阅 [了解实时访问日志配置](#understand-real-time-log-config)。

------
#### [ AWS CLI ]

要使用 AWS CLI 创建实时访问日志配置，请使用 **aws cloudfront create-realtime-log-config** 命令。您可以使用输入文件来提供命令的输入参数，而不是将每个单独的参数指定为命令行输入。

**创建实时访问日志配置（CLI 及输入文件）**

1. 使用以下命令创建名为 `rtl-config.yaml` 的文件，其中包含 **create-realtime-log-config** 命令的所有输入参数。

   ```
   aws cloudfront create-realtime-log-config --generate-cli-skeleton yaml-input > rtl-config.yaml
   ```

1. 打开刚创建的名为 `rtl-config.yaml` 的文件。编辑该文件以指定所需的实时访问日志配置设置，然后保存该文件。请注意以下几点：
   + 对于 `StreamType`，唯一的有效值为 `Kinesis`。

   有关实时长配置设置的更多信息，请参阅[了解实时访问日志配置](#understand-real-time-log-config)。

1. 通过以下命令，使用 `rtl-config.yaml` 文件中的输入参数创建实时访问日志配置。

   ```
   aws cloudfront create-realtime-log-config --cli-input-yaml file://rtl-config.yaml
   ```

如果成功，命令的输出将显示您刚创建的实时访问日志配置的详细信息。

**将实时访问日志配置附加到现有分配（CLI 及输入文件）**

1. 使用以下命令保存要更新的 CloudFront 分配的分配配置。将 *distribution\$1ID* 替换为分配的 ID。

   ```
   aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
   ```

1. 打开刚创建的名为 `dist-config.yaml` 的文件。编辑该文件，针对要进行更新来使用实时访问日志配置的每个缓存行为，进行以下更改。
   + 在缓存行为中，添加名为 `RealtimeLogConfigArn` 的字段。对于字段的值，使用要附加到此缓存行为的实时访问日志配置的 ARN。
   + 将 `ETag` 字段重命名为 `IfMatch`，但不更改字段的值。

   完成后保存该文件。

1. 使用以下命令更新分配以使用实时访问日志配置。将 *distribution\$1ID* 替换为分配的 ID。

   ```
   aws cloudfront update-distribution --id distribution_ID --cli-input-yaml file://dist-config.yaml
   ```

如果成功，命令的输出将显示您刚刚更新的分配的详细信息。

------
#### [ API ]

要使用 CloudFront API 创建实时访问日志配置，请使用 [CreateRealtimeLogConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateRealtimeLogConfig.html) API 操作。有关您在此 API 调用中指定的参数的更多信息，请参阅 [了解实时访问日志配置](#understand-real-time-log-config) 以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

创建实时访问日志配置后，您可以使用下列 API 操作之一将该配置附加到缓存行为：
+ 要将该配置附加到现有分配中的缓存行为，请使用 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 要将该配置附加到新分配中的缓存行为，请使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)。

对于这两个 API 操作，请在缓存行为内的 `RealtimeLogConfigArn` 字段中提供实时访问日志配置的 ARN。有关您在这些 API 调用中指定的其他字段的更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md) 以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

------

## 了解实时访问日志配置
<a name="understand-real-time-log-config"></a>

要使用 CloudFront 实时访问日志，请先创建实时访问日志配置。实时访问日志配置包含有关要接收的日志字段、日志记录的*采样率*以及要在其中传输日志的 Kinesis 数据流的信息。

具体而言，实时访问日志配置包含以下设置：

**Contents**
+ [名称](#real-time-logs-name)
+ [采样率](#real-time-logs-sampling-rate)
+ [字段](#real-time-logs-fields)
+ [端点 (Kinesis Data Streams)](#real-time-logs-endpoint)
+ [IAM 角色](#real-time-logs-IAM)

### 名称
<a name="real-time-logs-name"></a>

用于标识实时访问日志配置的名称。

### 采样率
<a name="real-time-logs-sampling-rate"></a>

采样率是一个介于 1 和 100 之间的整数（含 1 和 100），用于确定作为实时访问日志记录发送到 Kinesis Data Streams 的查看器请求的百分比。要在实时访问日志中包含所有查看器请求，请指定 100 作为采样率。您可以选择较低的采样率来降低成本，同时仍在实时访问日志中接收具有代表性的请求数据样本。

### 字段
<a name="real-time-logs-fields"></a>

每个实时访问日志记录中包含的字段列表。每个日志记录最多可包含 40 个字段，您可以选择接收所有可用字段，也可以选择仅接收监控和分析性能所需的字段。

以下列表包含每个字段名称和该字段中信息的说明。字段将按照它们在传输到 Kinesis Data Streams 的日志记录中的显示顺序列出。

字段 46-63 是[常见的媒体客户端数据（CMCD）](#CMCD-real-time-logging-fields)，媒体播放器客户端可以在每次请求时将其发送到 CDN。您可以使用这些数据来了解每个请求，例如媒体类型（音频、视频）、播放速率和直播时长。只有在将这些字段发送到 CloudFront 后，它们才会显示在您的实时访问日志中。

1. **`timestamp`**

   边缘服务器完成对请求的响应的日期和时间。

1. **`c-ip`**

   已发出请求的查看器的 IP 地址，例如 `192.0.2.183` 或 `2001:0db8:85a3::8a2e:0370:7334`。如果查看器已使用 HTTP 代理或负载均衡器发送请求，则此字段的值为该代理或负载均衡器的 IP 地址。另请参阅 `x-forwarded-for` 字段。

1. **`s-ip`**

   为请求提供服务的 CloudFront 服务器的 IP 地址，例如 `192.0.2.183` 或 `2001:0db8:85a3::8a2e:0370:7334`。

1. **`time-to-first-byte`**

   从收到请求到写入响应的第一个字节之间的秒数（在服务器上测量）。

1. **`sc-status`**

   服务器响应的 HTTP 状态代码（例如 `200`）。

1. **`sc-bytes`**

   服务器在响应请求时向查看器提供的字节的总数，包括标头。对于 WebSocket 和 gRPC 连接，这是通过连接从服务器发送到客户端的字节的总数。

1. **`cs-method`**

   从查看器接收的 HTTP 请求方法。

1. **`cs-protocol`**

   查看器请求的协议（`http`、`https`、`grpcs`、`ws` 或 `wss`）。

1. **`cs-host`**

   查看器在该请求的 `Host` 标头中包含的值。如果您在对象 URL 中使用 CloudFront 域名（如 d111111abcdef8.cloudfront.net），则此字段将包含该域名。如果在您的对象 URL（例如 www.example.com）中使用的是备用域名（CNAME），则此字段将包含备用域名。

1. **`cs-uri-stem`**

   整个请求 URL，包括查询字符串（如果有），但不包括域名。例如：`/images/cat.jpg?mobile=true`。
**注意**  
在[标准日志](AccessLogs.md)中，该 `cs-uri-stem` 值不包括查询字符串。

1. **`cs-bytes`**

   查看器包含在请求中的数据字节总数，包括标头。对于 WebSocket 和 gRPC 连接，这是通过连接从客户端发送到服务器的字节的总数。

1. **`x-edge-location`**

   服务请求的边缘站点。每个边缘站点由三个字母的代码和任意分配的数字来确定（例如，DFW3）。三个字母代码通常对应邻近边缘站点的地理位置的机场的国际航空协会（IATA）机场代码。（这些缩写将来可能会更改。）

1. **`x-edge-request-id`**

   唯一地标识请求的不透明字符串。CloudFront 还会在 `x-amz-cf-id` 响应标头中发送此字符串。

1. **`x-host-header`**

   CloudFront 分配的域名（例如，d111111abcdef8.cloudfront.net）。

1. **`time-taken`**

   服务器收到查看器的请求的时间与服务器将响应的最后一个字节写入输出队列的时间之间相隔的秒数（精确至千分之一秒，例如 0.082），以服务器上测量的时间为准。从查看器的角度看，由于网络延迟和 TCP 缓冲的原因，获得完整响应的总时间将会超过该值。

1. **`cs-protocol-version`**

   查看器在请求中指定的 HTTP 版本。可能的值包括 `HTTP/0.9`、`HTTP/1.0`、`HTTP/1.1`、`HTTP/2.0` 和 `HTTP/3.0`。

1. **`c-ip-version`**

   请求的 IP 版本（IPv4 或 IPv6）。

1. **`cs-user-agent`**

   请求中的 `User-Agent` 标头的值。`User-Agent` 标头标识请求的来源，例如提交请求的设备和浏览器的类型，如果请求来自搜索引擎，则标识具体的搜索引擎。

1. **`cs-referer`**

   请求中的 `Referer` 标头的值。这是发出请求的域的名称。常见引用站点包括搜索引擎、直接链接到您的对象的其他网站及您自己的网站。

1. **`cs-cookie`**

   请求中的 `Cookie` 标头，包括名称/值对和关联的属性。
**注意**  
此字段被截断为 800 字节。

1. **`cs-uri-query`**

   请求 URL 的查询字符串部分（如果有）。

1. **`x-edge-response-result-type`**

   服务器在将响应返回到查看器之前如何对响应进行分类。另请参阅 `x-edge-result-type` 字段。可能的值包括：
   + `Hit` – 服务器从缓存中将对象提供给查看器。
   + `RefreshHit` – 服务器在缓存中找到了对象，但该对象已过期，因此，服务器联系了源，以验证缓存是否具有该对象的最新版本。
   + `Miss` – 缓存中的对象无法满足请求，因此，服务器将请求转发到源服务器并将结果返回到查看器。
   + `LimitExceeded` – 请求被拒绝，因为超出了 CloudFront 配额（以前称为限制）。
   + `CapacityExceeded` – 服务器返回了 503 错误，因为它在请求时没有足够的容量来服务对象。
   + `Error` – 通常，这意味着请求会导致客户端错误（`sc-status` 字段的值在 `4xx` 范围内）或服务器错误（`sc-status` 字段的值在 `5xx` 范围内）。

     如果 `x-edge-result-type` 字段的值为 `Error`，而此字段的值不是 `Error`，则客户端在下载完成前已断开连接。
   + `Redirect` – 服务器已根据分发设置将查看器从 HTTP 重定向到 HTTPS。
   + `LambdaExecutionError`：由于关联格式错误、函数超时、AWS 依赖关系问题或其它正式发布问题，与分配关联的 Lambda@Edge 函数未完成。

1. **`x-forwarded-for`**

   如果查看器已使用 HTTP 代理或负载均衡器发送请求，则 `c-ip` 字段的值为该代理或负载均衡器的 IP 地址。在本例中，此字段为发出请求的查看器的 IP 地址。此字段可以包含多个逗号分隔的 IP 地址。每个 IP 地址可以是 IPv4 地址（如 `192.0.2.183`）或 IPv6 地址（如 `2001:0db8:85a3::8a2e:0370:7334`）。

1. **`ssl-protocol`**

   如果请求使用了 HTTPS，则此字段包含查看器和服务器协商用于传输请求和响应的 SSL/TLS 协议。有关可能的值的列表，请参阅[查看器和 CloudFront 之间支持的协议和密码](secure-connections-supported-viewer-protocols-ciphers.md)中支持的 SSL/TLS 协议。

1. **`ssl-cipher`**

   如果请求使用了 HTTPS，则此字段包含查看器和服务器协商用于加密请求和响应的 SSL/TLS 密码。有关可能的值的列表，请参阅[查看器和 CloudFront 之间支持的协议和密码](secure-connections-supported-viewer-protocols-ciphers.md)中支持的 SSL/TLS 密码。

1. **`x-edge-result-type`**

   在最后一个字节离开服务器后服务器如何对响应进行分类。在某些情况下，结果类型可能会在服务器准备发送响应的时间与完成发送响应的时间之间发生变化。另请参阅 `x-edge-response-result-type` 字段。

   例如，在 HTTP 流中，假设服务器在缓存中发现流的一个区段。在这种情况下，此字段的值通常为 `Hit`。但是，如果查看器在服务器传送整个区段之前关闭连接，则最终结果类型（以及此字段的值）为 `Error`。

   WebSocket 和 gRPC 连接的此字段的值为 `Miss`，因为内容不可缓存，并直接代理到源。

   可能的值包括：
   + `Hit` – 服务器从缓存中将对象提供给查看器。
   + `RefreshHit` – 服务器在缓存中找到了对象，但该对象已过期，因此，服务器联系了源，以验证缓存是否具有该对象的最新版本。
   + `Miss` – 缓存中的对象无法满足请求，因此，服务器将请求转发到源并将结果返回到查看器。
   + `LimitExceeded` – 请求被拒绝，因为超出了 CloudFront 配额（以前称为限制）。
   + `CapacityExceeded` – 服务器返回了 HTTP 503 状态代码，因为它在请求时没有足够的容量来服务对象。
   + `Error` – 通常，这意味着请求会导致客户端错误（`sc-status` 字段的值在 `4xx` 范围内）或服务器错误（`sc-status` 字段的值在 `5xx` 范围内）。如果 `sc-status` 字段的值为 `200`，或者如果此字段的值为 `Error` 且 `x-edge-response-result-type` 字段的值不是 `Error`，则表示 HTTP 请求已成功，但客户端在接收所有字节之前断开连接。
   + `Redirect` – 服务器已根据分发设置将查看器从 HTTP 重定向到 HTTPS。
   + `LambdaExecutionError`：由于关联格式错误、函数超时、AWS 依赖关系问题或其它正式发布问题，与分配关联的 Lambda@Edge 函数未完成。

1. **`fle-encrypted-fields`**

   服务器加密并转发到源的[字段级加密](field-level-encryption.md)字段的数量。CloudFront 服务器在加密数据时会将处理的请求传输到源，这样一来，即使 `fle-status` 的值为错误，此字段也会具有值。

1. **`fle-status`**

   在为分配配置[字段级加密](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html)时，此字段包含一个指示是否已成功处理请求正文的代码。如果服务器成功处理了请求正文，加密了指定字段中的值并将请求转发到源，则此字段的值为 `Processed`。在这种情况下，`x-edge-result-type` 的值仍可以指示客户端或服务器端错误。

   此字段的可能值包括：
   + `ForwardedByContentType` – 由于没有配置内容类型，因此服务器将请求转发到了源，而不进行解析或加密。
   + `ForwardedByQueryArgs` – 由于请求包含的查询参数不在字段级加密的配置中，因此服务器将请求转发到了源，而不进行解析或加密。
   + `ForwardedDueToNoProfile` – 由于在字段级加密的配置中没有指定配置文件，因此服务器将请求转发到了源，而不进行解析或加密。
   + `MalformedContentTypeClientError` – 由于 `Content-Type` 标头值的格式无效，因此，服务器拒绝了该请求并向查看器返回了 HTTP 400 状态代码。
   + `MalformedInputClientError` – 由于请求正文的格式无效，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `MalformedQueryArgsClientError` – 由于查询参数为空或格式无效，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `RejectedByContentType` – 由于在字段级加密的配置中没有指定内容类型，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `RejectedByQueryArgs` – 由于在字段级加密的配置中没有指定查询参数，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `ServerError` – 源服务器返回了错误。

   如果请求超出字段级加密配额（以前称作限制），则此字段包含下列错误代码之一，并且服务器向查看器返回 HTTP 状态代码 400。有关字段级加密的当前配额的列表，请参[对字段级加密的配额](cloudfront-limits.md#limits-field-level-encryption)。
   + `FieldLengthLimitClientError` – 配置为加密的字段超出允许的最大长度。
   + `FieldNumberLimitClientError` – 将分配配置为加密的请求包含的字段数超过允许值。
   + `RequestLengthLimitClientError` – 在配置了字段级加密时，请求正文的长度超出允许的最大长度。

1. **`sc-content-type`**

   响应的 HTTP `Content-Type` 标头的值。

1. **`sc-content-len`**

   响应的 HTTP `Content-Length` 标头的值。

1. **`sc-range-start`**

   当响应包含 HTTP `Content-Range` 标头时，此字段包含范围起始值。

1. **`sc-range-end`**

   当响应包含 HTTP `Content-Range` 标头时，此字段包含范围结束值。

1. **`c-port`**

   查看器发出的请求的端口号。

1. **`x-edge-detailed-result-type`**

   此字段包含与 `x-edge-result-type` 字段相同的值，但以下情况除外：
   + 当对象从[源护盾](origin-shield.md)层提供给查看器时，该字段包含 `OriginShieldHit`。
   + 当对象不在 CloudFront 缓存中并且响应是由[源请求 Lambda@Edge 函数](lambda-at-the-edge.md)生成时，此字段包含 `MissGeneratedResponse`。
   + 当 `x-edge-result-type` 字段的值为 `Error` 时，此字段包含以下值之一，其中包含有关错误的更多信息：
     + `AbortedOrigin` – 服务器遇到了源方面的问题。
     + `ClientCommError` – 由于服务器与查看器之间的通信问题，对查看器的响应已中断。
     + `ClientGeoBlocked` - 将分配配置为拒绝来自查看器地理位置的请求。
     + `ClientHungUpRequest` - 查看器在发送请求时提前停止。
     + `Error` – 出现错误，其错误类型不适合任何其他类别。当服务器从缓存提供错误响应时，可能会发生此类型的错误。
     + `InvalidRequest` – 服务器收到了来自查看器的无效请求。
     + `InvalidRequestBlocked` - 阻止对所请求资源的访问。
     + `InvalidRequestCertificate` - 分配与建立 HTTPS 连接的 SSL/TLS 证书不匹配。
     + `InvalidRequestHeader` - 请求包含无效的标头。
     + `InvalidRequestMethod` - 未将分配配置为处理所使用的 HTTP 请求方法。当分配仅支持可缓存请求时，可能会发生这种情况。
     + `OriginCommError` – 连接到源或从源读取数据时，请求超时。
     + `OriginConnectError` – 服务器无法连接到源。
     + `OriginContentRangeLengthError` - 源响应中的 `Content-Length` 标头与 `Content-Range` 标头中的长度不匹配。
     + `OriginDnsError` – 服务器无法解析源的域名。
     + `OriginError` - 源返回不正确的响应。
     + `OriginHeaderTooBigError` - 源返回的标头太大，边缘服务器无法处理。
     + `OriginInvalidResponseError` - 源返回无效响应。
     + `OriginReadError` – 服务器无法从源读取。
     + `OriginWriteError` – 服务器无法写入到源。
     + `OriginZeroSizeObjectError` - 从源发送的零大小对象会导致错误。
     + `SlowReaderOriginError` - 查看器读取导致源错误的消息时速度较慢。

1. **`c-country`**

   表示查看器的地理位置的国家/地区代码，由查看器的 IP 地址决定。有关国家/地区代码的列表，请参阅 [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)。

1. **`cs-accept-encoding`**

    查看器请求中的 `Accept-Encoding` 标头的值。

1. **`cs-accept`**

   查看器请求中的 `Accept` 标头的值。

1. **`cache-behavior-path-pattern`**

   标识与查看器请求匹配的缓存行为的路径模式。

1. **`cs-headers`**

   查看器请求中的 HTTP 标头（名称和值）。
**注意**  
此字段被截断为 800 字节。

1. **`cs-header-names`**

   查看器请求中的 HTTP 标头的名称（而不是值）。
**注意**  
此字段被截断为 800 字节。

1. **`cs-headers-count`**

    查看器请求中的 HTTP 标头的数量。

1. **`primary-distribution-id`**

   启用持续部署后，此 ID 将标识当前分配中的哪个分配是主分配。

1. **`primary-distribution-dns-name`**

   启用持续部署后，此值显示与当前 CloudFront 分配相关的主域名（例如 d111111abcdef8.cloudfront.net）。

1. **`origin-fbl`**

   CloudFront 与您的源之间第一字节延迟的秒数。

1. **`origin-lbl`**

   CloudFront 与您的源之间最后一个字节延迟的秒数。

1. **`asn`**

   包含查看器的自治系统号 (ASN)。

1. <a name="CMCD-real-time-logging-fields"></a>
**实时访问日志中的 CMCD 字段**  
有关这些字段的更多信息，请参阅 [CTA 规范 Web 应用程序视频生态系统 - 通用媒体客户端数据 CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf) 文档。

1. **`cmcd-encoded-bitrate`**

   请求的音频或视频对象的编码比特率。

1. **`cmcd-buffer-length`**

   所请求媒体对象的缓冲区长度。

1. **`cmcd-buffer-starvation`**

   缓冲区是否在先前的请求和对象请求之间的某个时刻被耗尽。这可能会导致播放器处于重新缓冲状态，从而导致视频或音频播放停滞。

1. **`cmcd-content-id`**

   标识当前内容的唯一字符串。

1. **`cmcd-object-duration`**

   请求对象的播放时长（以毫秒为单位）。

1. **`cmcd-deadline`**

   从请求时间算起的截止日期，在这一时间，该对象的第一个样本必须可用，这样可以避免缓冲区处于欠载状态或出现其他播放问题。

1. **`cmcd-measured-throughput`**

   客户端和服务器之间的吞吐量，由客户端进行测量。

1. **`cmcd-next-object-request`**

   所请求下一个对象的相对路径。

1. **`cmcd-next-range-request`**

   如果下一个请求是部分对象请求，则此字符串表示要请求的字节范围。

1. **`cmcd-object-type`**

   所请求的当前对象的媒体类型。

1. **`cmcd-playback-rate`**

   如果是实时播放，则为 1；如果是倍速播放，则为 2；如果不播放，则为 0。

1. **`cmcd-requested-maximum-throughput`**

   请求的最大吞吐量，客户端认为足以交付资源。

1. **`cmcd-streaming-format`**

   定义当前请求的流媒体格式。

1. **`cmcd-session-id`**

   标识当前播放会话的 GUID。

1. **`cmcd-stream-type`**

   令牌识别区段的可用性。 `v` = 所有区段都可用。`l` = 区段会随着时间的推移而变得可用。

1. **`cmcd-startup`**

   如果在启动、搜索或缓冲区空事件后的恢复期间迫切需要该对象，则可包含不带值的键。

1. **`cmcd-top-bitrate`**

   客户端可以播放的最高比特率副本。

1. **`cmcd-version`**

   本规范的版本，用于解释已定义的键名和键值。如果省略此键，则客户端和服务器*必须* 将这些值解释为由版本 1 定义。

1. **`r-host`**

   此字段针对源请求发送，表示用于提供对象的原始服务器的域。出现错误时，您可以使用此字段来查找上次尝试的源，例如：`cd8jhdejh6a.mediapackagev2.us-east-1.amazonaws.com`。

1. **`sr-reason`**

   此字段提供选择该源的原因。当对主源发出的请求成功时，此字段为空。

   如果发生源失效转移，则该字段将包含导致失效转移的 HTTP 错误代码，例如 `Failover:403` 或 `Failover:502`。出现源失效转移时，如果重试的请求也失败并且您没有配置自定义错误页面，则 `r-status` 指示第二个源的响应。但是，如果您配置了自定义错误页面以及源失效转移，则在请求失败并且改为返回自定义错误页面时，这将包含第二个源的响应。

   如果没有发生源失效转移，但选择了媒体质量感知弹性（MQAR）源，则会将其记录为 `MediaQuality`。有关更多信息，请参阅 [媒体质量感知弹性](media-quality-score.md)。

1. **`x-edge-mqcs`**

   此字段表示在 MediaPackage v2 的 CMSD 响应标头中，CloudFront 检索到的媒体分段的媒体质量置信度分数（MQCS，Media Quality Confidence Score，范围：0 到 100）。对与启用 MQAR 的源组的缓存行为相匹配的请求，此字段可用。在源请求之外，CloudFront 还会为从其缓存中提供的媒体分段记录此字段。有关更多信息，请参阅 [媒体质量感知弹性](media-quality-score.md)。

1. **`distribution-tenant-id`**

   分配租户的 ID。

1. **`connection-id`**

   TLS 连接的唯一标识符。

   您必须先为分配启用 mTLS，之后才能获取此字段的信息。有关更多信息，请参阅 [CloudFront 的双向 TLS 身份验证（查看器 mTLS）源双向 TLS 与 CloudFront 结合使用](mtls-authentication.md)。

### 端点 (Kinesis Data Streams)
<a name="real-time-logs-endpoint"></a>

端点包含有关您要在其中发送实时日志的 Kinesis Data Streams 的信息。您需要提供数据流的 Amazon 资源名称（ARN）。

有关创建 Kinesis Data Streams 的更多信息，请参阅《Amazon Kinesis Data Streams 开发人员指南》**中的以下主题。
+ [Creating and managing streams](https://docs.aws.amazon.com/streams/latest/dev/working-with-streams.html)
+ [Perform basic Kinesis Data Streams operations using the AWS CLI](https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html)
+ [Creating a stream](https://docs.aws.amazon.com/streams/latest/dev/kinesis-using-sdk-java-create-stream.html)（使用适用于 Java 的 AWS SDK）

创建数据流时，您需要指定分片的数量。使用以下信息可帮助您估计所需的分片数量。

**估计 Kinesis 数据流的分片数**

1. 计算（或估算）您的 CloudFront 分配每秒钟接收的请求数。

   您可以使用 [CloudFront 使用情况报告](https://console.aws.amazon.com/cloudfront/v4/home#/usage)（在 CloudFront 控制台中）和 [CloudFront 指标](viewing-cloudfront-metrics.md#monitoring-console.distributions)（在 CloudFront 和 Amazon CloudWatch 控制台中）来帮助您计算每秒的请求数。

1. 确定单个实时访问日志记录的典型大小。

   通常，单个日志记录约为 500 字节。一个包含所有可用字段的大型记录一般约为 1KB。

   如果您不确定您的日志记录的大小，可以启用低采样率（例如 1%）的实时日志，然后使用 Kinesis Data Streams 中的监测数据计算记录的平均大小（记录总数除以总的传入字节数）。

1. 在 [Amazon Kinesis Data Streams 定价](https://aws.amazon.com/kinesis/data-streams/pricing/)页面的 AWS 定价计算器下方，选择**立即创建您的自定义估计**。
   + 在计算器中，输入每秒的请求（记录）数。
   + 输入单个日志记录的平均记录大小。
   + 选择**显示计算结果**。

   定价计算器会显示您需要的分片数量和估计成本。

### IAM 角色
<a name="real-time-logs-IAM"></a>

AWS Identity and Access Management（IAM）角色，授予 CloudFront 向您的 Kinesis 数据流传送实时访问日志的权限。

使用 CloudFront 控制台创建实时访问日志配置时，可以选择**创建新服务角色**以让控制台为您创建 IAM 角色。

当您使用 AWS CloudFormation 或 CloudFront API（AWS CLI 或 SDK）创建实时访问日志配置时，必须自行创建 IAM 角色并提供角色 ARN。要自行创建 IAM 角色，请使用以下策略。

**IAM 角色信任策略**

要使用以下 IAM 角色信任策略，请将 *111122223333* 替换为您的 AWS 账户号。此策略中的 `Condition` 条件元素有助于防止出现[混淆代理人问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)，因为 CloudFront 只能代表 AWS 账户中的分配承担此角色。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

------

**未加密数据流的 IAM 角色权限策略**

要使用以下策略，请将 *arn:aws:kinesis:us-east-2:123456789012:stream/StreamName* 替换为 Kinesis 数据流的 ARN。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:DescribeStreamSummary",
                "kinesis:DescribeStream",
                "kinesis:PutRecord",
                "kinesis:PutRecords"
            ],
            "Resource": [
                "arn:aws:kinesis:us-east-2:123456789012:stream/StreamName"
            ]
        }
    ]
}
```

------

**已加密数据流的 IAM 角色权限策略**

要使用以下策略，请用 Kinesis 数据流的 ARN 替换 *arn:aws:kinesis:us-east-2:123456789012:stream/StreamName*，以及用 AWS KMS key 的 ARN 替换 *arn:aws:kms:us-east-2:123456789012:key/e58a3d0b-fe4f-4047-a495-ae03cc73d486*。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:DescribeStreamSummary",
                "kinesis:DescribeStream",
                "kinesis:PutRecord",
                "kinesis:PutRecords"
            ],
            "Resource": [
                "arn:aws:kinesis:us-east-2:123456789012:stream/StreamName"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey"
            ],
            "Resource": [
                "arn:aws:kms:us-east-2:123456789012:key/e58a3d0b-fe4f-4047-a495-ae03cc73d486"
            ]
        }
    ]
}
```

------

****  

## 创建 Kinesis Data Streams 使用者
<a name="real-time-log-consumer-guidance"></a>

要读取和分析实时访问日志，您可以构建或使用 Kinesis Data Streams *使用者*。为 CloudFront 实时日志构建使用者时，务必了解每个实时访问日志记录中的字段始终以相同的顺序传递，如[字段](#real-time-logs-fields)部分中所列。确保构建您的使用器以适应此固定顺序。

例如，假设实时访问日志配置只包含以下三个字段：`time-to-first-byte`、`sc-status` 和 `c-country`。在此情况下，最后一个字段 `c-country` 始终是每个日志记录中的字段编号 3。但是，如果您稍后将字段添加到实时访问日志配置中，则记录中每个字段的位置可能会发生更改。

例如，如果您将 `sc-bytes` 和 `time-taken` 字段添加到实时访问日志配置，则这些字段将根据[字段](#real-time-logs-fields)部分中显示的顺序插入到每个日志记录中。所有五个字段的最终顺序为 `time-to-first-byte`、`sc-status`、`sc-bytes`、`time-taken` 和 `c-country`。`c-country` 字段最初是字段编号 3，但现在为字段编号 5。如果您将字段添加到实时访问日志配置中，请确保您的使用器应用程序可以处理在日志记录中更改位置的字段。

## 实时访问日志问题排查
<a name="real-time-log-troubleshooting"></a>

创建实时访问日志配置后，您可能会发现未将任何记录（或未将所有记录）传输到 Kinesis Data Streams。在此情况下，您应先验证您的 CloudFront 分配是否正在接收查看器请求。如果是这样，则可以检查以下设置以继续进行问题排查。

**IAM 角色权限**  
为了将实时访问日志记录传输到 Kinesis 数据流，CloudFront 将使用实时访问日志配置中的 IAM 角色。请确保角色信任策略和角色权限策略与 [IAM 角色](#real-time-logs-IAM) 中显示的策略匹配。

**Kinesis Data Streams 限制**  
如果 CloudFront 将实时访问日志记录写入您的 Kinesis 数据流的速度超过流的处理速度，Kinesis Data Streams 可能会限制来自 CloudFront 的请求。在此情况下，您可以增加 Kinesis 数据流中的分片数量。每个分片最多可以支持每秒写入 1000 条记录，最大数据写入数为每秒 1 MB。

# 边缘函数日志
<a name="edge-functions-logs"></a>

可以使用 Amazon CloudWatch Logs 获取边缘函数（包括[ Lambda@Edge](lambda-at-the-edge.md) 和 [CloudFront Functions](cloudfront-functions.md)）的日志。可以使用 CloudWatch 控制台或 CloudWatch Logs API 访问日志。

**重要**  
建议您使用日志来了解内容的请求性质，而不是作为所有请求的完整描述。CloudFront 将尽力提供边缘函数日志。特定请求的日志条目可能会在实际处理该请求之后很久才进行传输，而且极少数情况下，可能根本不会传输日志条目。当边缘函数日志中省略了日志条目时，边缘函数日志中的条目数将与 AWS 账单和使用率报告中出现的使用率不匹配。

**Topics**
+ [Lambda@Edge 日志](#lambda-at-edge-logs)
+ [CloudFront Functions 日志](#cloudfront-function-logs)

## Lambda@Edge 日志
<a name="lambda-at-edge-logs"></a>

Lambda@Edge 会自动将函数日志发送到 CloudWatch Logs，并在调用函数的 AWS 区域中创建日志流。在 AWS Lambda 中创建或修改函数时，您可以使用默认 CloudWatch 日志组名称或自定义该名称。
+ 默认日志组名称为 `/aws/lambda/<FunctionName>`，其中 `<FunctionName>` 是您在创建函数时指定的名称。向 CloudWatch 发送日志时，Lambda@Edge 会自动向函数名称中添加 `us-east-1` 前缀，因此日志组名称为 `/aws/lambda/us-east-1.<FunctionName>`。此前缀对应于在其中创建函数的 AWS 区域。此前缀保持为日志组名称的一部分，即使在调用该函数的其它区域中也是如此。
+ 如果您指定自定义日志组名称（例如 `/MyLogGroup`），Lambda@Edge 将不会添加区域前缀。该日志组名称在调用该函数的所有其它区域中保持不变。

**注意**  
如果您创建自定义日志组并指定与默认 `/aws/lambda/<FunctionName>` 相同的名称，则 Lambda@Edge 会向函数名称中添加 `us-east-1` 前缀。

除了自定义日志组名称外，Lambda@Edge 函数还支持 JSON 和纯文本日志格式以及日志级别筛选。有关更多信息，请参阅《AWS Lambda 开发人员指南》**中的[为 Lambda 函数配置高级日志记录控件](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs-advanced.html)。

**注意**  
Lambda@Edge 会基于请求量和日志大小来限制日志。

您必须查看正确的 区域中的 CloudWatch 日志文件，才能查看 Lambda@Edge 函数日志文件。要查看 Lambda@Edge 函数运行的区域，请在 CloudFront 控制台上查看此函数的指标图表。指标针对各个 区域显示。在同一页上，您可以选择一个区域，然后查看该区域的日志文件以调查问题。

要了解有关如何将 CloudWatch Logs 与 Lambda@Edge 函数结合使用的更多信息，请参阅以下主题：
+ 有关在 CloudFront 控制台的**监控**部分中查看图表的更多信息，请参阅[使用 Amazon CloudWatch 监控 CloudFront 指标](monitoring-using-cloudwatch.md)。
+ 有关向 CloudWatch Logs 发送数据所需的权限的信息，请参阅[设置 Lambda@Edge 的 IAM 权限和角色](lambda-edge-permissions.md)。
+ 有关向 Lambda@Edge 函数添加日志记录的信息，请参阅《AWS Lambda 开发人员指南》** 中的 [Node.js 中的 AWS Lambda 函数日志记录](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-logging.html)或 [Python 中的 AWS Lambda 函数日志记录](https://docs.aws.amazon.com/lambda/latest/dg/python-logging.html)。
+ 有关 CloudWatch 日志配额（以前称为限制）的信息，请参阅《Amazon CloudWatch Logs 用户指南》**中的 [CloudWatch Logs 配额](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html)。

## CloudFront Functions 日志
<a name="cloudfront-function-logs"></a>

如果 CloudFront 函数的代码包含 `console.log()` 语句，CloudFront Functions 会将这些日志行自动发送到 CloudWatch Logs。如果没有 `console.log()` 语句，则不会发送任何内容到 CloudWatch Logs 中。

CloudFront Functions 始终在美国东部（弗吉尼亚州北部）区域 (`us-east-1`) 中创建日志流，无论哪个边缘站点运行该函数。日志流名称的格式为 `YYYY/M/D/UUID`。

日志组名称使用以下格式：
+ 对于缓存行为级别的 CloudFront Functions，格式为 `/aws/cloudfront/function/<FunctionName>`
+ 对于分配级别的 CloudFront Functions（连接函数），格式为 `/aws/cloudfront/connection-function/<FunctionName>`

`<FunctionName>` 是您在创建函数时为函数指定的名称。

**Example 查看器请求**  
下面显示了发送到 CloudWatch Logs 的示例日志消息。每行都以唯一标识 CloudFront 请求的 ID 开头。消息以包含 CloudFront 分配 ID 的 `START` 行开头，以 `END` 行结尾。`START` 与 `END` 行之间是 `console.log()` 语句在函数中生成的日志行。  

```
U7b4hR_RaxMADupvKAvr8_m9gsGXvioUggLV5Oyq-vmAtH8HADpjhw== START DistributionID: E3E5D42GADAXZZ
U7b4hR_RaxMADupvKAvr8_m9gsGXvioUggLV5Oyq-vmAtH8HADpjhw== Example function log output
U7b4hR_RaxMADupvKAvr8_m9gsGXvioUggLV5Oyq-vmAtH8HADpjhw== END
```

**Example 连接请求**  
下面显示了发送到 CloudWatch Logs 的示例日志消息。每行都以唯一标识 CloudFront 请求的 ID 开头。消息以包含 CloudFront 分配 ID 的 `START` 行开头，以 `END` 行结尾。`START` 与 `END` 行之间是 `console.log()` 语句在函数中生成的日志行。  

```
U7b4hR_RaxMADupvKAvr8_m9gsGXvioUggLV5Oyq-vmAtH8HADpjhw== START DistributionID: E3E5D42GADA123
U7b4hR_RaxMADupvKAvr8_m9gsGXvioUggLV5Oyq-vmAtH8HADpjhw== 1.2.3.4
U7b4hR_RaxMADupvKAvr8_m9gsGXvioUggLV5Oyq-vmAtH8HADpjhw== END
```

**注意**  
CloudFront Functions 仅为处理生产请求和响应而运行的 `LIVE` 阶段中的函数向 CloudWatch 发送日志。[测试函数](test-function.md)时，CloudFront 不会向 CloudWatch 发送任何日志。测试输出包含有关错误、计算利用率和函数日志（`console.log()` 语句）的信息，但这些信息不会发送到 CloudWatch。

CloudFront Functions 使用 AWS Identity and Access Management (IAM) [服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-linked-role)将日志发送到您的账户中的 CloudWatch Logs。服务相关角色是一种与 AWS 服务直接关联的 IAM 角色。服务相关角色由服务预定义，包括服务为您调用其它 AWS 服务所需的所有权限。CloudFront Functions 使用 **AWSServiceRoleForCloudFrontLogger** 服务相关角色。有关此角色的更多信息，请参阅[Lambda@Edge 的服务相关角色](lambda-edge-permissions.md#using-service-linked-roles-lambda-edge)（Lambda@Edge 使用同一个服务相关角色）。

当函数失败并出现验证错误或执行错误时，信息将记录在[标准日志](AccessLogs.md)和[实时访问日志](real-time-logs.md)中。有关错误的具体信息，请参阅 `x-edge-result-type`、`x-edge-response-result-type` 和 `x-edge-detailed-result-type` 字段。

# 使用 AWS CloudTrail 记录 Amazon CloudFront API 调用
<a name="logging_using_cloudtrail"></a>

CloudFront 可与 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 集成，后者是一项可提供用户、角色或 AWS 服务所执行操作记录的服务。CloudTrail 将对 CloudFront 的所有 API 调用作为事件捕获。捕获的调用包括来自 CloudFront 控制台的调用和对 CloudFront API 操作的代码调用。借助 CloudTrail 收集的信息，您可以确定向 CloudFront 发出的请求、发出请求的 IP 地址、请求的发出时间及其他详细信息。

每个事件或日志条目都包含有关生成请求的人员信息。身份信息有助于您确定以下内容：
+ 请求是使用根用户凭证还是用户凭证发出的。
+ 请求是否代表 IAM Identity Center 用户发出。
+ 请求是使用角色还是联合用户的临时安全凭证发出的。
+ 请求是否由其他 AWS 服务 发出。

当您创建账户并可以自动访问 CloudTrail **事件历史记录**时，CloudTrail 在您的 AWS 账户 中处于活动状态。CloudTrail **事件历史记录**提供对 AWS 区域 中过去 90 天的已记录管理事件的可查看、可搜索、可下载和不可变记录。有关更多信息，请参阅《AWS CloudTrail 用户指南》的[使用 CloudTrail 事件历史记录](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)**。查看**事件历史记录**不会收取 CloudTrail 费用。

要持续记录您的 AWS 账户 过去 90 天的事件，请创建跟踪或 [CloudTrail Lake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html) 事件数据存储。

**CloudTrail 跟踪**  
通过*跟踪记录*，CloudTrail 可将日志文件传送至 Amazon S3 存储桶。使用 AWS 管理控制台 创建的所有跟踪均具有多区域属性。您可以通过使用 AWS CLI 创建单区域或多区域跟踪。建议创建多区域跟踪，因为您可记录您账户中的所有 AWS 区域 的活动。如果您创建单区域跟踪，则只能查看跟踪的 AWS 区域 中记录的事件。有关跟踪的更多信息，请参阅《AWS CloudTrail 用户指南》**中的[为您的 AWS 账户 创建跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)和[为组织创建跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/creating-trail-organization.html)。  
通过创建跟踪，您可以从 CloudTrail 免费向您的 Amazon S3 存储桶传送一份正在进行的管理事件的副本，但会收取 Amazon S3 存储费用。有关 CloudTrail 定价的更多信息，请参阅 [AWS CloudTrail 定价](https://aws.amazon.com/cloudtrail/pricing/)。有关 Amazon S3 定价的信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

**CloudTrail Lake 事件数据存储**  
*CloudTrail Lake* 允许您对事件运行基于 SQL 的查询。CloudTrail Lake 可将基于行的 JSON 格式的现有事件转换为 [Apache ORC](https://orc.apache.org/) 格式。ORC 是一种针对快速检索数据进行优化的列式存储格式。事件将被聚合到*事件数据存储*中，它是基于您通过应用[高级事件选择器](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake-concepts.html#adv-event-selectors)选择的条件的不可变的事件集合。应用于事件数据存储的选择器用于控制哪些事件持续存在并可供您查询。有关 CloudTrail Lake 的更多信息，请参阅《AWS CloudTrail 用户指南》**中的[使用 AWS CloudTrail Lake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html)。  
CloudTrail Lake 事件数据存储和查询会产生费用。创建事件数据存储时，您可以选择要用于事件数据存储的[定价选项](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake-manage-costs.html#cloudtrail-lake-manage-costs-pricing-option)。定价选项决定了摄取和存储事件的成本，以及事件数据存储的默认和最长保留期。有关 CloudTrail 定价的更多信息，请参阅 [AWS CloudTrail 定价](https://aws.amazon.com/cloudtrail/pricing/)。

**注意**  
CloudFront 是一项全球性服务。CloudTrail 可记录美国东部（弗吉尼亚州北部）区域的 CloudFront 事件。有关更多信息，请参阅《AWS CloudTrail 用户指南》**中的[全球服务事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-concepts.html#cloudtrail-concepts-global-service-events)。  
如果您通过 AWS Security Token Service 使用临时安全凭证，则对区域端点（如 `us-west-2`）的调用将在 CloudTrail 中记录到相应的区域。  
有关 CloudFront 端点的更多信息，请参阅《AWS 一般参考》**中的 [CloudFront 端点和配额](https://docs.aws.amazon.com/general/latest/gr/cf_region.html)。

## CloudTrail 中的 CloudFront 数据事件
<a name="cloudtrail-data-events"></a>

[数据事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#logging-data-events)可提供对资源或在资源中所执行资源操作（例如，读取或写入 CloudFront 分配）的相关信息。这些也称为数据面板操作。数据事件通常是高容量活动。默认情况下，CloudTrail 不记录数据事件。CloudTrail **事件历史记录**不记录数据事件。

记录数据事件将收取额外费用。有关 CloudTrail 定价的更多信息，请参阅 [AWS CloudTrail 定价](https://aws.amazon.com/cloudtrail/pricing/)。

您可以使用 CloudTrail 控制台、AWS CLI 或 CloudTrail API 操作记录 CloudFront 资源类型的数据事件。有关如何记录数据事件的更多信息，请参阅《AWS CloudTrail 用户指南》**中的[使用 AWS 管理控制台 记录数据事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#logging-data-events-console)和[使用 AWS Command Line Interface 记录数据事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#creating-data-event-selectors-with-the-AWS-CLI)。

下表列出了您可以为其记录数据事件的 CloudFront 资源类型。**数据事件类型（控制台）**列显示可从 CloudTrail 控制台上的**数据事件类型**列表中选择的值。**resources.type 值**列显示了您在使用 AWS CLI 或 CloudTrail API 配置高级事件选择器时需要指定的 `resources.type` 值。**记录到 CloudTrail 的数据 API** 列显示了针对该资源类型记录到 CloudTrail 的 API 调用。


| 数据事件类型（控制台） | resources.type 值 | 记录至 CloudTrail 的数据 API | 
| --- | --- | --- | 
| CloudFront KeyValueStore |  AWS::CloudFront::KeyValueStore  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/logging_using_cloudtrail.html)  | 

您可以将高级事件选择器配置为在 `eventName`、`readOnly` 和 `resources.ARN` 字段上进行筛选，从而仅记录那些对您很重要的事件。有关这些字段的更多信息，请参阅《AWS CloudTrail API 参考》**中的 [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_AdvancedFieldSelector.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_AdvancedFieldSelector.html)。

## CloudTrail 中的 CloudFront 管理事件
<a name="cloudtrail-management-events"></a>

[管理事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-management-events-with-cloudtrail.html#logging-management-events)提供对您的 AWS 账户内资源所执行管理操作的相关信息。这些也称为控制面板操作。默认情况下，CloudTrail 会记录管理事件。

Amazon CloudFront 将所有 CloudFront 控制面板操作记录为管理事件。要查看 CloudFront 记录到 CloudTrail 中的 Amazon CloudFront 控制面板操作列表，请参阅 [Amazon CloudFront API 参考](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_Operations_Amazon_CloudFront.html)。

## CloudFront 事件示例
<a name="cloudtrail-event-examples"></a>

一个事件表示一个来自任何源的请求，包括有关所请求的 API 操作、操作的日期和时间、请求参数等方面的信息。CloudTrail 日志文件不是公用 API 调用的有序堆栈跟踪，因此事件不会按任何特定顺序显示。

**Contents**
+ [示例：UpdateDistribution](#example-cloudfront-service-cloudtrail-log)
+ [示例：UpdateKeys](#example-cloudfront-kvs-cloudtrail-log)

### 示例：UpdateDistribution
<a name="example-cloudfront-service-cloudtrail-log"></a>

下面的示例显示了一个 CloudTrail 事件，该事件说明了 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html) 操作。

对于对 CloudFront API 的调用，`eventSource` 是 `cloudfront.amazonaws.com`。

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AIDACKCEVSQ6C2EXAMPLE:role-session-name",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/role-session-name",
        "accountId": "111122223333",
        "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AIDACKCEVSQ6C2EXAMPLE",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-02-02T19:23:50Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2024-02-02T19:26:01Z",
    "eventSource": "cloudfront.amazonaws.com",
    "eventName": "UpdateDistribution",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "52.94.133.137",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
    "requestParameters": {
        "distributionConfig": {
            "defaultRootObject": "",
            "aliases": {
                "quantity": 3,
                "items": [
                    "alejandro_rosalez.awsps.myinstance.com",
                    "cross-testing.alejandro_rosalez.awsps.myinstance.com",
                    "*.alejandro_rosalez.awsps.myinstance.com"
                ]
            },
            "cacheBehaviors": {
                "quantity": 0,
                "items": []
            },
            "httpVersion": "http2and3",
            "originGroups": {
                "quantity": 0,
                "items": []
            },
            "viewerCertificate": {
                "minimumProtocolVersion": "TLSv1.2_2021",
                "cloudFrontDefaultCertificate": false,
                "aCMCertificateArn": "arn:aws:acm:us-east-1:111122223333:certificate/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
                "sSLSupportMethod": "sni-only"
            },
            "webACLId": "arn:aws:wafv2:us-east-1:111122223333:global/webacl/testing-acl/a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
            "customErrorResponses": {
                "quantity": 0,
                "items": []
            },
            "logging": {
                "includeCookies": false,
                "prefix": "",
                "enabled": false,
                "bucket": ""
            },
            "priceClass": "PriceClass_All",
            "restrictions": {
                "geoRestriction": {
                    "restrictionType": "none",
                    "quantity": 0,
                    "items": []
                }
            },
            "isIPV6Enabled": true,
            "callerReference": "1578329170895",
            "continuousDeploymentPolicyId": "",
            "enabled": true,
            "defaultCacheBehavior": {
                "targetOriginId": "d111111abcdef8",
                "minTTL": 0,
                "compress": false,
                "maxTTL": 31536000,
                "functionAssociations": {
                    "quantity": 0,
                    "items": []
                },
                "trustedKeyGroups": {
                    "quantity": 0,
                    "items": [],
                    "enabled": false
                },
                "smoothStreaming": false,
                "fieldLevelEncryptionId": "",
                "defaultTTL": 86400,
                "lambdaFunctionAssociations": {
                    "quantity": 0,
                    "items": []
                },
                "viewerProtocolPolicy": "redirect-to-https",
                "forwardedValues": {
                    "cookies": {"forward": "none"},
                    "queryStringCacheKeys": {
                        "quantity": 0,
                        "items": []
                    },
                    "queryString": false,
                    "headers": {
                        "quantity": 1,
                        "items": ["*"]
                    }
                },
                "trustedSigners": {
                    "items": [],
                    "enabled": false,
                    "quantity": 0
                },
                "allowedMethods": {
                    "quantity": 2,
                    "items": [
                        "HEAD",
                        "GET"
                    ],
                    "cachedMethods": {
                        "quantity": 2,
                        "items": [
                            "HEAD",
                            "GET"
                        ]
                    }
                }
            },
            "staging": false,
            "origins": {
                "quantity": 1,
                "items": [
                    {
                        "originPath": "",
                        "connectionTimeout": 10,
                        "customOriginConfig": {
                            "originReadTimeout": 30,
                            "hTTPSPort": 443,
                            "originProtocolPolicy": "https-only",
                            "originKeepaliveTimeout": 5,
                            "hTTPPort": 80,
                            "originSslProtocols": {
                                "quantity": 3,
                                "items": [
                                    "TLSv1",
                                    "TLSv1.1",
                                    "TLSv1.2"
                                ]
                            }
                        },
                        "id": "d111111abcdef8",
                        "domainName": "d111111abcdef8.cloudfront.net",
                        "connectionAttempts": 3,
                        "customHeaders": {
                            "quantity": 0,
                            "items": []
                        },
                        "originShield": {"enabled": false},
                        "originAccessControlId": ""
                    }
                ]
            },
            "comment": "HIDDEN_DUE_TO_SECURITY_REASONS"
        },
        "id": "EDFDVBD6EXAMPLE",
        "ifMatch": "E1RTLUR9YES76O"
    },
    "responseElements": {
        "distribution": {
            "activeTrustedSigners": {
                "quantity": 0,
                "enabled": false
            },
            "id": "EDFDVBD6EXAMPLE",
            "domainName": "d111111abcdef8.cloudfront.net",
            "distributionConfig": {
                "defaultRootObject": "",
                "aliases": {
                    "quantity": 3,
                    "items": [
                        "alejandro_rosalez.awsps.myinstance.com",
                        "cross-testing.alejandro_rosalez.awsps.myinstance.com",
                        "*.alejandro_rosalez.awsps.myinstance.com"
                    ]
                },
                "cacheBehaviors": {"quantity": 0},
                "httpVersion": "http2and3",
                "originGroups": {"quantity": 0},
                "viewerCertificate": {
                    "minimumProtocolVersion": "TLSv1.2_2021",
                    "cloudFrontDefaultCertificate": false,
                    "aCMCertificateArn": "arn:aws:acm:us-east-1:111122223333:certificate/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
                    "sSLSupportMethod": "sni-only",
                    "certificateSource": "acm",
                    "certificate": "arn:aws:acm:us-east-1:111122223333:certificate/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
                },
                "webACLId": "arn:aws:wafv2:us-east-1:111122223333:global/webacl/testing-acl/a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
                "customErrorResponses": {"quantity": 0},
                "logging": {
                    "includeCookies": false,
                    "prefix": "",
                    "enabled": false,
                    "bucket": ""
                },
                "priceClass": "PriceClass_All",
                "restrictions": {
                    "geoRestriction": {
                        "restrictionType": "none",
                        "quantity": 0
                    }
                },
                "isIPV6Enabled": true,
                "callerReference": "1578329170895",
                "continuousDeploymentPolicyId": "",
                "enabled": true,
                "defaultCacheBehavior": {
                    "targetOriginId": "d111111abcdef8",
                    "minTTL": 0,
                    "compress": false,
                    "maxTTL": 31536000,
                    "functionAssociations": {"quantity": 0},
                    "trustedKeyGroups": {
                        "quantity": 0,
                        "enabled": false
                    },
                    "smoothStreaming": false,
                    "fieldLevelEncryptionId": "",
                    "defaultTTL": 86400,
                    "lambdaFunctionAssociations": {"quantity": 0},
                    "viewerProtocolPolicy": "redirect-to-https",
                    "forwardedValues": {
                        "cookies": {"forward": "none"},
                        "queryStringCacheKeys": {"quantity": 0},
                        "queryString": false,
                        "headers": {
                            "quantity": 1,
                            "items": ["*"]
                        }
                    },
                    "trustedSigners": {
                        "enabled": false,
                        "quantity": 0
                    },
                    "allowedMethods": {
                        "quantity": 2,
                        "items": [
                            "HEAD",
                            "GET"
                        ],
                        "cachedMethods": {
                            "quantity": 2,
                            "items": [
                                "HEAD",
                                "GET"
                            ]
                        }
                    }
                },
                "staging": false,
                "origins": {
                    "quantity": 1,
                    "items": [
                        {
                            "originPath": "",
                            "connectionTimeout": 10,
                            "customOriginConfig": {
                                "originReadTimeout": 30,
                                "hTTPSPort": 443,
                                "originProtocolPolicy": "https-only",
                                "originKeepaliveTimeout": 5,
                                "hTTPPort": 80,
                                "originSslProtocols": {
                                    "quantity": 3,
                                    "items": [
                                        "TLSv1",
                                        "TLSv1.1",
                                        "TLSv1.2"
                                    ]
                                }
                            },
                            "id": "d111111abcdef8",
                            "domainName": "d111111abcdef8.cloudfront.net",
                            "connectionAttempts": 3,
                            "customHeaders": {"quantity": 0},
                            "originShield": {"enabled": false},
                            "originAccessControlId": ""
                        }
                    ]
                },
                "comment": "HIDDEN_DUE_TO_SECURITY_REASONS"
            },
            "aliasICPRecordals": [
                {
                    "cNAME": "alejandro_rosalez.awsps.myinstance.com",
                    "iCPRecordalStatus": "APPROVED"
                },
                {
                    "cNAME": "cross-testing.alejandro_rosalez.awsps.myinstance.com",
                    "iCPRecordalStatus": "APPROVED"
                },
                {
                    "cNAME": "*.alejandro_rosalez.awsps.myinstance.com",
                    "iCPRecordalStatus": "APPROVED"
                }
            ],
            "aRN": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE",
            "status": "InProgress",
            "lastModifiedTime": "Feb 2, 2024 7:26:01 PM",
            "activeTrustedKeyGroups": {
                "enabled": false,
                "quantity": 0
            },
            "inProgressInvalidationBatches": 0
        },
        "eTag": "E1YHBLAB2BJY1G"
    },
    "requestID": "4e6b66f9-d548-11e3-a8a9-73e33example",
    "eventID": "5ab02562-0fc5-43d0-b7b6-90293example",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "apiVersion": "2020_05_31",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.3",
        "cipherSuite": "TLS_AES_128_GCM_SHA256",
        "clientProvidedHostHeader": "cloudfront.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}
```

### 示例：UpdateKeys
<a name="example-cloudfront-kvs-cloudtrail-log"></a>

下面的示例显示了一个 CloudTrail 事件，该事件说明了 [UpdateKeys](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_UpdateKeys.html) 操作。

对于对 CloudFront KeyValueStore API 的调用，`eventSource` 是 `edgekeyvaluestore.amazonaws.com`，而不是 `cloudfront.amazonaws.com`。

```
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AIDACKCEVSQ6C2EXAMPLE:role-session-name",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/role-session-name",
        "accountId": "111122223333",
        "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AIDACKCEVSQ6C2EXAMPLE",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            },
            "attributes": {
                "creationDate": "2023-11-01T23:41:14Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-11-01T23:41:28Z",
    "eventSource": "edgekeyvaluestore.amazonaws.com",
    "eventName": "UpdateKeys",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "3.235.183.252",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36,
    "requestParameters": {
        "kvsARN": "arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "ifMatch": "KV3O6B1CX531EBP",
        "deletes": [
            {"key": "key1"}
        ]
    },
    "responseElements": {
        "itemCount": 0,
        "totalSizeInBytes": 0,
        "eTag": "KVDC9VEVZ71ZGO"
    },
    "requestID": "5ccf104c-acce-4ea1-b7fc-73e33example",
    "eventID": "a0b1b5c7-906c-439d-9925-90293example",
    "readOnly": false,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::CloudFront::KeyValueStore",
            "ARN": "arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": false,
    "recipientAccountId": "111122223333",
    "eventCategory": "Data",
    "tlsDetails": {
        "tlsVersion": "TLSv1.3",
        "cipherSuite": "TLS_AES_128_GCM_SHA256",
        "clientProvidedHostHeader": "111122223333.cloudfront-kvs.global.api.aws"
    }
}
```

有关 CloudTrail 记录内容的信息，请参阅《AWS CloudTrail 用户指南》**中的 [CloudTrail 记录内容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。