AWS虚拟等候室——在高峰或突发流量期间缓冲用户

2022-02-15 14:37:00

本文由首席解决方案架构师贾斯汀·皮尔特尔、软件开发工程师琼·摩根和软件开发工程师吉姆·塔里奥撰写。

今天,AWS推出了官方的AWS虚拟候诊室解决方案。您可以将这个新的开源解决方案与现有的web和移动应用程序集成。它可以在高峰需求和突发流量期间帮助缓冲用户,防止系统资源耗尽。

活动通常使用虚拟等候室,那里要么有未知的需求,要么预计会出现大量流量。2019冠状病毒疾病的销售包括音乐会门票销售、黑色星期五促销活动、CVID-19疫苗注册等。虚拟等候室允许一定数量的用户直接查看、选择和完成交易。它们通过在等候室中缓冲用户,直到轮到他们排队,从而保护应用程序的后端环境不受流量影响。

像任何现实生活中的排队系统一样,用户进入AWS虚拟等候室,排队申请号码。在收到与唯一设备ID对应的号码后,浏览器会定期轮询更新。该更新提供了当前的服务号码和到达前线前的预期时间。

到达前线后,用户可以将号码和设备ID交换为安全会话令牌。这包括在他们的下游请求中,以安全地对用户进行身份验证。

如果用户发现后端端点并尝试发送请求,它们将被重定向到等候室。API请求在拥有有效令牌之前被拒绝访问。这就避免了后端需要在同一时间扩展以容纳所有用户。

集成步骤取决于应用程序的集成模式。您可以决定是让所有用户通过候诊室,还是只在流量过大的时段使用。您还可以选择仅保护为后端网页提供服务的web主机,或一个或多个为后端商务服务供电的API。

从主要目标站点向上游重定向所有流量,使其流经AWS虚拟等候室。该选项通过等候室发送所有用户流量,初始容量为受保护系统允许的用户。流量以透明的方式通过,然后缓冲剩余的用户。随着容量的增加,它将接纳新用户。只有通过候诊室的用户才能访问目标系统。

从目标站点向下重定向到虚拟等候室。此选项将所有流量发送到目标站点。目标站点有条件地重定向需要进入等候室的请求。不需要DNS或上游修改。目标站点必须能够处理初始用户请求和重定向响应。

直接目标站点API集成,用于缓冲现有网站的用户,而无需任何重定向。您的web或移动应用程序在API级别集成了虚拟等候室。这不需要重定向到其他等候室端点或站点。这可以提供无缝的用户体验,但可能需要更多的集成开发。

OpenID连接(OIDC)适配器。此选项不提供候诊室与启用OpenID Connect的系统组件(如AWS应用程序负载平衡器(ALB))的代码本机集成。负载平衡器或类似组件会将用户重定向到候诊室。它们被缓冲,直到发出一个签名的、有时间限制的JSON Web令牌(JWT)。一旦用户的JWT令牌发出,负载平衡器就会将用户请求转发到目标后端系统。

核心API。部署的主要资源包括两个Amazon API网关部署、一个VPC、几个AWS Lambda函数、一个Amazon DynamoDB表和一个Amazon ElastiCache集群。该API提供了跟踪进入等候室的客户的基本机制。它请求线路进程的状态和身份验证令牌以进入目标受保护站点。

等候室前端网站。等待室静态站点显示给等待轮到他们的用户。该网站在可配置的时间间隔内动态更新所服务的职位及其位置。您可以自定义此网站的HTML、CSS和JavaScript,以匹配前端样式和主题。

受保护目标系统的Lambda授权人。Lambda授权人包装并保护下游受保护目标系统的API。这确保了所有用户调用都有一个由候诊室核心API发出的经过验证的限时令牌。它有助于防止用户绕过候诊室。

Amazon API Gateway公共API资源,用于处理来自虚拟等候室的队列请求,跟踪队列位置,并支持对允许访问目标网站的令牌进行验证。

Amazon简单队列服务(Amazon SQS)队列,用于调节AWS Lambda函数的流量,该函数处理队列消息。SQS队列不是为每个请求调用Lambda函数,而是对传入的突发请求进行批处理。

Lambda函数用于验证和处理公共和私有API请求,并返回适当的响应。

Amazon虚拟私有云(VPC)承载Lambda功能,这些功能直接与Amazon ElastiCache for Redis群集交互。VPC端点允许VPC中的Lambda功能与解决方案中的服务进行通信。

Amazon CloudWatch规则,用于调用Lambda函数,该函数与自定义Amazon EventBridge总线一起工作,以定期广播状态更新。

(可选)由AWS身份和访问管理(IAM)角色和Lambda函数组成的授权器组件,用于验证API调用的签名。授权人保护API的唯一要求是使用API网关。

(可选)亚马逊简单通知服务(Amazon SNS)、CloudWatch和Lambda功能支持两种入口策略。

(可选)带有API网关和Lambda函数的OpenID适配器组件,允许OpenID提供商对您网站的用户进行身份验证。CloudFront distribution带有一个Amazon Simple Storage Service(Amazon S3)存储桶,用于该组件的候诊室页面。

(可选)带有Amazon S3 origin bucket的CloudFront发行版,用于可选的示例等候室web应用程序。

要开始使用AWS虚拟等候室,请部署Getting started stack。这将部署核心API堆栈、授权器堆栈和示例应用程序CloudFormation堆栈:

启动Getting Started CloudFormation堆栈。默认情况下,该模板将在美国东部(北弗吉尼亚)地区启动。要在不同的AWS区域启动解决方案,请使用控制台导航栏中的区域选择器。

在“创建堆栈”页面上,验证Amazon S3 URL文本框中是否有正确的模板URL,然后选择“下一步”。

在“指定堆栈详细信息”页面上,为解决方案堆栈指定一个名称,并接受所有默认参数值。有关命名字符限制的信息,请参阅《AWS身份和访问管理用户指南》中的IAM和STS限制。选择下一步。

在查看页面上,查看并确认设置。选中确认模板创建AWS身份和访问管理(IAM)资源的复选框。

您可以在AWS CloudFormation控制台的状态列中查看堆栈的状态。大约30分钟后,您将收到“创建完成”状态。

导航至IAM控制台。在部署候诊室堆栈的同一帐户中创建新IAM用户或选择现有IAM用户。

授予所选IAM用户编程访问权限。下载密钥文件,或将访问密钥ID和机密访问密钥值复制到便笺簿以备日后使用。

将IAM用户添加到由入门模板创建的ProtectedAppGroup IAM用户组:

使用之前保存的ControlPanelURL输出,在新选项卡或浏览器窗口中打开控制面板。

输入在生成AWS密钥中检索的访问密钥ID和秘密访问密钥,以调用IAM安全API。端点和事件ID由URL参数填写。

在新的浏览器选项卡中浏览到样本等候室。使用之前从CloudFormation堆栈输出值捕获的WaitingRoomURL。

选择Reserve进入候诊室。如果您无法继续您的交易,您分配的号码尚未到达。

在递增服务计数器下,选择更改。这将手动增加服务柜台,并允许100名用户从等候室移动到目标站点。

导航回候诊室,选择立即退房!由于您的服务号码有资格在等候室之外继续,您将被重定向到目标站点。

选择“立即购买”以在目标站点完成交易。本页代表候诊室以外的受保护系统。将其替换为您要保护的实际系统用户。

模拟购买完成后,您可以看到交易成功。此交易使用之前来自等候室的限时授权令牌进行授权。如果用户绕过等候室,他们将无法成功完成交易。

示例浏览器客户端演示了一个完整的用户流前端,以及用于电子商务购买的AWS虚拟等候室流。您可以使用此代码作为候诊室的起点,或参考API通信代码,将候诊室集成到现有网站中。

此示例代码是使用Vue构建的。js和Bootstrap来呈现用户界面。它使用Axios和Axios重试包对虚拟等候室堆栈进行API调用。示例代码使用Axios Retry包演示如何在高流量情况下处理节流条件和指数退避。

控制面板客户端用于向需要基于IAM授权的私人候诊室API发出请求。控制面板客户端演示了如何构造和签署对私有API的请求。可用于生产或进一步定制。GitHub中提供了所有示例源代码室源代码,包括示例用户客户端和控制面板客户端。

AWS虚拟候诊室解决方案现在可以免费获得,它是在Apache2许可证下作为开源提供的。它支持通过各种集成技术与任何前端应用程序进行定制集成。您还可以自定义等待室允许用户使用各种策略进入受保护目标系统的方式和时间。

要了解更多关于AWS虚拟等候室解决方案的信息,请访问解决方案实施和实施指南。