

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

# 核心概念
<a name="web-functions-how-it-works"></a>

了解下列核心概念可協助您有效地部署和管理 Web 應用程式。此頁面涵蓋 Web 函數的資源模型、每個資源的生命週期狀態，以及 Lambda 如何處理傳入的 HTTP 請求。

**資源模型**會定義 Web 函數的結構。Web 函數是頂層資源。它包含修訂 （程式碼和組態的不可變快照） 和端點 （將 HTTP 流量路由到修訂的網路進入點）。

**修訂狀態**和**端點狀態**會追蹤 Lambda 建立、部署和刪除這些資源的進度。監控這些狀態會告訴您 Lambda 何時完成建立、部署或刪除資源，並協助您診斷失敗。

**執行環境**是 Web 伺服器和應用程式執行所在的隔離運算執行個體。每個執行環境都會處理多個並行 HTTP 請求。Lambda 會根據 Web 函數組態和流量自動建立和移除環境。

以下各節提供有關每個核心概念的詳細資訊。

## 資源模型
<a name="web-functions-resource-model"></a>

Lambda Web 函數由父子階層中的三種資源類型組成。Web 函數是頂層資源。修訂和端點是 Web 函數的子資源。部署程式碼或變更修訂組態會建立新的修訂。下圖顯示其端點將流量路由到其修訂版的 Web 函數。

![Web 函數包含端點和修訂版。Prod 端點會將 90% 的流量傳送至修訂版 1，並將 10% 傳送至修訂版 2。預備端點會將所有流量傳送至修訂版 2。](https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/web-functions-resource-model.png)


**Web 函數**  
代表您 Web 應用程式的頂層資源。Web 函數具有名稱、ARN 及其自己的生命週期狀態 (**待定**、**作用中**、**失敗****或刪除**)。它可以包含修訂和端點；所有修訂和端點都屬於單一父 Web 函數。

**修訂**  
應用程式程式碼和組態的不可變快照。每次變更程式碼或修訂組態時，您都會建立新的修訂，例如請求逾時、每個執行環境的並行請求數目上限，或環境變數。由於修訂是不可變的，因此您一律可以透過將流量路由到較早的修訂來轉返至應用程式的舊版本。對於 Canary 或藍綠部署，您可以一次分配兩個修訂之間的流量。

**端點**  
將 HTTP 流量路由至修訂的網路進入點。每個端點都有唯一的網域名稱，其中包含 TLS、控制存取的身分驗證類型，以及定義容量的擴展設定。建立端點時，您可以選擇其端點類型，這會設定其地理範圍。**HomeRegion** 僅提供來自主要區域的流量。**MultiRegion** 會盡力從一個全域網域後方的數個區域提供流量，根據網路延遲將每個請求路由至一個區域。**PerRegion** 提供來自多個區域的流量，每個區域都有自己的區域網域，而且您可以控制用戶端如何到達每個區域。Web 函數可以有多個端點，每個端點都有獨立的組態。您可以在端點上設定修訂權重，將流量路由到一或兩個作用中的修訂。

## 修訂狀態
<a name="web-functions-revision-states"></a>

修訂版在其生命週期內會經過下列狀態。您可以在 Lambda 主控台中呼叫`GetWebFunctionRevision`或檢視修訂詳細資訊，以檢查目前狀態。


| State | 說明 | 接下來會發生什麼狀況？ | 
| --- | --- | --- | 
| 待定 | Lambda 正在建立修訂。這包括從 Amazon S3 下載程式碼並驗證組態。 | 修訂版會在建立成功時轉換為作用中，或在發生錯誤時轉換為失敗。 | 
| Active (作用中) | 修訂已成功建立，並準備好放置在端點後方。 | 修訂會保持作用中狀態，直到您刪除為止，Lambda 會在自動修訂清除期間將其刪除 （請參閱 [修訂限制和自動清除](web-functions-revisions.md#web-functions-revisions-limits))，或是移除對原始碼的存取權。如果 Lambda 無法存取程式碼，例如因為已刪除參考的 Amazon S3 物件版本，修訂版會移至失敗 （請參閱 [物件生命週期](web-functions-code-s3.md#web-functions-code-s3-lifecycle))。 | 
| 失敗 | Lambda 無法建立修訂。當您提交請求時，Lambda 偵測到的問題不會產生失敗的修訂。例如，如果 AWS KMS 金鑰的許可不足，請求會因用戶端例外狀況而失敗，Lambda 不會建立修訂。 | 如需詳細資訊，請檢查GetWebFunctionRevision回應中的 stateReason 欄位。建立新的修訂以修正問題。失敗的修訂無法為流量提供服務。 | 

## 端點狀態
<a name="web-functions-endpoint-states"></a>

端點有兩個狀態欄位： 會`state`追蹤整體生命週期，並在初始建立後`updateStatus`追蹤端點更新。您可以呼叫 來檢查兩者`GetWebFunctionEndpoint`。


| State | 說明 | 接下來會發生什麼狀況？ | 
| --- | --- | --- | 
| 待定 | Lambda 正在建立端點。這包括配置網域名稱、佈建 TLS 和設定路由。對於 MultiRegion和 PerRegion端點，這也包括將組態複寫到其他 AWS 區域。 | 在所有目標區域中成功建立時，端點會轉換為作用中，如果發生錯誤，則會轉換為失敗。 | 
| Active (作用中) | 端點已準備好以其網域名稱接收 HTTP 流量。用戶端可以將請求傳送至端點。 | 端點會保持作用中。Lambda 會在 updateStatus 欄位中追蹤後續端點更新，而不會變更端點的整體狀態。 | 
| 失敗 | 建立失敗。對於 MultiRegion和 PerRegion端點，這可能表示一或多個目標區域中失敗。 | 如需詳細資訊，請檢查 stateReason 欄位。對於 MultiRegion和 PerRegion端點，檢查每個區域的 state和 stateReason regionalEndpoints項目。 | 
| 正在刪除 | Lambda 正在刪除端點並淘汰其網域名稱。對於 MultiRegion和 PerRegion端點，Lambda 會從所有區域移除端點。 | 刪除完成後，端點會永久移除。其網域名稱已淘汰，Lambda 絕不會將其指派給任何帳戶中的另一個端點。此操作無法反轉。 | 

對於現有端點，Lambda 會在端點更新`Active`期間將 `state` 設定為 。檢查 `updateStatus`以判斷最近的更新是 `InProgress`、 `Successful`或 `Failed`。例如，當您變更端點的修訂權重時， `updateStatus`會`InProgress``state`保留 `Active`。當新的權重生效時， `updateStatus`會變更為 `Successful`。

**InProgress**  
Lambda 正在套用端點更新。

**成功**  
最新的端點更新已完成並生效。

**失敗**  
最近的端點更新失敗。如需詳細資訊，請檢查 `updateStatusReason` 欄位和 `regionalEndpoints` 。對於 `MultiRegion`和 `PerRegion`端點，某些區域可能會使用先前的組態，而其他區域則會使用請求的組態。更正報告的原因，然後使用預期的組態`UpdateWebFunctionEndpoint`再次呼叫 以協調端點。

Web 函數狀態、修訂狀態和端點狀態是獨立的。當 Web 函數其中一個端點仍為**待定**或**失敗**時，Web 函數可以處於**作用中**狀態。同樣地，即使目前沒有端點將流量路由到它，修訂也可以是**作用中**的。

**作用中**修訂、**作用中**端點或**成功的**端點更新不會確認您的伺服器啟動。Lambda 不會檢查您的伺服器在建立或更新端點以使用修訂時是否接聽。每次部署後，傳送測試請求並檢查您的應用程式日誌。

## 執行環境
<a name="web-functions-execution-environments"></a>

執行環境是 Web 伺服器和應用程式執行所在的隔離運算執行個體。當流量到達您的端點時，Lambda 會將請求路由到執行作用中修訂版程式碼的執行環境。

Lambda 會自動管理執行環境：

1. **向上擴展** – 當流量增加時，Lambda 會建立其他執行環境，並在每個環境中啟動 HTTP 伺服器。Lambda 會提前擴展新的環境以保持空間，因此請求很少等待新的環境啟動 （冷啟動）。當 Web 函數從零擴展時 （沒有流量期間之後的第一個請求），Lambda 建立執行環境時會有短暫的冷啟動延遲。請求會在執行環境初始化時等待。如果您的應用程式未啟動或套用請求速率、執行環境或帳戶限制，則請求可能仍會失敗。如需詳細資訊，請參閱[Lambda Web 函數的擴展行為](web-functions-scaling.md)。

1. **縮減規模** – 當流量減少時，Lambda 會盡力移除傳輸中請求完成後不再需要的執行環境。當沒有流量時，Lambda 會擴展到零環境。

執行環境及其並行的數量由兩個設定控制：
+ **`maxEnvironments`** （端點設定） – Lambda 可為每個區域中的端點建立的執行環境數目上限。此設定是選用的。未設定時，Lambda 會根據您的帳戶配額，視需要擴展執行環境。
+ **`maxConcurrencyPerEnvironment`** （修訂設定） – 單一執行環境同時處理的 HTTP 請求數目上限。有效值為 1–128。預設為 64。

Lambda 會為每個執行環境設定動態並行限制。此限制永遠不會超過 `maxConcurrencyPerEnvironment`。端點並行的上限會`maxEnvironments`乘以此動態限制。實際容量可能較低，因為 Lambda 會根據資源使用率調整每個環境並行，並套用端點和帳戶限制。例如，假設您`maxEnvironments`設定為 20 和 `maxConcurrencyPerEnvironment` 64。端點接著會在區域中處理最多 1，280 個並行請求。如果 Lambda 將動態限制設定為低於 64，則會處理較少的 。如需這些設定的指導，請參閱 [Lambda Web 函數的擴展行為](web-functions-scaling.md)。

## 請求處理
<a name="web-functions-request-model"></a>

您的 Web 函數程式碼會做為標準 HTTP 伺服器執行，以監聽連接埠。Lambda 會將傳入的 HTTP 請求傳送到您的伺服器，並將回應傳回給用戶端。您可以使用任何 Node.js Web 架構、中介軟體或路由器。

請求生命週期的運作方式如下：

1. 用戶端會將 HTTP 請求傳送至端點的網域名稱。

1. Lambda 驗證請求 （適用於 **IamAuth** 端點） 或傳遞請求 （適用於 **ApplicationManaged** 端點）。

1. Lambda 會根據端點的修訂權重，將請求路由到執行環境。

1. 執行環境的 HTTP 伺服器會處理請求並傳回回應。

1. Lambda 會將回應傳回給用戶端。

每個請求最多可執行 900 秒 (15 分鐘）。您可以使用修訂`timeoutSeconds`的設定，將逾時從 3 秒設定為 900 秒。預設逾時時間為 30 秒。

每個 Web 函數執行環境都會處理多個並行請求，因此您的應用程式程式碼必須安全才能使用。如需並行模型的詳細資訊，請參閱 [Node.js 執行模型](web-functions-runtimes.md#web-functions-runtimes-execution-model)。