使用 亚马逊云科技 Lambda 预留并发实现无服务器分层策略

作者: Lal Verma | 202

作者:亚马逊云科技 高级合作伙伴解决方案架构师 Lal Verma

预留并发性是 AW S Lambda 的一项重要功能,它保证了同时运行的 Lambda 特定函数的最大实例数。

在这篇文章中,我将探讨如何利用此功能为多租户软件即服务 (SaaS) 应用程序定义分层策略,并演示实现示例。

使用 亚马逊云科技 Lambda 函数有很多好处。从 SaaS(以及一般而言)中的无服务器模式开始,通过简化架构和运营占用空间来消除无差别的繁重工作。

请注意,如果这是您第一次在亚马逊网络服务 (亚马逊云科技) 上遇到无服务器 SaaS,请查看此博客文章以帮助提供更多背景信息: 使用 亚马逊云科技 无服务器服务 构建多租户 SaaS 解决方案

有了这个,让我们重点关注预留并发可以为你的 SaaS 应用程序提供帮助的问题领域。

SaaS 亚马逊云科技 中的分层策略

让我们从一个例子开始:SaaS提供商A正在托管一个电子商务平台。租户之一Tenant-M通过该平台销售手机。一些型号立即变得很受欢迎,流量很高,但Tenant-M却遇到了订单失败的情况。

租户已将问题上报给SaaS提供商。在调查该问题时,他们发现由多个租户共享的计算容量不足以满足所有请求。

SaaS提供商还观察到,与其他租户相比,Tenant-M需要的容量要多得多,这也影响了其他租户的性能。这是SaaS应用程序的常见问题领域,也被称为 “邻居噪音” 的情况。

定义分层策略有助于解决这个问题。例如,SaaS提供商可以为要求更高的租户(例如Tenant-M)定义白金级别。它可以向此类租户收取更高的价格,以换取投入更高的计算容量、更高的存储容量或其他资源( 图 1 说明了这种模式)。

Implementing Figure 1

图 1 — SaaS 中的分层策略。

那么它是如何工作的?如果我们将讨论范围限于计算,并且 SaaS 应用程序基于 亚马逊弹性计算云 (Amazon EC2),则您可以通过为每个租户(白金级)创建专用 EC2 实例或为租户创建专用的自动扩展组来轻松实现这一点。

如果您使用的是 亚马逊弹性容器服务 (Amazon ECS) 或 亚马逊弹性 Kubernetes 服务 (Amazon EKS),则可以为每个租户创建一个专用集群。对于 Lambda,解决方案有所不同:Lambda 是一种无服务器技术,无法让您控制底层基础架构。

在这种情况下,预留并发提供了实施分层策略的方法。这样,您就可以为白金级租户提供专用的计算容量,而无需管理底层资源。

使用预留并发的分层策略

调用 Lambda 函数时,Lambda 服务会分配一个计算实例,该函数在其中运行和处理事件。如果在第一个 Lambda 函数仍在运行时再次调用该函数,则会分配另一个实例,这会增加该函数的并发性。

您可以在文档中找到有关 Lambda 函数缩放的 更多详细信息。 继续以电子商务为例,如果您预计同时处理 1,000 个订单,则将实例化您的订单处理功能的 1,000 个实例。

您账户在同一 亚马逊云科技 区域中所有没有预留并发的函数共享 非预留 并发池。 如果没有预留的并发性,其他函数可能会耗尽所有可用的并发性。可以将预留并发应用于函数,以保证在任何时间点有最大数量的并发函数实例。

因此,如果您有一个 “订单处理” Lambda 函数,并且将其的 “预留并发” 设置为 100,Lambda 将确保您的 100 个并发请求始终可以得到满足,无论其他函数的活动如何。定义并发限制没有成本。您只需为实际处理的请求付费。

您可以扩展此功能,为白金租户创建专用函数定义,并将预留并发与之关联起来。例如,如果函数名称为 “订单处理函数”,则可以将 Tenant-M 单独定义为 “Tenant-m-Order-Processing-function”,保留并发性。

您可以根据租户需求和定价设置预留的并发值。你也可以为所有其他函数实现这一点。对于每个白金租户,你可以借助这种方法创建专用计算。

图 2 说明了将预留并发应用于租户 PT1 和租户 PT2 的所有功能的实现。

Tenant Pt1

图 2 — 采用预留并发的分层策略。

在定义分层策略时,您必须了解一些事实,以帮助您更好地进行规划。第一个是 Lambda 函数的 “ 未预留并发限制 ”,默认设置为 1000。此限额是针对每个账户和每个地区的;它也是一个软限制,可以增加到数万个。您需要申请增加配额,以确保您有足够的并发配额可在任何时候为所有租户运行所有功能。

要考虑的另一件事是 “并发上限”。如果任何租户的请求负载增加到超出限制,则请求将自动受到限制。如果租户要求更多,这可能会限制执行次数。如果是这种情况,你可以将租户移至更高的等级,也可以提高分配的层级本身的上限。

另一方面,这可以为您的多租户系统提供额外的优势。由于请求的自动限制,吵闹的邻居情况将完全由您控制。

有关预留并发功能的更多详细信息,您可以查看 亚马逊云科技 Lambda 开发者指南中提供的 “ 管理 Lambda 预留并发 性 ” 网络参考资料。现在,您已经回顾了预留并发的基本方法,让我们来看看整体解决方案的工作原理。

使用 亚马逊云科技 Lambda 预留并发实现分层

在示例实现中,为白金租户创建了专用计算空间。该解决方案是作为 亚马逊云科技 SaaS 工厂团队 构建的 无服务器 SaaS 参考解决方案 的一部分实施的。

为了设置正确的上下文,让我们首先概述一下参考解决方案。 它旨在为SaaS开发人员和架构师提供工作代码,它说明了如何使用无服务器技术(例如亚马逊云科技 Lambda、Amazon API Gat eway、Amazon Cognito 、 Amazon Dyn amoDB和亚马逊云科技 C od ePipeline)在亚马逊云科技上设计和交付多租户S a aS解决方案。

该解决方案涵盖了广泛的多租户注意事项,包括入职和身份、租户和用户管理、身份验证和授权、数据分区、租户隔离、自动部署以及多租户可观察性。

Picture1

图 3 — 无服务器 SaaS 参考架构

在预留并发的帮助下,分层策略的端到端实施可以分三个步骤来制定:

  1. 创建函数和 API: 这将确保为白金租户创建 Lambda 函数和 API 定义(API 网关)。
  2. 实现租户特定路由: 这将确保白金租户请求被路由到租户特定的资源。
  3. 实施租户特定策略: 这将确保租户的特定功能受到保护,免受未经授权的访问。

创建函数和 API

作为电子商务 SaaS 解决方案的一部分,该参考解决方案实现了样品订单服务和产品服务。这些服务基于 Lambda 函数。例如,订单服务由 Lambda 函数组成,例如 O rderCreateFunction、orderGetFunction、OrderDeleteFunction。

亚马逊云科技 CodePipeline 可以在 亚马逊云科技 Clou dFormation 模板的帮助下配置这些 Lambda 函数。 注册新的白金租户时,将使用相同的管道为租户创建专用计算资源。

在参考解决方案中,租户配置基于 CloudFormation 模板(更具体地说是 亚马逊云科技 无服务器应用程序模型 )“tenant-template.yaml”。该模板创建或更新多个 亚马逊云科技 资源,包括 Lambda 函数、DynamoDB 表以及 亚马逊云科技 身份和访问管理角色。

以下是该模板的摘录,代表了 get OrdersFunction 的函数定义:

GetOrdersFunction:
Type: AWS::Serverless::Function
DependsOn: OrderFunctionExecutionRole
Properties:
CodeUri: s3://serverless-saas-pipeline-artifactsbucket2aac5544-149q22ii0usir/07de032a239beb005fad025861857b0b
Handler: order_service.get_orders
Runtime: python3.8
Tracing: Active
Role:
Fn::GetAtt:
- OrderFunctionExecutionRole
- Arn
ReservedConcurrentExecutions:
Fn::If:
- IsPooledDeploy
- Ref: AWS::NoValue
- Ref: LambdaReserveConcurrency
Layers:
- Ref: ServerlessSaaSLayers
Environment:
Variables:
POWERTOOLS_SERVICE_NAME: OrderService
IS_POOLED_DEPLOY:
Fn::If:
- IsPooledDeploy
- true
- false
ORDER_TABLE_NAME:
Ref: OrderTable
AutoPublishAlias: live
DeploymentPreference:
Enabled:
Ref: LambdaCanaryDeploymentPreference
Type: Canary10Percent5Minutes
Alarms:
- Ref: GetOrdersFunctionCanaryErrorsAlarm
Tags:
TenantId:
Ref: TenantIdParameter
Metadata:
SamResourceId: GetOrdersFunction

正如上面的代码所强调的,该函数的 res ervedConcurrentExecutions 属性负责为函数提供保留的并发 性。并发限制值是在 LambdaReserveConcurrency 属性的帮助下传递的,该属性 是可配置的。

可以采用类似的方法为所有其他 lambda 函数定义保留的并发值,包括 getOrderFunction、createOrderFunction 和 updateOrderFunct ion。 有关所有示例函数的定义,您可以在 Github 上查看完整的模板代码。

请注意,在上述解决方案中,预留并发属性是在 CloudFormation 模板的帮助下更新的,但您可以使用其他方式实现此目的,例如 亚马逊云科技 管理控制台 、亚马逊云科技 命令行 接口 (CLI) 或 亚马逊云科技 软件开发 套件 (SDK)。

实现租户专属路由

现在这些功能已经实现,您需要确保将白金租户用户正确地路由到他们各自的职能部门。

你需要做的第一件事是创建 API 定义。我们将使用 Amazon API Gateway,这是一项完全托管的服务,可以轻松发布、维护、监控和保护任何规模的 API。

在参考解决方案中,再次使用CloudFormation模板 “tenant-template.yaml” 作为 API 定义。创建白金租户 API 定义后,CodePipeline 将使用相应的 API 网关 URL 更新租户详细信息(代表租户元数据的 DynamoDB 表)。

可以在客户端引用此 URL,以便于特定租户的路由。在参考解决方案中,示例用户界面 (UI) 是一个基于 Angular JS 的 Web 界面。名为 authConfigurationService (auth-configurat ion-service.ts)的组件负责设置租户特定的配置。

当用户登录时,这会从 DynamoDB 表中获取租户元数据,并将 API 网关 URL 设置为 “本地存储” 属性之一。这可确保将所有白金用户请求路由到正确的 API 和 Lambda 函数。你可以在 GitHub 上看到这个组件的实现细节 。

实施租户专属政策

租户特定的路由不足以确保租户的完全隔离。您还需要确保制定了安全策略,以使租户 A 的用户无法访问属于租户 B 的 Lambda 函数。

User Authorization

图 4 — 基于 IAM 策略的用户授权

在参考解决方案中,这项检查是在 Amazon Cognito、IAM 和 API Gateway 的帮助下实现的,后者可以验证所有 API 的授权请求。它在自定义授权器的帮助下完成此操作 , 自定义授权器 返回带有租户特定的 API 参考的策略。有关实现的详细信息,请参阅 自定义授权器 代码。

结论

在无服务器 SaaS 应用程序中,亚马逊云科技 lambda 提供弹性计算资源,您无需担心底层基础设施的运营和扩展方面,同时不限制您定义专用的计算资源或租户。

预留并发为隔离计算资源和定义分层策略提供了一种强大而简洁的方法。

在启用预留并发时,必须确保分配足够的并发配额以满足您的应用程序需求。此外,由于预留并发具有上限,因此您应根据租户需求和定价策略来决定其价值。

在这篇文章中,我简要介绍了示例实现。涉及多个步骤,每个步骤都很难完整地介绍。为了更深入地了解,你可以参考 GitHub 上提供的完整解决方案。 该解决方案由 亚马逊云科技 SaaS 工厂团队构建。

关于 亚马逊云科技 软件即服务工厂

亚马逊云科技 SaaS Fac tory 可在 SaaS 旅程的任何阶段为组织提供 帮助。无论是想在 亚马逊云科技 上开发新产品、迁移现有应用程序,还是优化 SaaS 解决方案,我们都可以提供帮助。访问 亚马逊云科技 SaaS 工厂洞察中心 ,了解更多技术和业务内容及最佳实践。

我们鼓励 SaaS 构建者联系他们的客户代表,询问参与模式,并与 亚马逊云科技 SaaS Factory 团队合作。

注册 以随时了解 亚马逊云科技 上最新的 SaaS 新闻、资源和活动。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。