

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

# 部署模式
<a name="web-functions-deployment"></a>

若要發行 AWS Lambda Web Function 應用程式的新版本，請建立新的修訂。`autoDeploymentMode` 設定為 **LatestRevision** 的端點會在流量變成**作用中**之後將所有流量路由到該端點。將 `autoDeploymentMode`設為**已停用**的端點會持續提供其目前的修訂，直到您更新修訂權重為止。您可以使用端點的自動部署模式和修訂權重，控制流量如何從目前的修訂移至新的修訂。下列各節說明自動部署模式、常見的部署模式 (Canary、藍綠和復原），以及管理修訂權重的規則。

`autoDeploymentMode` 和 的變更`revisionWeights`是非同步端點更新。在評估部署或提交另一個端點更新`Successful`之前`updateStatus`，請等待 變成 。如果更新失敗，請`updateStatusReason`描述原因。

下圖顯示已停用自動部署模式的端點上的 Canary 部署****。每個權重變更都是非同步端點更新。

1. 修訂版 1 以 100% 的流量開始。

1. 您可以將 10% 的流量路由到修訂版 2 並進行監控。

1. 如果修訂版 2 通過您的檢查，您可以將所有流量路由到它。

1. 如果修訂版 2 失敗，您可以將權重設回修訂版 1 的 100%。

![Canary 部署會將流量從修訂版 1 轉移到修訂版 2，並將路徑轉返到修訂版 1。](https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/web-functions-deployment-patterns.png)


## 自動部署模式
<a name="web-functions-deployment-modes"></a>

端點上的 `autoDeploymentMode`設定會控制部署時，Lambda 是否自動將流量路由到新的修訂版。您可以在建立端點時設定此項目，也可以在現有端點上變更它。

如果您省略 `autoDeploymentMode`，則預設為 `Disabled`。 僅`LatestRevision`支援`HomeRegion`端點，因此 `MultiRegion`和 `PerRegion`端點一律使用 `Disabled`。使用 時`Disabled`，您可以在端點`revisionWeights`上設定 ，如中所述[修訂權重](#web-functions-deployment-weights)。

**LatestRevision**  
每次新的修訂變成**作用中**時，Lambda 都會將 100% 的端點流量路由到它。您不需要更新修訂權重，而且您無法在端點處於此模式時設定修訂權重。將此模式用於您想要自動部署而不手動介入的開發和預備環境。

**已停用**  
當您建立新的修訂時，Lambda 不會變更流量路由。您可以透過設定修訂權重來手動控制流量路由。將此模式用於您想要使用 Canary 或藍綠部署模式控制新修訂版推展的生產環境。

**變更自動部署模式 (AWS CLI)**

1. 使用 AWS Command Line Interface (AWS CLI) 更新端點並停用自動部署。

   ```
   aws lambda-web update-web-function-endpoint \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}} \
       --auto-deployment-mode Disabled
   ```

1. 等待端點更新完成。

   ```
   aws lambda-web wait web-function-endpoint-updated \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}}
   ```

### 在模式之間切換
<a name="web-functions-deployment-modes-switching"></a>

當您在不指定修訂權重的情況下從 **LatestRevision** 切換到 **Disabled** 時，目前的流量路由在更新成功後保持不變。即使您建立新的修訂，端點在更新之前路由流量的修訂仍會繼續接收 100% 的流量。它會保留該流量，直到您更新修訂權重為止。您也可以在相同的`UpdateWebFunctionEndpoint`請求中切換模式並設定修訂權重。

當您從**已停用**切換到 **LatestRevision** 時，Lambda 會更新端點，將 100% 的流量路由到最新的修訂版。最新修訂版必須為**作用中**。如果請求為**待定**或**失敗**，請求會失敗並出現衝突錯誤。更新成功後，先前設定的修訂權重將不再適用。

## 修訂權重
<a name="web-functions-deployment-weights"></a>

當自動部署模式**停用**時，您可以透過將權重指派給修訂來控制流量路由。Lambda 會根據其權重按比例分配修訂之間的流量。

修訂權重是端點 ( `revisionWeights` 屬性） 上的設定，您會隨著 變更`UpdateWebFunctionEndpoint`。它們不是修訂版的設定。

修訂權重遵循下列規則：
+ 每個權重都是從 1 到 100 的整數。
+ 請求中的權重必須加總為 100。
+ 每個修訂只能出現在權重中一次。
+ 當您設定權重時，權重中的每個修訂都必須處於**作用中**狀態。否則，API 會拒絕請求。
+ 端點同時將流量路由到最多兩個修訂。
+ 沒有權重具有預設值。若要將所有流量路由到一個修訂，請僅指定權重為 100 的該修訂。不在權重中的修訂不會接收來自該端點的流量。

當您建立修訂時，Lambda 會產生修訂識別符。若要尋找 Web 函數的修訂識別符，請使用下列命令：

```
aws lambda-web list-web-function-revisions \
    --function-name {{my-web-app}}
```

回應會依序列出從最新到最舊的修訂，包括其識別符、建立時間戳記和目前狀態。

## 部署模式
<a name="web-functions-deployment-patterns"></a>

下列部署模式使用修訂權重來控制流量如何從目前的修訂移至新的修訂。這些模式需要**停用**端點的自動部署模式 (`autoDeploymentMode`端點設定）。`aws lambda-web deploy` 命令建立的端點使用 **LatestRevision**。若要在該端點上使用這些模式，請先將其切換為**已停用**，如 所示[自動部署模式](#web-functions-deployment-modes)。

### Canary 部署
<a name="web-functions-deployment-canary"></a>

Canary 部署會將一小部分的流量傳送至新修訂版，讓您可以在路由所有流量之前監控錯誤。如果新修訂發生問題，只會影響一小部分的請求。

**執行 Canary 部署 (AWS CLI)**

1. 使用更新後的程式碼建立新的修訂版。

   ```
   aws lambda-web create-web-function-revision \
       --function-name {{my-web-app}} \
       --build-config '{
         "codeConfig": {
           "s3Object": { "bucket": "{{my-bucket}}", "key": "{{my-app-v2.zip}}" }
         },
         "runtimeConfig": { "runtime": "nodejs24.x" }
       }' \
       --service-config '{
         "executionRoleArn": "arn:aws:iam::{{111122223333}}:role/{{my-web-function-role}}"
       }'
   ```

   在回應中記下修訂識別符。

   新的修訂版不會從目前的修訂版複製設定。您省略的任何`serviceConfig`設定都會採用其預設值，例如 30 `timeoutSeconds`的 且沒有環境變數。包含目前修訂版使用的每個設定，例如 `environmentVariables`、`maxConcurrencyPerEnvironment`、 `timeoutSeconds`和 `telemetryConfig`。若要查看目前修訂版的組態，請執行 `aws lambda-web get-web-function-revision`。

1. 等到新修訂處於**作用中**狀態。API 會拒絕參考非**作用中**修訂的修訂權重。

   ```
   aws lambda-web wait web-function-revision-active \
       --function-name {{my-web-app}} \
       --revision-id {{rev-def45}}
   ```

1. 將 10% 的流量路由到新的修訂版，並將 90% 路由到目前的修訂版。

   ```
   aws lambda-web update-web-function-endpoint \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}} \
       --revision-weights '[{"revisionId": "{{rev-abc12}}", "weight": 90}, {"revisionId": "{{rev-def45}}", "weight": 10}]'
   ```

1. 等待端點更新完成。

   ```
   aws lambda-web wait web-function-endpoint-updated \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}}
   ```

1. 透過應用程式日誌或自訂指標監控新修訂。包含您在其中控制的組建或修訂識別符。Web 函數指標不包含修訂維度。因此，他們無法將 Canary 錯誤與目前修訂版的錯誤分開。如需詳細資訊，請參閱[搭配 Lambda Web Functions 使用 CloudWatch 指標](web-functions-monitoring-metrics.md)。如果 Canary 符合您在推出之前定義的錯誤和延遲閾值，請增加其權重。

   ```
   aws lambda-web update-web-function-endpoint \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}} \
       --revision-weights '[{"revisionId": "{{rev-abc12}}", "weight": 50}, {"revisionId": "{{rev-def45}}", "weight": 50}]'
   ```

1. 等待端點更新完成。

   ```
   aws lambda-web wait web-function-endpoint-updated \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}}
   ```

1. 當您確定新修訂版運作狀態良好時，請將所有流量路由到該版本。

   ```
   aws lambda-web update-web-function-endpoint \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}} \
       --revision-weights '[{"revisionId": "{{rev-def45}}", "weight": 100}]'
   ```

1. 等待端點更新完成。

   ```
   aws lambda-web wait web-function-endpoint-updated \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}}
   ```

### 藍綠部署
<a name="web-functions-deployment-blue-green"></a>

藍綠部署會在您驗證新修訂版時保留目前的修訂版，然後在一次端點更新中將所有流量切換為新修訂版。下列程序會使用均勻的流量分割進行驗證。若要在沒有生產流量的情況下進行驗證，請使用單獨的測試端點，如中所述[部署考量](#web-functions-deployment-considerations)。

**執行藍綠部署 (AWS CLI)**

1. 使用更新後的程式碼建立新的修訂版，並等到它**作用中**。使用上述 Canary 部署程序中顯示的相同命令。

1. 在兩個修訂之間平均分配流量。

   ```
   aws lambda-web update-web-function-endpoint \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}} \
       --revision-weights '[{"revisionId": "{{rev-abc12}}", "weight": 50}, {"revisionId": "{{rev-def45}}", "weight": 50}]'
   ```

1. 等待端點更新完成。

   ```
   aws lambda-web wait web-function-endpoint-updated \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}}
   ```

1. 透過應用程式日誌或自訂指標監控這兩個修訂。包含您在其中控制的組建或修訂識別符。當新修訂版符合您在推出之前定義的運作狀態條件時，請將所有流量路由到其中。

   ```
   aws lambda-web update-web-function-endpoint \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}} \
       --revision-weights '[{"revisionId": "{{rev-def45}}", "weight": 100}]'
   ```

1. 等待端點更新完成。

   ```
   aws lambda-web wait web-function-endpoint-updated \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}}
   ```

### 轉返
<a name="web-functions-deployment-rollback"></a>

如果您偵測到新修訂的問題 （高錯誤率、增加延遲），您可以使用單一端點更新來復原，將所有流量路由至先前的已知良好修訂。

**在 LatestRevision 模式中轉返**  
雖然端點的自動部署模式是 **LatestRevision**，但僅設定修訂權重的請求會失敗。下列程序會將自動部署模式設定為**已停用**，並在相同的請求中設定修訂權重，因此可在任一模式中運作。  
然後，端點會保持在**停用**模式，直到您變更為止。

**若要轉返至先前的修訂版 (AWS CLI)**

1. 更新端點，將 100% 的流量路由至已知良好的修訂版，並將自動部署模式設定為**已停用**。

   ```
   aws lambda-web update-web-function-endpoint \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}} \
       --auto-deployment-mode Disabled \
       --revision-weights '[{"revisionId": "{{rev-abc12}}", "weight": 100}]'
   ```

1. 等待端點更新完成。

   ```
   aws lambda-web wait web-function-endpoint-updated \
       --function-name {{my-web-app}} \
       --endpoint-name {{my-endpoint}}
   ```

更新成功後，Lambda 會停止將新請求路由到有問題的修訂。該修訂的傳輸中請求正常完成。如需端點更新狀態的詳細資訊，請參閱 [端點狀態](web-functions-how-it-works.md#web-functions-endpoint-states)。

如果您轉返的修訂很少或沒有執行中的執行環境，Lambda 會隨著流量向它轉移而向上擴展。請求可以在執行環境初始化時等待，這會增加延遲。請求仍然可能因為啟動失敗、端點的速率限制或最大環境，或帳戶 vCPU 配額而失敗。其中一些失敗會傳回 HTTP 429 回應。

## 部署考量
<a name="web-functions-deployment-considerations"></a>

什麼會觸發新的修訂？  
當您呼叫 時，Lambda 會建立新的修訂`CreateWebFunctionRevision`。這包括部署新的應用程式程式碼和變更組態設定，例如逾時、並行或環境變數。每次變更都會產生不可變的修訂。

我可以先測試新的修訂版，再將生產流量路由到它嗎？  
是。您只能透過端點叫用修訂，因此有兩種方法：  
+ **專用測試端點** – 建立個別的端點進行測試。先將流量路由到測試端點上的新修訂 （透過設定測試端點的修訂權重）、驗證它，然後更新生產端點的權重以包含新修訂。
+ **最小權**重 – 在生產端點上指派 1% 權重的新修訂。這會將一小部分的生產流量傳送至新的修訂版，讓您可以在對客戶影響最小的情況下監控錯誤。

不在修訂權重中的修訂會發生什麼情況？  
不在端點修訂版權重中的修訂版不會接收來自該端點的流量。相同 Web 函數的另一個端點仍然可以路由到它。修訂會保持**作用中**狀態，直到您將其刪除或自動清除移除為止。如果 Lambda 無法存取其 Amazon S3 物件，它會移至**失敗**。如需自動清除，請參閱 [修訂限制和自動清除](web-functions-revisions.md#web-functions-revisions-limits)。

如何識別哪個修訂是最新的？  
呼叫 `ListWebFunctionRevisions`。回應會以 的遞減順序列出修訂`createdAt`，因此清單中的第一個修訂是最新的。

我可以在路由流量時刪除端點嗎？  
是。當您刪除端點時，Lambda 會停止將新請求路由到該端點，並在刪除生效後拒絕對端點網域名稱的請求。修訂本身不受影響，且仍然可供其他端點使用。

我可以在接收流量時刪除修訂版嗎？  
否。如果任何端點將流量路由到修訂，包括當 `MultiRegion`或 `PerRegion`端點的 `regionalEndpoints` 屬性參考修訂時，`DeleteWebFunctionRevision`請求會失敗並出現衝突錯誤。若要刪除修訂，請先更新端點的修訂權重，將其從每個端點上的流量路由中移除，然後刪除它。由於 Lambda 會在修訂版指派權重時封鎖刪除，因此刪除修訂版永遠不會變更端點的流量分佈。