逐步部署无服务器应用程序 - 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

    Linear10PercentEvery 10 10 分钟

    Linear10PercentEvery 1 分钟

    Linear10PercentEvery 2 分钟

    Linear10PercentEvery 3 分钟

    AllAtOnce

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

  • 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-Canary 部署