解决方案组件 - 虚拟等候室已开启 AWS

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

解决方案组件

公共和私人等候室 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 状态代码创建警报。

AWS 公共和私有APIs组件图上的虚拟等候室图

AWS公共和私有APIs组件上的虚拟等候室

  1. CloudFront 分发会为客户端提供公共API调用,并在适当时缓存结果。

  2. Amazon API Gateway 公开API处理来自虚拟等候室的队列请求,跟踪队列位置,并支持验证允许访问目标网站的令牌。

  3. SQSqueue 控制流向处理队列消息的 AWS Lambda 函数的流量。

  4. AssignQueueNumLambda 函数验证其批次收到的每条消息,在 Elasticache (Redis) 中增加队列计数器,并将每个请求及其关联的队列位置存储在 Elasticache (RedisOSS) 中。OSS

  5. GetPublicKeyLambda 函数从 Secrets Manager 中检索公钥值。

  6. JWT对于允许在目标站点完成交易的有效请求,GenerateTokenLambda 函数会生成一个。它向等候室的自定义事件总线写入一个已生成令牌的事件。如果之前已经为此请求生成了令牌,则不会生成任何新令牌。

  7. GetQueueNumberLambda 函数从 Elasticache (Redis) 检索并返回客户端在队列中的数字位置。OSS

  8. GetServingNumberLambda 函数从 Elasticache (Redis) 检索并返回等候室当前正在提供的号码。OSS

  9. GetWaitingNumLambda 函数返回当前在等候室排队但尚未发放令牌的号码。

  10. VPC终端节点允许中的 Lambda 函数VPC与解决方案中的服务进行通信。

  11. Elasticache (RedisOSS) 集群使用有效的事件 ID 存储所有进入等候室的请求。它还存储多个计数器,例如已排队的请求数、当前正在处理的请求数、生成的令牌数量、已完成的会话数和放弃的会话数。

  12. API网关私有API资源以支持管理职能。私APIs有 AWS IAM经过身份验证。

  13. GetExpiredTokensLambda 函数返回包含过期令牌IDs的请求列表。

  14. AuthGenerateTokenLambda 函数为允许在目标站点完成交易的有效请求生成令牌。在核心堆栈部署期间最初设置的令牌的发行者和有效期可以被覆盖。它向等候室的自定义事件总线写入一个已生成令牌的事件。如果之前已经为此请求生成了令牌,则不会生成任何新令牌。

  15. 如果按值递增,IncrementServingCounterLambda 函数会递增存储在 Elasticache (RedisOSS) 中的等候室服务计数器。

  16. GetNumActiveTokensLambda 函数向 DynamoDB 查询尚未过期、尚未用于完成交易以及尚未标记为已放弃的代币数量。

  17. ResetStateLambda 函数会重置存储在 Elasticache (Redis) 中的所有计数器。OSS它还会删除和重新创建TokenTableQueuePositionEntryTime、和 ServingCounterIssuedAt DynamoDB 表。此外,它还会执行 CloudFront 缓存失效。

  18. UpdateSessionLambda 函数更新存储在 DynamoD TokenTable B 表中的会话(令牌)的状态。会话状态用整数表示。设置为状态的会话1表示已完成,-1表示已放弃。它向等候室的自定义事件总线写入会话已更新的事件。

  19. TokenTableDynamoDB 表存储令牌数据。

  20. QueuePositionEntryTimeDynamoDB 表存储队列位置和进入时间数据。

  21. ServingCounterIssuedAtDynamoDB 表存储服务计数器的更新。

  22. 当客户端请求剩余队列位置到期时间时,就会调用 GetQueuePositionExpireTime Lambda 函数。

  23. SetMaxQueuePositionExpiredLambda 函数根据ServingCounterIssuedAt表值设置已过期的最大队列位置。如果在核心堆栈部署true期间将IncrSvcOnQueuePositionExpiry参数设置为,则它每分钟运行一次。

  24. GenerateEventsLambda 函数将各种等候室指标写入等候室的自定义事件总线。如果在核心堆栈部署true期间将 “启用事件生成” 参数设置为,则每分钟运行一次。

  25. AWS Secrets Manager 存储令牌操作的密钥和其他敏感数据。

  26. 每当生成令牌并更新 TokenTable DynamoDB 表中的会话时,Amazon EventBridge 自定义事件总线都会收到一个事件。当发球计数器在 SetMaxQueuePositionExpired Lambda 中移动时,它还会接收事件。如果在核心堆栈部署期间激活,则会写入各种等候室指标。

  27. 如果在核心堆栈部署期间将 “启用事件生成” 参数设置为 true,则会创建 Amazon CloudWatch 事件规则。此事件规则每分钟启动一次 Lamb GenerateEvents da 函数。

授权方

该解决方案包括API网关 Lambda 授权方堆栈。堆栈由一个IAM角色和一个 Lambda 函数组成。APIGatewayAuthorizerLambda 函数是 API Gateway 的授权者,可以验证虚拟等候室在上发布的令牌的签名和声明。 AWS API堆栈附带的 Lambda 函数可用于保护云,APIs直到用户通过等候室并收到访问令牌。授权方会自动从核心中检索和缓存公钥和配置,API以进行令牌验证。它无需修改即可使用,并且可以安装在任何支持的 AWS 区域 AWS Lambda。

OpenID 适配器

OpenID 适配器堆栈部署了充当 OpenID 身份提供商的网关API和 Lambda 函数。OpenID 适配器提供了一组OIDC兼容的APIs,可以与支持OIDC身份提供商(例如 AWS 弹性负载均衡器)的现有虚拟主机软件一起使用,也可以用作 Amazon Cognito 或类似服务的联合身份提供商。 WordPress该适配器允许客户在使用集成选项有限的虚拟 off-the-shelf 主机软件时使用 Authn/Authz 流程中的等候室。堆栈还安装了一个 CloudFront 分配,其中一个 Amazon S3 存储桶作为源,另一个 S3 存储桶用于记录请求。OpenID 适配器提供一个示例等候室页面,与示例等候室堆栈中提供的页面类似,但专为 OpenID 身份验证流程而设计。通过身份验证的过程包括在等候室队列中获得一个位置,然后等到服务位置等于或大于客户的队列位置。OpenID 等候室页面重定向回目标站点,目标站点使用 OpenID API 完成客户端的令牌获取和会话配置。该解决方案的API端点直接映射到官方的 OpenID Connect 1.0 流量规范。 name-for-name有关详细信息,请参阅 OpenID Connect Core 1.0 身份验证

AWS 虚拟等候室 OpenID 适配器组件图

AWS OpenID 适配器组件上的虚拟等候室

  1. CloudFront 分发将 S3 存储桶的内容提供给用户。

  2. S3 存储桶主机等候室页面示例。

  3. Amazon API Gateway API 提供了一组OIDC兼容的APIs,可与支持OIDC身份提供商的 Lambda 授权功能的现有虚拟主机软件一起使用。

  4. APIHandlerLambda 函数处理所有API网关资源路径的请求。同一模块中的不同 Python 函数映射到每个API路径。例如,API网关中的/authorize资源路径在 Lambda 函数authorize()中调用。

  5. OIDC设置存储在 Secrets Manager 中。

样本入口策略

入口策略决定解决方案的服务柜台何时应向前移动,以容纳目标站点中的更多用户。有关等候室入口策略的更多概念性信息,请参阅设计注意事项

该解决方案提供了两种样本入口策略:MaxSize定期

AWS 虚拟等候室入口策略组件图

AWS 入口策略组件上的虚拟等候室

最大尺寸入口策略选项:

  1. 客户发出 Amazon SNS 通知,该通知调用 Lamb MaxSizeInlet da 函数以根据消息有效负载增加服务计数器。

  2. MaxSizeInletLambda 函数期望收到一条消息,它使用它来确定要增加多少服务计数器。

定期入口策略选项:

  1. CloudWatch 规则每分钟调用一次 Lambda 函数,将发球计数器增加固定数量。

  2. 如果时间介于提供的开始时间和结束时间之间,PeriodicInletLambda 函数将按给定大小递增服务计数器。或者,它会检查 CloudWatch 警报,如果警报处于OK状态,则执行增量,否则跳过警报。

等候室示例

除了自定义授权者之外,示例等候室还与公共和私有APIs等候室集成,以演示最小的 end-to-end 等候室解决方案。主网页存储在 S3 存储桶中,并用作其来源 CloudFront。它引导用户完成以下步骤:

  1. 在等候室排队等候进入现场。

  2. 获取客户的排队位置。

  3. 获取等候室的发球位置。

  4. 一旦发球位置等于或大于客户头寸,即可获得代币集。

  5. 使用该令牌调用受 Lambda 授权方API保护的。

虚拟等候室示例活动现场组件图

AWS 示例活动网站组件上的虚拟等候室

  1. S3 存储桶托管等候室和控制面板的示例内容。

  2. CloudFront 分发将 S3 存储桶内容提供给用户。

  3. 使用类似购物的资源路径(如和)的API网关部署示例。/search /checkoutAPI它由堆栈安装并使用令牌授权器进行配置。它旨在作为在等候室保护人的简单方法API的示例。提供有效令牌的请求会被转发到 Lambda,否则会返回错误。除了附加的 Lambda 函数的响应外,没有任何API其他功能。