

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

# 使用加權別名實作 Lambda Canary 部署
<a name="configuring-alias-routing"></a>

可以使用加權別名來分割相同函數的兩個不同[版本](configuration-versions.md)之間的流量。透過此方法，可以用少量流量測試新版本的函數，並視需要快速復原。這稱為 [Canary 部署](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/canary-deployments.html)。Canary 部署與藍/綠部署的不同之處在於只將新版本暴露於一部分請求，而不是一次切換所有流量。

一個別名可以指向最多兩個 Lambda 函數版本。版本必須符合下列條件：
+ 兩個版本必須擁有相同的[執行角色](lambda-intro-execution-role.md)。
+ 這兩個版本都必須具有相同[無效字元佇列](invocation-async-retain-records.md#invocation-dlq)組態，或是沒有無效字元佇列組態。
+ 兩個版本都必須發佈。別名不能指向 `$LATEST`。

**注意**  
Lambda 使用簡單的概率模型來在兩個函數版本之間分配流量。在流量較低時，您可能會看到每個版本已設定流量百分比與實際流量百分比之間，存在很大差異。如果您的函數使用佈建並行，透過在別名路由作用期間設定較高數目的已佈建並行執行個體，則可以避免[溢出調用](monitoring-metrics-types.md#invocation-metrics)。

## 建立加權別名
<a name="create-weighted-alias"></a>

------
#### [ Console ]

**若要使用主控台在別名上設定路由**
**注意**  
確認函數至少有兩個已發佈的版本。若要建立其他版本，請遵循[建立函數版本](configuration-versions.md#configuration-versions-config)中的指示。

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇 **Aliases (別名)**，然後選擇 **Create alias (建立別名)**。

1. 在 **Create alias (建立別名)** 頁面，執行下列動作：

   1. 輸入別名的 **Name (名稱)**。

   1. (選用) 輸入別名的 **Description (描述)**。

   1. 在 **Version (版本)**中，選擇要別名指向的第一個函數版本。

   1. 展開 **Weighted alias (加權別名)**。

   1. 在 **Additional version (其他版本)**中，選擇要別名指向的第二個函數版本。

   1. 為 **Weight (%) (權重 (%))**函數輸入一個權重值。*權數*是當別名被叫用時，指派至該版本的流量百分比。第一版收到剩餘權數。例如，若指定 10% 至 **Additional version (其他版本)**，第一版會自動指派 90%。

   1. 選擇**儲存**。

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

使用 [create-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-alias.html) 和 [update-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-alias.html) AWS CLI 命令來設定兩個函數版本之間的流量權重。當您建立或更新別名時，請在 `routing-config` 參數中指定流量權重。

以下範例會建立一個名為 **routing-alias** 的 Lambda 函數別名，此別名指向函數的版本 1。函數的版本 2 會接收 3% 的流量。剩餘 97% 的流量會路由至版本 1。

```
aws lambda create-alias \
  --name routing-alias \
  --function-name my-function \
  --function-version 1  \
  --routing-config AdditionalVersionWeights={"2"=0.03}
```

使用 `update-alias` 命令可增加連入流量至版本 2 的百分比。在下列範例中，您會將流量增加到 5%。

```
aws lambda update-alias \
  --name routing-alias \
  --function-name my-function \
  --routing-config AdditionalVersionWeights={"2"=0.05}
```

若要將所有流量路由傳送至版本 2，請使用 `update-alias` 命令，將 `function-version` 屬性變更為將別名指向版本 2。此命令也會重設路由組態。

```
aws lambda update-alias \
  --name routing-alias \
  --function-name my-function  \
  --function-version 2 \
  --routing-config AdditionalVersionWeights={}
```

 上述步驟中的 AWS CLI 命令對應至下列 Lambda API 操作：
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)

------

## 判斷調用哪個版本
<a name="determining-routing-version"></a>

當您設定兩個函數版本之間的流量權重時，有兩種方法可判斷已叫用的 Lambda 函數版本：
+ **CloudWatch Logs** - 對於每個函數調用，Lambda 會自動發出含有已調用版本 ID 的 `START` 記錄。範例：

  `START RequestId: 1dh194d3759ed-4v8b-a7b4-1e541f60235f Version: 2` 

  對於別名叫用，Lambda 使用 `ExecutedVersion` 維度，依照已叫用的版本來篩選指標資料。如需詳細資訊，請參閱[檢視 Lambda 函數的指標](monitoring-metrics-view.md)。
+ **回應承載 (同步呼叫)** – 回應至同步函式呼叫包含 `x-amz-executed-version` 標題，以顯示已呼叫哪個函式版本。

## 使用加權別名建立滾動部署
<a name="lambda-rolling-deployments"></a>

使用 AWS CodeDeploy 和 AWS Serverless Application Model (AWS SAM) 建立滾動部署，自動偵測函數程式碼的變更、部署新版本的函數，並逐漸增加流向新版本的流量。流量和增加速率是您可以設定的參數。

在滾動部署中， 會 AWS SAM 執行下列任務：
+ 配置您的 Lambda 函數並建立別名。加權別名路由組態是實作滾動部署的基本功能。
+ 建立 CodeDeploy 應用程式和部署群組。部署群組會管理滾動部署和轉返 (如有需要)。
+ 在您建立 Lambda 函數的新版本時進行偵測。
+ 觸發 CodeDeploy 開始新版本的部署。

### 範本範例 AWS SAM
<a name="sam-template"></a>

下列範例顯示 [AWS SAM 範本](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html)，以進行簡單的滾動部署。

```
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: A sample SAM template for deploying Lambda functions

Resources:
# Details about the myDateTimeFunction Lambda function
  myDateTimeFunction:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Handler: myDateTimeFunction.handler
      Runtime: nodejs24.x
# Creates an alias named "live" for the function, and automatically publishes when you update the function.
      AutoPublishAlias: live
      DeploymentPreference:
# Specifies the deployment configuration
          Type: Linear10PercentEvery2Minutes
```

此範本會定義名為 `myDateTimeFunction` 的 Lambda 函數，且具備下列屬性。

**AutoPublishAlias **  
`AutoPublishAlias` 屬性會建立名為 `live` 的別名。此外，當您為該函數儲存新代碼時， AWS SAM 架構會自動偵測。之後，架構會發佈一個新的函數版本並更新 `live` 別名以指向新版本。

**DeploymentPreference**  
`DeploymentPreference` 屬性會決定 CodeDeploy 應用程式將流量從 Lambda 函數的原始版本轉移到新版本的速率。值 `Linear10PercentEvery2Minutes` 每隔兩分鐘會將額外 10% 的流量轉移到新版本。  
如需預先定義的部署組態清單，請參閱[部署組態](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)。

如需如何使用 CodeDeploy 建立滾動部署的詳細資訊 AWS SAM，請參閱以下內容：
+ [教學課程：使用 CodeDeploy 和 部署更新的 Lambda 函數 AWS Serverless Application Model](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorial-lambda-sam.html)
+ [使用 逐步部署無伺服器應用程式 AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html)