本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
解决方案组件
公共和私人等候室 APIs
AWS 解决方案上的虚拟等候室的主要目的是以可控的方式控制客户JSON网络令牌 (JWT) 的生成,以避免大量新用户涌入可能使目标网站不堪重负。JWTs可用于站点保护,在获得等候室令牌之前阻止访问网页,也可以用于API访问授权。
核心模板安装了公共和API私人(IAM已授权),API用于大多数虚拟等候室的 AWS 操作。根据API路径API为公众配置了具有多个缓存策略的 CloudFront分发。创建了 DynamoDB 表 EventBridge和事件总线。该模板添加了一个VPC包含两个可用区 (AZs) 的新可用区,两个可用区中都有一个 Elasticache (RedisOSS) 集群AZs,还有几个 Lambda 函数。与 Elasticache (RedisOSS) 交互的 Lambda 函数在内部具有网络接口,而VPC所有其他 Lambda 函数都具有默认的网络连接。核心APIs是与解决方案交互的最低层。其他 Lambda 函数、Amazon Elastic Compute Cloud EC2 (Amazon) 实例和容器可以充当扩展,调用核心APIs来构建等候室、控制入口流量并对解决方案生成的事件做出反应。
此外,核心堆栈会针对其所有 Lambda 函数错误和限制条件创建警报,并为每个 API Gateway 部署的 4XX 和 5XX 状态代码创建警报。
-
CloudFront 分发会为客户端提供公共API调用,并在适当时缓存结果。
-
Amazon API Gateway 公开API处理来自虚拟等候室的队列请求,跟踪队列位置,并支持验证允许访问目标网站的令牌。
-
SQSqueue 控制流向处理队列消息的 AWS Lambda 函数的流量。
-
AssignQueueNum
Lambda 函数验证其批次收到的每条消息,在 Elasticache (Redis) 中增加队列计数器,并将每个请求及其关联的队列位置存储在 Elasticache (RedisOSS) 中。OSS -
GetPublicKey
Lambda 函数从 Secrets Manager 中检索公钥值。 -
JWT对于允许在目标站点完成交易的有效请求,
GenerateToken
Lambda 函数会生成一个。它向等候室的自定义事件总线写入一个已生成令牌的事件。如果之前已经为此请求生成了令牌,则不会生成任何新令牌。 -
GetQueueNumber
Lambda 函数从 Elasticache (Redis) 检索并返回客户端在队列中的数字位置。OSS -
GetServingNumber
Lambda 函数从 Elasticache (Redis) 检索并返回等候室当前正在提供的号码。OSS -
GetWaitingNum
Lambda 函数返回当前在等候室排队但尚未发放令牌的号码。 -
VPC终端节点允许中的 Lambda 函数VPC与解决方案中的服务进行通信。
-
Elasticache (RedisOSS) 集群使用有效的事件 ID 存储所有进入等候室的请求。它还存储多个计数器,例如已排队的请求数、当前正在处理的请求数、生成的令牌数量、已完成的会话数和放弃的会话数。
-
API网关私有API资源以支持管理职能。私APIs有 AWS IAM经过身份验证。
-
GetExpiredTokens
Lambda 函数返回包含过期令牌IDs的请求列表。 -
AuthGenerateToken
Lambda 函数为允许在目标站点完成交易的有效请求生成令牌。在核心堆栈部署期间最初设置的令牌的发行者和有效期可以被覆盖。它向等候室的自定义事件总线写入一个已生成令牌的事件。如果之前已经为此请求生成了令牌,则不会生成任何新令牌。 -
如果按值递增,
IncrementServingCounter
Lambda 函数会递增存储在 Elasticache (RedisOSS) 中的等候室服务计数器。 -
GetNumActiveTokens
Lambda 函数向 DynamoDB 查询尚未过期、尚未用于完成交易以及尚未标记为已放弃的代币数量。 -
ResetState
Lambda 函数会重置存储在 Elasticache (Redis) 中的所有计数器。OSS它还会删除和重新创建TokenTable
QueuePositionEntryTime
、和ServingCounterIssuedAt
DynamoDB 表。此外,它还会执行 CloudFront 缓存失效。 -
UpdateSession
Lambda 函数更新存储在 DynamoDTokenTable
B 表中的会话(令牌)的状态。会话状态用整数表示。设置为状态的会话1
表示已完成,-1
表示已放弃。它向等候室的自定义事件总线写入会话已更新的事件。 -
TokenTable
DynamoDB 表存储令牌数据。 -
QueuePositionEntryTime
DynamoDB 表存储队列位置和进入时间数据。 -
ServingCounterIssuedAt
DynamoDB 表存储服务计数器的更新。 -
当客户端请求剩余队列位置到期时间时,就会调用
GetQueuePositionExpireTime
Lambda 函数。 -
SetMaxQueuePositionExpired
Lambda 函数根据ServingCounterIssuedAt
表值设置已过期的最大队列位置。如果在核心堆栈部署true
期间将IncrSvcOnQueuePositionExpiry
参数设置为,则它每分钟运行一次。 -
GenerateEvents
Lambda 函数将各种等候室指标写入等候室的自定义事件总线。如果在核心堆栈部署true
期间将 “启用事件生成” 参数设置为,则每分钟运行一次。 -
AWS Secrets Manager 存储令牌操作的密钥和其他敏感数据。
-
每当生成令牌并更新
TokenTable
DynamoDB 表中的会话时,Amazon EventBridge 自定义事件总线都会收到一个事件。当发球计数器在SetMaxQueuePositionExpired
Lambda 中移动时,它还会接收事件。如果在核心堆栈部署期间激活,则会写入各种等候室指标。 -
如果在核心堆栈部署期间将 “启用事件生成” 参数设置为 true,则会创建 Amazon CloudWatch 事件规则。此事件规则每分钟启动一次 Lamb
GenerateEvents
da 函数。
授权方
该解决方案包括API网关 Lambda 授权方堆栈。堆栈由一个IAM角色和一个 Lambda 函数组成。APIGatewayAuthorizer
Lambda 函数是 API Gateway 的授权者,可以验证虚拟等候室在上发布的令牌的签名和声明。 AWS API堆栈附带的 Lambda 函数可用于保护云,APIs直到用户通过等候室并收到访问令牌。授权方会自动从核心中检索和缓存公钥和配置,API以进行令牌验证。它无需修改即可使用,并且可以安装在任何支持的 AWS 区域 AWS Lambda。
OpenID 适配器
OpenID 适配器
-
CloudFront 分发将 S3 存储桶的内容提供给用户。
-
S3 存储桶主机等候室页面示例。
-
Amazon API Gateway API 提供了一组OIDC兼容的APIs,可与支持OIDC身份提供商的 Lambda 授权功能的现有虚拟主机软件一起使用。
-
APIHandler
Lambda 函数处理所有API网关资源路径的请求。同一模块中的不同 Python 函数映射到每个API路径。例如,API网关中的/authorize
资源路径在 Lambda 函数authorize()
中调用。 -
OIDC设置存储在 Secrets Manager 中。
样本入口策略
入口策略决定解决方案的服务柜台何时应向前移动,以容纳目标站点中的更多用户。有关等候室入口策略的更多概念性信息,请参阅设计注意事项。
该解决方案提供了两种样本入口策略:MaxSize和定期。
最大尺寸入口策略选项:
-
客户发出 Amazon SNS 通知,该通知调用 Lamb
MaxSizeInlet
da 函数以根据消息有效负载增加服务计数器。 -
MaxSizeInlet
Lambda 函数期望收到一条消息,它使用它来确定要增加多少服务计数器。
定期入口策略选项:
-
CloudWatch 规则每分钟调用一次 Lambda 函数,将发球计数器增加固定数量。
-
如果时间介于提供的开始时间和结束时间之间,
PeriodicInlet
Lambda 函数将按给定大小递增服务计数器。或者,它会检查 CloudWatch 警报,如果警报处于OK
状态,则执行增量,否则跳过警报。
等候室示例
除了自定义授权者之外,示例等候室还与公共和私有APIs等候室集成,以演示最小的 end-to-end 等候室解决方案。主网页存储在 S3 存储桶中,并用作其来源 CloudFront。它引导用户完成以下步骤:
-
在等候室排队等候进入现场。
-
获取客户的排队位置。
-
获取等候室的发球位置。
-
一旦发球位置等于或大于客户头寸,即可获得代币集。
-
使用该令牌调用受 Lambda 授权方API保护的。
-
S3 存储桶托管等候室和控制面板的示例内容。
-
CloudFront 分发将 S3 存储桶内容提供给用户。
-
使用类似购物的资源路径(如和)的API网关部署示例。
/search
/checkout
API它由堆栈安装并使用令牌授权器进行配置。它旨在作为在等候室保护人的简单方法API的示例。提供有效令牌的请求会被转发到 Lambda,否则会返回错误。除了附加的 Lambda 函数的响应外,没有任何API其他功能。