方案元件 - 上的虛擬等待室 AWS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

方案元件

公共和私人等候室 APIs

關於 AWS 解決方案的主要目的的虛擬等待室是以受控的方式控制客戶端的 JSON Web Token(JWT)的生成,以避免可能使目標網站不堪重負的新用戶爆發。JWTs可用於網站保護,在獲得等候室令牌之前防止訪問網頁,以及用於API訪問授權。

核心模板安裝API用於大多數虛擬等候室的公共API和私有(IAM-授權)的 AWS 操作。公API用會根據API路徑設定具有多個快取原則的 CloudFront散佈。隨即建立 DynamoDB 資料表和 EventBridge事件匯流排。該範本會新增一個VPC包含兩個可用區域 (AZs)、兩者中的彈性疼 (RedisOSS) 叢集AZs,以及多個 Lambda 函數的新功能。與 Elasticache (RedisOSS) 互動的 Lambda 函數在其中具有網路介面,VPC而所有其他 Lambda 函數均具有預設網路連線能力。核心APIs是與解決方案的交互的最低層。其他 Lambda 函數、Amazon 彈性運算雲端 (AmazonEC2) 執行個體和容器都可以充當擴充功能,並呼叫核心APIs以建立等候室、控制入口流量,以及對解決方案產生的事件做出反應。

此外,核心堆疊會針對其所有 Lambda 函數錯誤和節流狀況建立警示,以及針對 4XX 和 5XX 狀態碼的每個API閘道部署建立警示。

AWS 公共和私人APIs組件圖上的虛擬等候室

AWS公共和私有APIs組件上的虛擬等候室

  1. CloudFront 分佈為客戶端提供公共API呼叫,並在適當的情況下緩存結果。

  2. Amazon API Gateway 來自虛擬等候室的公有API程序佇列請求、追蹤佇列位置,並支援驗證允許存取目標網站的權杖。

  3. SQSqueue 可調節處理佇列訊息之 AWS Lambda 函數的流量。

  4. AssignQueueNumLambda 函數會驗證其批次接收的每則訊息、在 Elasticache (Redis) 中遞增佇列計數器,並將每個要求儲存在 Elasticache (RedisOSS) 中,並將每個要求及其相關聯的佇列位置儲存在 Elasticache (RedisOSS) 中。

  5. L GetPublicKey ambda 函數會從 Secrets Manager 擷取公開金鑰值。

  6. L GenerateToken ambda 函數會針JWT對已允許在目標網站完成交易的有效請求產生一個。它將事件寫入等候室的自定義事件總線,該事件已生成令牌。如果先前已為此請求生成令牌,則不會生成新令牌。

  7. GetQueueNumberLambda 函數檢索並返回從彈性(Redis OSS 的)隊列中的客戶端的數字位置。

  8. GetServingNumber Lambda 函數檢索並返回當前由等待室從彈性(RedisOSS)提供服務的號碼。

  9. L GetWaitingNum ambda 函數返回當前在等待室中排隊並尚未發出令牌的數字。

  10. VPC端點可讓中的 Lambda 函數與VPC解決方案內的服務進行通訊。

  11. Elasticache (RedisOSS) 叢集會儲存所有使用有效事件識別碼進入等候室的要求。它還存儲了幾個計數器,例如排入隊的請求數量,當前服務的數量,生成的令牌數量,完成的會話數以及放棄的會話數量。

  12. API閘道私有API資源,以支援管理功能。私APIs有已 AWS IAM驗證。

  13. L GetExpiredTokens ambda 函數返回帶IDs有過期令牌的請求列表。

  14. L AuthGenerateToken ambda 函數會為已允許在目標網站完成交易的有效請求產生權杖。核心堆疊部署期間最初設定的權杖的發行者和有效期間可以覆寫。它將事件寫入等候室的自定義事件總線,該事件已生成令牌。如果先前已為此請求生成令牌,則不會生成新令牌。

  15. IncrementServingCounterLambda 函數增加存儲在彈性(RedisOSS)中的等待室的服務計數器,給定的增量按值。

  16. GetNumActiveTokensLambda 函數會查詢 DynamoDB 中尚未過期、尚未用來完成其交易且尚未標示為放棄的權杖數目。

  17. ResetStateLambda 函數會重設儲存在彈性痛 (RedisOSS) 中的所有計數器。它也會刪除和重新建立TokenTableQueuePositionEntryTime、和 ServingCounterIssuedAt DynamoDB 表格。此外,它執行 CloudFront 緩存失效。

  18. UpdateSessionLambda 函數會更新儲存在 TokenTable DynamoDB 表中的工作階段 (權杖) 的狀態。會話狀態由一個整數表示。工作階段設定為的狀態1表示已完成,並-1表示已放棄。它會將事件寫入等候室的自訂事件匯流排,表示工作階段已更新。

  19. TokenTable態資料表會儲存權杖資料。

  20. QueuePositionEntryTimeDynamoDB 表格會儲存佇列位置和輸入時間資料。

  21. ServingCounterIssuedAtDynamoDB 資料表會將更新儲存至服務計數器。

  22. 當用戶端要求剩餘的佇列位置到期時間時,會叫用 GetQueuePositionExpireTime Lambda 函數。

  23. L SetMaxQueuePositionExpired ambda 函數設置已過期對應於ServingCounterIssuedAt表值的最大隊列位置。如果true在核心堆疊部署期間將IncrSvcOnQueuePositionExpiry參數設定為,它會每分鐘執行一次。

  24. GenerateEventsLambda 函數會將各種等候室指標寫入等候室的自訂事件匯流排。如果true在核心堆疊部署期間將啟用事件產生參數設定為,它會每分鐘執行一次。

  25. AWS Secrets Manager 存儲令牌操作和其他敏感數據的密鑰。

  26. 每次產生權杖並在 TokenTable DynamoDB 表中更新工作階段時,Amazon EventBridge 自訂事件匯流排都會收到事件。當服務計數器在 SetMaxQueuePositionExpired Lambda 中移動時,它也會接收事件。如果在核心堆疊部署期間啟用,則會使用各種等候室指標寫入。

  27. 如果在核心堆疊部署期間將啟用 CloudWatch 事件產生參數設定為 true,則會建立 Amazon 事件規則。此事件規則會每分鐘啟動 GenerateEvents Lambda 函數。

Authorizers

此解決方案包括API閘道 Lambda 授權者堆疊。該堆棧由一個IAM角色和一個 Lambda 函數組成。L APIGatewayAuthorizer ambda 函數是API閘道的授權者,可驗證虛擬等候室所發行權杖的簽章和宣告。 AWS API堆疊隨附的 Lambda 函數可用於保護雲端,APIs直到使用者在等候室中進展並收到存取權杖為止。授權者會自動從核心檢索並緩存公鑰和配置以API進行令牌驗證。它可以在沒有修改的情況下使用,並且可以安裝在任何支持的 AWS 區域 AWS Lambda。

OpenID 適配器

OpenID 介面卡堆疊會部署API閘道和 Lambda 函數,以做為 OpenID 身分識別提供者。OpenID 介面卡提供了一組 OIDC-相容,APIs可與支援OIDC身分提供者 (例如 AWS 彈性負載平衡器) 的現有 Web 託管軟體搭配使用 WordPress,或作為 Amazon Cognito 或類似服務的聯合身分提供者使用。該適配器允許客戶在使用具有有限集成選項的 off-the-shelf Web 託管軟件時使用 Authn/Authz 流程中的等候室。此堆疊也會安裝 CloudFront 分發,其中包含一個 Amazon S3 儲存貯體做為來源,另一個用於記錄請求的 S3 儲存貯體。OpenID 適配器提供一個示例等待室頁面,類似於示例等待室堆棧中提供的頁面,但是為 OpenID 身份驗證流程而設計。通過身份驗證的過程涉及獲取等待室隊列中的位置,並等待服務位置等於或大於客戶端的隊列位置。OpenID 等候室頁面會重新導向回目標網站,該網站使用 OpenID 完API成用戶端的權杖擷取和工作階段設定。該解決方案的API端點直接映射到官方 OpenID Connect 1.0 流程規範, name-for-name. 有關詳細信息,請參閱 OpenID Connect 核心 1.0 認證

AWS 虛擬等候室 OpenID 轉接器元件圖

AWS OpenID 適配器組件上的虛擬等候室

  1. CloudFront 散發將 S3 儲存貯體的內容提供給使用者。

  2. S3 儲存貯體託管範例等候室頁面。

  3. Amazon API Gateway API 提供一組與現有的OIDC網路託管軟體搭配使用,這些軟體可支援OIDC身分供應商的 Lambda 授權功能。APIs

  4. APIHandlerLambda 函數會處理所有API閘道資源路徑的要求。同一模塊中的不同 Python 函數映射到每個API路徑。例如,API閘道中的/authorize資源路徑會在 Lambda 函數authorize()內叫用。

  5. OIDC設定會儲存在 Secrets Manager 中。

進水策略範例

入口策略決定解決方案的服務計數器何時應向前移動,以容納更多目標場地的使用者。若要取得有關等候室進水策略的更多概念資訊,請參閱設計考量

解決方案提供了兩種取樣入口策略:MaxSize和「週期性」。

AWS 虛擬等候室進氣策略元件圖

AWS 進水口的虛擬等候室策略元件

最大尺寸入口策略選項:

  1. 用戶端會發出 Amazon SNS 通知,呼叫 MaxSizeInlet Lambda 函數,以根據訊息承載增加服務計數器。

  2. MaxSizeInletLambda 函數會預期收到一則訊息,說明它使用它決定要增加多少服務計數器。

週期性入口策略選項:

  1. CloudWatch 規則會每分鐘叫用 Lambda 函數,將服務計數器增加固定數量。

  2. 如果時間在提供的開始和結束時間之間,則 PeriodicInlet Lambda 函數會按給定大小遞增服務計數器。或者,它會檢查 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其他功能。