

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用以下方法逐步部署无服务器应用程序 AWS SAM
<a name="automating-updates-to-serverless-apps"></a>

AWS Serverless Application Model (AWS SAM) 内置[CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html)以提供渐进式 AWS Lambda 部署。只需几行配置， AWS SAM 即可完成以下操作：
+ 部署 Lambda 函数的新版本，并自动创建指向新版本的别名。
+ 逐步将客户流量转移到新版本，直到您确认它按预期方式运行。如果更新无法正常运行，则可以回滚更改。
+ 定义转移流量前和转移流量后的测试函数，来验证新部署的代码是否已正确配置并且您的应用程序是否按预期方式运行。
+ 如果触发 CloudWatch 警报，则自动回滚部署。

**注意**  
如果您通过 AWS SAM 模板启用渐进部署，则会自动为您创建 CodeDeploy 资源。您可以直接通过查看 CodeDeploy 资源 AWS 管理控制台。

**示例**

以下示例演示了如何使用逐步 CodeDeploy 将客户转移到您新部署的 Lambda 函数版本：

```
Resources:
MyLambdaFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: index.handler
    Runtime: nodejs20.x
    CodeUri: s3://bucket/code.zip

    AutoPublishAlias: live

    DeploymentPreference:
      Type: Canary10Percent10Minutes 
      Alarms:
        # A list of alarms that you want to monitor
        - !Ref AliasErrorMetricGreaterThanZeroAlarm
        - !Ref LatestVersionErrorMetricGreaterThanZeroAlarm
      Hooks:
        # Validation Lambda functions that are run before & after traffic shifting
        PreTraffic: !Ref PreTrafficLambdaFunction
        PostTraffic: !Ref PostTrafficLambdaFunction
```

对 AWS SAM 模板的这些修订具有以下作用：
+ `AutoPublishAlias`: 通过添加此属性并指定别名， AWS SAM:
  + 根据对 Lambda 函数的 Amazon S3 URI 的更改，检测何时部署新代码。
  + 使用最新代码创建和发布该函数的更新版本。
  + 使用您提供的名称创建别名 (除非已存在别名) 并指向 Lambda 函数的更新版本。函数调用应该使用别名限定词来利用这一功能。如果您不熟悉 Lambda 函数版本控制和别名，请参阅[AWS Lambda 函数版本控制和别名](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)。
+ `Deployment Preference Type`：在前面的示例中，10% 的客户流量会立即转移到您的新版本。10 分钟后，所有流量都将转移到新版本。但是，如果您的流量前或流量后测试失败，或者触发了 CloudWatch 警报，则会回 CodeDeploy 滚您的部署。您可以通过以下方式指定如何在版本之间转移流量：
  + `Canary`：流量在两次增量中转移。可从预定义金丝雀选项中进行选择。这些选项指定在第一次增量中转移到更新后的 Lambda 函数版本的流量百分比以及以分钟为单位的间隔；然后指定在第二次增量中转移剩余的流量。
  + `Linear`：流量使用相等的增量转移，在每次增量之间的分钟数相同。您可以从预定义的线性选项中进行选择，这些选项指定在每次增量中转移的流量百分比以及每次增量之间的分钟数。
  + `AllAtOnce`：所有流量均从原始 Lambda 函数一次性地转移到更新后的 Lambda 函数版本。

  下表概述了除示例中使用的选项之外可用的其他流量转移选项。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html)
+ `Alarms`：这些 CloudWatch 警报由部署引发的任何错误触发。遇到时，它们会自动回滚您的部署。例如，如果您正在部署的更新代码导致应用程序内出现错误。另一个例子是，您指定的任何 CloudWatch 指标[AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-metrics.html)或自定义指标是否超过了警报阈值。
+ `Hooks`：这些是转移流量前和转移流量后的测试函数，它们在开始将流量转移到新版本之前以及完成将流量转移到新版本之后运行检查。
  + `PreTraffic`：在流量转移开始之前， CodeDeploy 调用流量挂钩前 Lambda 函数。此 Lambda 函数必须回调 CodeDeploy 并指示成功或失败。如果该函数失败，它将中止并向 CloudFormation报告故障。如果函数成功，则 CodeDeploy 继续进行流量转移。
  + `PostTraffic`: 流量转移完成后， CodeDeploy 调用流量挂钩后 Lambda 函数。这与预流量挂钩类似，在该挂钩中，函数必须回调 CodeDeploy 以报告成功或失败。使用转移流量后钩子可以运行集成测试或其他验证操作。

  有关更多信息，请参阅 [SAM 安全部署参考](https://github.com/aws/serverless-application-model/blob/master/docs/safe_lambda_deployments.rst)。

## 首次逐步部署 Lambda 函数
<a name="automating-updates-to-serverless-apps-first-time"></a>

 逐步部署 Lambda 函数时， CodeDeploy 需要先前部署的函数版本才能转移流量。因此，应通过两个步骤完成首次部署：
+ **第 1 步**：部署您的 Lambda 函数并使用 `AutoPublishAlias` 自动创建别名。
+ **第 2 步**：使用 `DeploymentPreference` 执行逐步部署。

分两步执行首次逐步部署，即可 CodeDeploy 使用之前的 Lambda 函数版本来转移流量。

### 第 1 步：部署 Lambda 函数
<a name="automating-updates-to-serverless-apps-first-time-step1"></a>

```
Resources:
MyLambdaFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: index.handler
    Runtime: nodejs20.x
    CodeUri: s3://bucket/code.zip

    AutoPublishAlias: live
```

### 第 2 步：执行逐步部署
<a name="automating-updates-to-serverless-apps-first-time-step2"></a>

```
Resources:
MyLambdaFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: index.handler
    Runtime: nodejs20.x
    CodeUri: s3://bucket/code.zip

    AutoPublishAlias: live

    DeploymentPreference:
      Type: Canary10Percent10Minutes 
      Alarms:
        # A list of alarms that you want to monitor
        - !Ref AliasErrorMetricGreaterThanZeroAlarm
        - !Ref LatestVersionErrorMetricGreaterThanZeroAlarm
      Hooks:
        # Validation Lambda functions that are run before and after traffic shifting
        PreTraffic: !Ref PreTrafficLambdaFunction
        PostTraffic: !Ref PostTrafficLambdaFunction
```

## 了解详情
<a name="automating-updates-to-serverless-apps-learn"></a>

有关配置逐步部署的实践示例，请参阅*完整 AWS SAM 研讨会*中的[模块 5 – 金丝雀部署](https://s12d.com/sam-ws-en-canaries)。