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

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

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

如果您将Amazon SAM来创建您的无服务器应用程序,它内置了CodeDeploy来提供渐进的 Lambda 部署。只需几行配置,Amazon SAM为您执行以下操作:

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

  • 逐步将客户流量转移到新版本,直到您确认它按预期方式运行或者回滚更新。

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

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

注意

如果您通过Amazon SAM模板中,系统会自动为您创建 CodeDeploy 资源。您 CodeDeploy 以直接通过Amazon Web Services Management Console。

示例

下面的示例演示了一个使用 CodeDeploy 的简单版本,它将客户流量逐步转移到您新部署的版本:

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函数版本控制和别名

  • 部署首选项类型:在上一个示例中,10% 的客户流量会立即转移到新版本。10 分钟后,将所有流量转移到新版本。但是,如果您的预挂接/后挂钩测试失败,或者如果触发了 CloudWatch 警报,CodeDeploy 将回滚您的部署。下表概述了除前面使用的选项之外其他可用的流量转移选项。请注意以下几点:

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

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

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

    部署首选项类型

    Canary10Percent30Minutes

    Canary10Percent5Minutes

    Canary10Percent10Minutes

    Canary10Percent15Minutes

    Linear10PercentEvery10Minutes

    Linear10PercentEvery1Minute

    Linear10PercentEvery2Minutes

    Linear10PercentEvery3Minutes

    AllAtOnce

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

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

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

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

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