

# 使用加权别名实施 Lambda 金丝雀部署
<a name="configuring-alias-routing"></a>

您可以使用加权别名在同一函数的两个不同[版本](configuration-versions.md)之间拆分流量。通过此方法，您可以用一小部分流量测试新版本的函数，并在必要时快速回滚。这称为[金丝雀部署](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/canary-deployments.html)。金丝雀部署与蓝/绿部署的不同之处在于，它只向部分请求公开新版本，而不是一次切换所有流量。

您可以将别名最多指向两个 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. 打开 Lamba 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择函数。

1. 选择 **Aliases**（别名），然后选择 **Create alias**（创建别名）。

1. 在**创建别名**页面上，执行以下操作：

   1. 输入别名的**名称**。

   1. （可选）输入别名的**描述**。

   1. 对于**版本**，选择希望别名指向的第一个函数版本。

   1. 展开**加权别名**。

   1. 对于**其他版本**，请选择希望别名指向的第二个函数版本。

   1. 对于**权重 (%)**，输入函数的权重值。*权重*是在调用别名时分配给该版本的流量百分比。第一个版本接收剩余权重。例如，如果为**其他版本**指定 10%，则会自动为第一个版本分配 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 创建滚动部署的更多信息，请参阅以下内容：
+ [教程：Deploy an updated Lambda function with CodeDeploy and the AWS Serverless Application Model](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorial-lambda-sam.html)
+ [Deploying serverless applications gradually with AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html)