

# 将函数与分配关联
<a name="associate-function"></a>

要将一个函数与一个分配结合使用，您可以将该函数与该分配中的一个或多个缓存行为关联。您可以将函数与多个分配中的多个缓存行为相关联。

您可以将函数与以下任意一项相关联：
+ 现有缓存行为
+ 现有分配中的新缓存行为
+ 新分配中的新缓存行为

将函数与缓存行为关联时，必须选择*事件类型*。事件类型决定 CloudFront 何时运行函数。

您可以从以下事件类型中选择：
+ **查看器请求** – 当 CloudFront 收到来自查看器的请求时，该函数将运行。
+ **查看器请求** – 该函数在 CloudFront 向查看器返回响应之前运行。

您不能将面向源的事件类型（*源请求*和*源响应*）与 CloudFront Functions 结合使用。此时应该使用 Lambda@Edge。有关更多信息，请参阅 [可以触发 Lambda@Edge 函数的 CloudFront 事件](lambda-cloudfront-trigger-events.md)。

**注意**  
在关联函数之前，必须[将其发布](publish-function.md)到 `LIVE` 阶段。

您可以在 CloudFront 控制台中或使用 AWS Command Line Interface（AWS CLI）将函数与分配相关联。以下程序演示如何将函数与现有缓存行为关联。

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

**将函数与现有缓存行为关联**

1. 通过 [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) 登录到 CloudFront 控制台，然后选择**函数**页面。

1. 选择要关联的函数。

1. 在**函数**页面上，选择**发布**选项卡。

1. 选择**发布函数**。

1. 选择**添加关联**。在出现的对话框中，选择分配、事件类型和/或缓存行为。

   对于事件类型，请选择您希望此函数在何时运行：
   + **查看器请求** – 在 CloudFront 每次收到请求时运行函数。
   + **查看器响应** – 在 CloudFront 每次返回响应时运行函数。

1. 要保存配置，请选择**添加关联**。

CloudFront 将分配与函数关联。等待几分钟，以便相关的分配完成部署。您可以在函数详细信息页面上选择**查看分配**来查看进度。

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

**将函数与现有缓存行为关联**

1. 打开一个命令行窗口。

1. 输入以下命令，以针对您要将其缓存行为与函数相关联的分配，保存分配的配置。此命令将分配配置保存到名为 `dist-config.yaml` 的文件中。要使用此命令，请执行以下操作：
   + 将 *`DistributionID`* 替换为分配的 ID。
   + 在一行上运行该命令。在示例中，提供换行符以使示例更具可读性。

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

   命令成功后，AWS CLI 不返回任何输出。

1. 打开您创建的名为 `dist-config.yaml` 的文件。编辑该文件以进行以下更改。

   1. 将 `ETag` 字段重命名为 `IfMatch`，但不更改字段的值。

   1. 在缓存行为中，找到名为 `FunctionAssociations` 的对象。更新此对象以添加函数关联。函数关联的 YAML 语法如以下示例所示。
      + 下面的示例显示查看器请求事件类型（触发器）。要使用查看器响应事件类型，请将 `viewer-request` 替换为 `viewer-response`。
      + 将 *`arn:aws:cloudfront::111122223333:function/ExampleFunction`* 替换为您将其与此缓存行为关联的函数的 Amazon 资源名称 (ARN)。要获取函数 ARN，您可以使用 **aws cloudfront list-functions** 命令。

      ```
      FunctionAssociations:
        Items:
          - EventType: viewer-request
            FunctionARN: arn:aws:cloudfront::111122223333:function/ExampleFunction
        Quantity: 1
      ```

   1. 进行这些更改后，保存文件。

1. 使用以下命令更新分配，以添加函数关联。要使用此命令，请执行以下操作：
   + 将 *`DistributionID`* 替换为分配的 ID。
   + 在一行上运行该命令。在示例中，提供换行符以使示例更具可读性。

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

   命令成功后，您会看到类似以下内容的输出，该输出描述了刚通过函数关联更新的分配。为了便于阅读，下面的示例输出被截断了。

   ```
   Distribution:
     ARN: arn:aws:cloudfront::111122223333:distribution/EBEDLT3BGRBBW
     ... truncated ...
     DistributionConfig:
       ... truncated ...
       DefaultCacheBehavior:
         ... truncated ...
         FunctionAssociations:
           Items:
           - EventType: viewer-request
             FunctionARN: arn:aws:cloudfront::111122223333:function/ExampleFunction
           Quantity: 1
         ... truncated ...
     DomainName: d111111abcdef8.cloudfront.net
     Id: EDFDVBD6EXAMPLE
     LastModifiedTime: '2021-04-19T22:39:09.158000+00:00'
     Status: InProgress
   ETag: E2VJGGQEG1JT8S
   ```

------

分配的 `Status` 会在重新部署分配时更改为 `InProgress`。当新的分配配置到达一个 CloudFront 边缘站点时，该边缘站点就会开始使用关联的函数。完全部署分配后，`Status` 将变回 `Deployed`。这表明关联的 CloudFront 函数在全球所有 CloudFront 边缘站点均已上线。这通常需要花费几分钟的时间。