

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

# 測試函數
<a name="test-function"></a>

在將函數部署到即時階段 (生產環境) 之前，可以測試該函數以確保其運作正常。若要測試函數，您可以指定一個*事件物件*，代表您的 CloudFront 分佈可在生產環境中接收的 HTTP 請求或回應。

CloudFront Functions 會執行下列作業：

1. 執行該函數，使用提供的事件物件作為函數的輸入。

1. 返回函數的結果 (修改後的事件物件)，同時返回任何函數日誌或錯誤訊息以及函數的*運算利用率*。如需運算使用率的詳細資訊，請參閱 [了解運算利用率](#compute-utilization)。

**注意**  
當您測試函數時，CloudFront 只會驗證函數執行錯誤。CloudFront 不會驗證發佈後請求是否成功通過。例如，如果您的函數刪除必要的標頭，測試將會成功，因為程式碼沒有問題。不過，如果您發佈函數並將其與分佈建立關聯，則函數會在透過 CloudFront 提出請求時失敗。

**Contents**
+ [設定事件物件](#test-function-create-event)
+ [測試函數](#test-function-step-test)
+ [了解運算利用率](#compute-utilization)

## 設定事件物件
<a name="test-function-create-event"></a>

在測試函數之前，您必須建立事件物件以進行測試。有幾種選項。

**選項 1：設定事件物件而不儲存**  
您可以在 CloudFront 主控台的視覺化編輯器中設定事件物件，而不儲存該事件物件。  
您可以使用此事件物件從 CloudFront 主控台測試函數，即使該函數尚未儲存也是如此。

**選項 2：在視覺化編輯器中建立事件物件**  
您可以在 CloudFront 主控台的視覺化編輯器中設定事件物件，而不儲存該事件物件。您可以針對每個函數建立 10 個事件物件，例如，可測試不同的可能輸入。  
以這種方式建立事件物件時，您可以使用事件物件，在 CloudFront 主控台中測試函數。您無法使用它來測試使用 AWS API 或 SDK 的函數。

**選項 3：使用文字編輯器建立事件物件**  
您可以使用文字編輯器，以 JSON 格式建立事件物件。如需有關事件物件結構的詳細資訊，請參閱 [事件結構](functions-event-structure.md)。  
您可以使用此事件物件來測試使用 CLI 的函數。但是您無法使用它來測試 CloudFront 主控台中的函數。

**建立事件物件 (選項 1 或 2)**

1. 在 [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) 登入 CloudFront 主控台，並選擇**函數**頁面。

   選擇您要測試的函數。

1. 在函數詳細資訊頁面上，選擇**測試**索引標籤。

1. 針對**事件類型**，選擇以下其中一個選項：
   + 如果函數會根據請求修改 HTTP 請求或產生回應，請選擇**檢視者請求**。**請求**區段隨即出現。
   + 選擇**檢視器回應**。**請求**和**回應**區段隨即出現。

1. 完成您想要包含在事件中的所有欄位。您可選擇**編輯 JSON** 來檢視原始 JSON。

1. (選用) 若要儲存事件，請選擇**儲存**，然後在**儲存測試事件**中輸入名稱，然後選擇**儲存**。

   您也可以選擇**編輯 JSON** 並複製原始 JSON，並將其儲存在 CloudFront 之外您自己的檔案中。

**建立事件物件 (選項 3)**

使用文字編輯器建立事件物件。將檔案儲存於電腦可以連線的目錄中。

請確定您遵循這些準則：
+ 省略 `distributionDomainName`、`distributionId` 和 `requestId` 欄位。
+ 標頭、Cookie 和查詢字串的名稱必須為小寫。

以這種方式建立事件物件的一個選項是使用視覺化編輯器建立範例。您可以確定範例格式正確。然後您可以複製原始 JSON 並將其貼到文字編輯器中並儲存檔案。

如需有關事件結構的詳細資訊，請參閱 [事件結構](functions-event-structure.md)。

## 測試函數
<a name="test-function-step-test"></a>

您可以在 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. 選擇**測試函數**。控制台顯示函數的輸出，包括函數日誌和運算使用率。

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

您可以使用 **aws cloudfront test-function** 命令來測試函數。

**若要測試函數**

1. 開啟命令列視窗。

1. 從包含指定檔案的目錄執行下列命令。

   此範例會使用 `fileb://` 標記法來傳入事件物件檔案。它還會包括換行符號，讓命令更易於讀取。

   ```
   aws cloudfront test-function \
       --name MaxAge \
       --if-match ETVABCEXAMPLE \
       --event-object fileb://event-maxage-test01.json \
       --stage DEVELOPMENT
   ```
**備註**  
您可以透過其名稱和 ETag (在 `if-match` 參數中) 引用該函數。您可以依照事件物件在檔案系統中的位置來參照事件物件。
此階段可以是 `DEVELOPMENT` 或 `LIVE`。

   如果命令成功執行，您會看到如下所示的輸出。

   ```
   TestResult:
     ComputeUtilization: '21'
     FunctionErrorMessage: ''
     FunctionExecutionLogs: []
     FunctionOutput: '{"response":{"headers":{"cloudfront-functions":{"value":"generated-by-CloudFront-Functions"},"location":{"value":"https://aws.amazon.com/cloudfront/"}},"statusDescription":"Found","cookies":{},"statusCode":302}}'
     FunctionSummary:
       FunctionConfig:
         Comment: MaxAge function
         Runtime: cloudfront-js-2.0
         KeyValueStoreAssociations= \
         {Quantity=1, \
         Items=[{KeyValueStoreARN='arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111'}]} \
       FunctionMetadata:
         CreatedTime: '2021-04-18T20:38:56.915000+00:00'
         FunctionARN: arn:aws:cloudfront::111122223333:function/MaxAge
         LastModifiedTime: '2023-17-20T10:38:57.057000+00:00'
         Stage: DEVELOPMENT
       Name: MaxAge
       Status: UNPUBLISHED
   ```

------

**備註**  
`FunctionExecutionLogs` 包含函數在 `console.log()` 語句中撰寫的日誌行清單 (如果有的話)。
`ComputeUtilization` 包含執行函數的相關資訊。請參閱 [了解運算利用率](#compute-utilization)。
`FunctionOutput` 包含該函數返回的事件物件。

## 了解運算利用率
<a name="compute-utilization"></a>

**運用利用率**是指執行函數所花費的時間，以所允許時間上限的百分比表示。例如，值為 35 表示函數在最大允許時間的 35% 內完成。

如果某個函數持續時間，超過允許時間上限，則 CloudFront 會將該函數限流。下列清單說明，根據運算利用率的值，函數限流的可能性。

**運算利用率值：**
+ **1 — 50**— 函數遠低於允許時間上限，應不會受到限流。
+ **51 — 70**— 函數接近允許時間上限。考慮將函數程式碼最佳化。
+ **71 — 100**— 函數非常接近或超過允許時間上限。如果您將此函數與分佈產生關聯，CloudFront 很有可能會將此函數限流。