使用 AWS SAM 逐步部署无服务器应用程序 - AWS Serverless Application Model

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

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

AWS Serverless Application Model (AWS SAM) 内置于 CodeDeploy 中,可提供逐步 AWS Lambda 部署。只需几行配置,AWS SAM 即可为您完成以下操作:

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

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

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

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

注意

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

示例

以下示例演示了如何使用 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函数版本控制和别名

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

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

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

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

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

    部署首选项类型

    Canary10Percent30Minutes

    Canary10Percent5Minutes

    Canary10Percent10Minutes

    Canary10Percent15Minutes

    Linear10PercentEvery10Minutes

    Linear10PercentEvery1Minute

    Linear10PercentEvery2Minutes

    Linear10PercentEvery3Minutes

    AllAtOnce

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

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

    • PreTraffic:在开始转移流量之前,CodeDeploy 将调用转移流量前钩子 Lambda 函数。此 Lambda 函数必须回调 CodeDeploy,以指示成功或失败。如果函数失败,它将中止并向 AWS 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: nodejs20.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live

第 2 步:执行逐步部署

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

了解更多

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