

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將函數與分佈相關聯
<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. 選擇 **Add association (建立關聯)**。在出現的對話方塊中，選擇分佈、事件類型及/或快取行為。

   在事件類型中，選擇您希望此函數執行的時間：
   + **檢視器請求** – 在 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 Resource Name (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 邊緣節點中上線。通常這需要幾分鐘的時間。