逐步部署无服务器应用程序 - Amazon Serverless Application Model
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

逐步部署无服务器应用程序

Amazon Serverless Application Model (Amazon SAM) 内置CodeDeploy以提供渐进式 Amazon Lambda 部署。只需几行配置, Amazon SAM 即可完成以下操作:

  • 部署 Lambda 函数的新版本,并自动创建指向新版本的别名。

  • 逐步将客户流量转移到新版本,直到您确认它按预期方式运行。如果更新无法正常运行,则可以回滚更改。

  • 定义转移流量前和转移流量后的测试函数,来验证新部署的代码是否已正确配置并且您的应用程序是否按预期方式运行。

  • 如果触发 CloudWatch 警报,则自动回滚部署。

注意

如果您通过 Amazon SAM 模板启用渐进部署,则会自动为您创建 CodeDeploy 资源。您可以直接通过查看 CodeDeploy 资源 Amazon Web Services Management Console。

示例

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

Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.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

对 Amazon SAM 模板的这些修订具有以下作用:

  • AutoPublishAlias: 通过添加此属性并指定别名, Amazon SAM:

    • 根据对 Lambda 函数的 Amazon S3 URI 的更改,检测何时部署新代码。

    • 使用最新代码创建和发布该函数的更新版本。

    • 使用您提供的名称创建别名 (除非已存在别名) 并指向 Lambda 函数的更新版本。函数调用应该使用别名限定词来利用这一功能。如果您不熟悉 Lambda 函数版本控制和别名,请参阅Amazon Lambda 函数版本控制和别名

  • Deployment Preference Type:在前面的示例中,10% 的客户流量会立即转移到您的新版本。10 分钟后,所有流量都将转移到新版本。但是,如果您的流量前或流量后测试失败,或者触发了 CloudWatch 警报,则会回 CodeDeploy 滚您的部署。您可以通过以下方式指定如何在版本之间转移流量:

    • Canary:流量在两次增量中转移。可从预定义金丝雀选项中进行选择。这些选项指定在第一次增量中转移到更新后的 Lambda 函数版本的流量百分比以及以分钟为单位的间隔;然后指定在第二次增量中转移剩余的流量。

    • Linear:流量使用相等的增量转移,在每次增量之间的分钟数相同。您可以从预定义的线性选项中进行选择,这些选项指定在每次增量中转移的流量百分比以及每次增量之间的分钟数。

    • AllAtOnce:所有流量均从原始 Lambda 函数一次性地转移到更新后的 Lambda 函数版本。

    下表概述了除示例中使用的选项之外可用的其他流量转移选项。

    部署首选项类型

    Canary10Percent30Minutes

    Canary10Percent5Minutes

    Canary10Percent10Minutes

    Canary10Percent15Minutes

    Linear10 10 10 PercentEvery Minus

    Linear10 1 PercentEvery Minute

    Linear10 2 分钟 PercentEvery

    Linear10 3 分钟 PercentEvery

    AllAtOnce

  • Alarms:这些 CloudWatch 警报由部署引发的任何错误触发。遇到时,它们会自动回滚您的部署。例如,如果您正在部署的更新代码导致应用程序内出现错误。另一个例子是,您指定的任何 CloudWatch 指标Amazon Lambda或自定义指标是否超过了警报阈值。

  • Hooks:这些是转移流量前和转移流量后的测试函数,它们在开始将流量转移到新版本之前以及完成将流量转移到新版本之后运行检查。

    • PreTraffic:在流量转移开始之前, CodeDeploy 调用流量挂钩前 Lambda 函数。此 Lambda 函数必须回调 CodeDeploy 并指示成功或失败。如果该函数失败,它将中止并向 Amazon CloudFormation报告故障。如果函数成功,则 CodeDeploy 继续进行流量转移。

    • PostTraffic: 流量转移完成后, CodeDeploy 调用流量挂钩后 Lambda 函数。这与预流量挂钩类似,在该挂钩中,函数必须回调 CodeDeploy 以报告成功或失败。使用转移流量后钩子可以运行集成测试或其他验证操作。

    有关更多信息,请参阅 SAM 安全部署参考

首次逐步部署 Lambda 函数

逐步部署 Lambda 函数时, CodeDeploy 需要先前部署的函数版本才能转移流量。因此,应通过两个步骤完成首次部署:

  • 第 1 步:部署您的 Lambda 函数并使用 AutoPublishAlias 自动创建别名。

  • 第 2 步:使用 DeploymentPreference 执行逐步部署。

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

第 1 步:部署 Lambda 函数

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

第 2 步:执行逐步部署

Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.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

了解更多信息

有关配置逐步部署的实践示例,请参阅完整 Amazon SAM 研讨会中的模块 5 – 金丝雀部署