

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

# 為 Lambda@Edge 函數新增觸發條件
<a name="lambda-edge-add-triggers"></a>

Lambda@Edge 觸發器是指 CloudFront 分佈、快取行為及促使函數執行的事件的組合。例如，您可以建立觸發條件，在 CloudFront 收到檢視器針對您為分佈設定的特定快取行為提出的請求時，執行函數。您可以指定一或多個 CloudFront 觸發條件。

**提示**  
當您建立 CloudFront 分佈，您需要指定設定來告知 CloudFront 如何在接收不同的請求時回應。預設設定稱為分佈的*預設快取行為*。您可以設定其他快取行為來定義 CloudFront 在特定情況下回應的方式，例如在接收請求特定的檔案類型的請求時。如需詳細資訊，請參閱[快取行為設定](DownloadDistValuesCacheBehavior.md)。

您首次建立 Lambda 函數時，只能指定*一個*觸發條件。您之後可以使用以下方式將更多觸發條件新增到相同函數：使用 Lambda 主控台或在 CloudFront 主控台上編輯分佈。
+ 如果您要將更多觸發條件新增到同一 CloudFront 分佈的函數中，Lambda 主控台將非常有效。
+ 如果要為多個分佈新增觸發條件，使用 CloudFront 主控台較適合，因為這樣更易於找到您要更新的分佈。您也可以同時更新其他的 CloudFront 設定。

**Topics**
+ [可以觸發 Lambda@Edge 函數的 CloudFront 事件](lambda-cloudfront-trigger-events.md)
+ [選擇要觸發函數的事件](lambda-how-to-choose-event.md)
+ [新增觸發條件到 Lambda@Edge 函數](lambda-edge-add-triggers-console.md)

# 可以觸發 Lambda@Edge 函數的 CloudFront 事件
<a name="lambda-cloudfront-trigger-events"></a>

對於 Amazon CloudFront 分佈中的每個快取行為，您可以新增最多四個觸發條件 (關聯)，以便在特定 CloudFront 事件發生時執行 Lambda 函數。CloudFront 觸發條件可以根據四個 CloudFront 事件之一，如下圖所示。

![\[概念圖：針對與 CloudFront 整合的 Lambda 函數，顯示 CloudFront 如何觸發事件。\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/images/cloudfront-events-that-trigger-lambda-functions.png)


可用於觸發 Lambda@Edge 函數的 CloudFront 事件如下：

**檢視者請求**  
函數會在 CloudFront 接獲檢視器請求時執行，然後再檢視請求的物件是否位在 CloudFront 快取。  
函數不在以下情況執行：  
+ 擷取自訂錯誤頁面時。
+ CloudFront 自動重新導向 HTTP 請求到 HTTPS ([檢視器通訊協定政策](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy) 的值為**重新導向 HTTP 到 HTTPS** 時)。

**原始伺服器請求**  
函數*只*在 CloudFront 將請求轉傳到您的原始伺服器時執行。如果請求的物件在 CloudFront 快取中，則不會執行該函數。

**原始伺服器回應**  
函數會在 CloudFront 接獲原始伺服器回應後執行，然後才快取回應中的物件。請注意，即使原始伺服器傳回錯誤，函數仍會執行。  
函數不在以下情況執行：  
+ 當請求的檔案在 CloudFront 快取中，並且未過期。
+ 當回應是從原始伺服器請求事件觸發的函數所產生。

**檢視者回應**  
函數會在請求的檔案傳回給檢視器之前執行。請注意，無論檔案是否已在 CloudFront 快取中，函數皆會執行。  
函數不在以下情況執行：  
+ 當原始伺服器傳回 HTTP 狀態碼 400 或更高版本。
+ 當傳回自訂錯誤頁面。
+ 當回應是被檢視器請求事件觸發的函數所產生。
+ CloudFront 自動重新導向 HTTP 請求到 HTTPS ([檢視器通訊協定政策](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy) 的值為**重新導向 HTTP 到 HTTPS** 時)。

當您新增多個觸發條件至相同的快取行為時，可將其用於針對每個觸發條件執行相同或不同的函數。您也可以將相同的函數與一個以上的分佈建立關聯。

**注意**  
CloudFront 事件觸發執行 Lambda 函數時，該函數必須*先*完成，CloudFront 才能繼續執行。  
例如，當 Lambda 函數是由 CloudFront 檢視器請求事件觸發時，CloudFront 在 Lambda 函數執行完畢之前不會將回應傳回給檢視器或轉送請求給原始伺服器。  
這表示觸發 Lambda 函數的每個請求都會增加請求延遲，因此您會希望函數執行速度越快越好。

# 選擇要觸發函數的事件
<a name="lambda-how-to-choose-event"></a>

當您決定要使用哪個 CloudFront 事件來觸發 Lambda 函數，請考慮以下資訊：

**我希望 CloudFront 快取由 Lambda 函數更改的物件**  
如果要快取由 Lambda 函數修改的物件，以便讓 CloudFront 在下次收到請求時能夠從邊緣節點提供物件，請使用*原始伺服器請求*或*原始伺服器回應*事件。  
這樣可以降低原始伺服器的負載，減少後續請求的延遲，並降低叫用 Lambda@Edge 在後續請求的費用。  
例如，如果您想要新增、移除或變更傳回原始伺服器的物件標頭，且您希望 CloudFront 快取結果，請使用原始伺服器的回應事件。

**我希望函數執行每個請求**  
如果要讓函數執行每個 CloudFront 收到用於分佈的請求，請使用*檢視器請求*或*檢視器回應*事件。  
原始伺服器請求與原始伺服器回應事件，僅會在當請求的物件未快取於節點以及 CloudFront 轉送請求至原始伺服器時發生。

**我希望函數變更快取金鑰**  
如欲變更快取基礎值，請使用*檢視器請求*事件。  
例如，若函數變更其 URL 以包含語言縮寫在路徑中 (例如，因為使用者從下拉式清單中選擇其語言)，請使用檢視器請求事件：  
+ **檢視器請求中的 URL** – https：//https://example.com/en/index.html
+ **當請求來自德國境內 IP 位址時的 URL** – https://example.com/de/index.html
如果您快取根據 Cookie 或請求標頭，也可以使用檢視器請求事件。  
如果函數變更 Cookie 或標頭，可設定 CloudFront 轉送請求適用的部分到原始伺服器。如需詳細資訊，請參閱下列主題：  
+ [根據 Cookie 快取內容](Cookies.md)
+ [根據請求標頭快取內容](header-caching.md)

**函數會影響原始伺服器回應**  
如果您希望依影響原始伺服器回應的方法變更請求，請使用*原始伺服器請求*事件。  
一般而言，大多數檢視器請求事件不會轉送至原始伺服器。CloudFront 會使用已在邊緣快取中的物件回應請求。如果函數依原始伺服器請求事件變更請求，CloudFront 會快取對變更的原始伺服器請求的回應。

# 新增觸發條件到 Lambda@Edge 函數
<a name="lambda-edge-add-triggers-console"></a>

您可以使用 AWS Lambda 主控台或 Amazon CloudFront 主控台，將觸發條件新增至 Lambda@Edge 函數。

**重要**  
您只能為編號的函數版本 (而非 **\$1LATEST**) 建立觸發條件。

------
#### [ Lambda console ]<a name="lambda-edge-add-triggers-procedure"></a>

**將 CloudFront 事件的觸發條件新增至 Lambda@Edge 函數**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1. 在頁面頂端的「區域」清單中，選擇**美國東部 (維吉尼亞北部)**。

1. 在 **Functions (函數)** 頁面上，選擇您要為其新增觸發條件的函數名稱。

1. 在**函數概觀**頁面上，選擇**版本**索引標籤。

1. 選擇您要為其新增觸發的版本。

   選擇版本之後，按鈕的名稱會變更為 **Version: \$1LATEST (版本：\$1LATEST)** 或 **Version: (版本：)** *版本編號*。

1. 選擇 **Triggers (觸發條件)** 索引標籤。

1. 選擇 **Add trigger (新增觸發條件)**。

1. 針對**觸發組態**選擇**選取來源**，輸入 **cloudfront**，然後選擇 **CloudFront**。
**注意**  
如果您已經建立一或多個觸發，則 CloudFront 為預設服務。

1. 指定下列值，以指示您希望 Lambda 函數在何時執行。

   1. **分佈**：選擇您要為其新增觸發的分佈。

   1. **快取行為**：選擇快取行為，透過該行為指定您要執行函數的物件。
**注意**  
如果您為快取行為指定 `*`，Lambda 函式則會部署至預設的快取行為。

   1. **CloudFront 事件**：選擇促使函數執行的 CloudFront 事件。

   1. **包含本文**：如果想要存取您函數中的請求本體，請勾選此核取方塊。

   1. **確認部署到 Lambda@Edge**：選取此核取方塊，以便讓 AWS Lambda 將函數複寫至全球 AWS 區域 。

1. 選擇**新增**。

   將已更新的 CloudFront 分佈部署時，函數便開始針對指定的 CloudFront 事件處理請求。若要判斷是否已部署分佈，請在導覽窗格中選擇 **Distributions (分佈)**。部署分佈時，該分佈**狀態**欄中的值，會從**正在部署**變更為部署的日期與時間。

------
#### [ CloudFront console ]<a name="lambda-create-functions-add-triggers-cloudfront-console-procedure"></a>

**將 CloudFront 事件的觸發條件新增至 Lambda@Edge 函數**

1. 取得您希望新增觸發的 Lambda 函數的 ARN：

   1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

   1. 在頁面頂端的區域清單中，選擇**美國東部 (維吉尼亞北部)**。

   1. 在函數清單上，選取您想要為其新增觸發的函數名稱。

   1. 在**函數概觀**頁面選擇**版本**索引標籤，然後選擇您想要為其新增觸發條件的編號版本。

   1. 選擇**複製 ARN** 按鈕，將 ARN 複製到剪貼簿。Lambda 函數的 ARN 如下所示：

      `arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2`

      最後面的數字 (此範例中為 **2 (2)**) 是該函數的版本編號。

1. 在 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) 開啟 CloudFront 主控台。

1. 在分佈清單中，選取您想要為其新增觸發的分佈 ID。

1. 選擇 **Behaviors (動作)** 索引標籤。

1. 選擇您想要新增觸發條件的快取動作，然後選擇**編輯**。

1. 對於**函數關聯**，請在**函數類型**清單中選擇 **Lambda@Edge**，作為您希望函數執行的時間點：針對檢視器請求、檢視器回應、原始伺服器請求或原始伺服器回應。

   如需詳細資訊，請參閱[選擇要觸發函數的事件](lambda-how-to-choose-event.md)。

1. 在**函數 ARN / 名稱**文字方塊中，貼上所選事件發生時您想要執行 Lambda 函數的 ARN。這是您從 Lambda 主控台複製的值。

1. 如果想要存取您函數中的請求本文，請勾選**包含本文**。

   如果您只想要替換請求本體，就不需要選取此選項。

1. 若要針對更多事件類型執行同一個函數，請重複步驟 6 和 7。

1. 選擇**儲存變更**。

1. 若要為此分佈新增更多快取行為的觸發，請重複步驟 5 到 10。

   將已更新的 CloudFront 分佈部署時，函數便開始針對指定的 CloudFront 事件處理請求。若要判斷是否已部署分佈，請在導覽窗格中選擇 **Distributions (分佈)**。部署分佈時，該分佈**狀態**欄中的值，會從**正在部署**變更為部署的時間與日期。

------