ソリューションのコンポーネント - Virtual Waiting Room on AWS

ソリューションのコンポーネント

待合室のパブリック API とプライベート API

Virtual Waiting Room on AWS ソリューションの主な目的は、クライアントに渡す JSON Web Token (JWT) の生成を制御して、送信先のウェブサイトを圧迫する可能性がある新規ユーザーのアクセスのバーストを防ぐことです。JWT は、待合室トークンを取得するまでの間、ウェブページへのアクセスを防止してサイトを保護するために利用されます。また、API アクセス認証にも利用できます。

コアテンプレートにより、Virtual Waiting Room on AWS のほとんどのオペレーションで使用されるパブリック API とプライベート (IAM で承認済み) API がインストールされます。パブリック API は、API のパスに基づく複数のキャッシュポリシーが設定された CloudFront ディストリビューションを使用して設定されます。DynamoDB テーブルと EventBridge イベントバスが作成されます。テンプレートでは、2 つのアベイラビリティーゾーン (AZ) を持つ新しい VPC を作成し、両方の AZ 内に ElastiCache for Redis クラスターといくつかの Lambda 関数が追加されます。ElastiCache for Redis とやり取りする Lambda 関数には VPC 内のネットワークインターフェイスが適用され、その他すべての Lambda 関数にはデフォルトのネットワーク接続が適用されます。コア API は、ソリューションとのやり取りの最下層を担います。その他の Lambda 関数、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、およびコンテナは、拡張機能として使用できます。これらからコア API を呼び出して、待合室の構築、インレットトラフィックの制御、ソリューションから生成されたイベントへの対応を行うことができます。

さらに、コアスタックでは、Lambda 関数のすべてのエラーおよびスロットル条件に対するアラームと、各 API Gateway のデプロイに関する 4XX および 5XX ステータスコードのアラームが作成されます。

Virtual Waiting Room on AWS のパブリック API とプライベート API のコンポーネント図

Virtual Waiting Room on AWS のパブリック API とプライベート API のコンポーネント

  1. CloudFront ディストリビューションは、クライアント用にパブリック API コールを配信し、必要に応じて結果をキャッシュします。

  2. Amazon API Gateway パブリック API は、仮想待合室からのキューリクエストを処理し、キューの位置を追跡して、ターゲットウェブサイトへのアクセスを許可するトークンの検証をサポートします。

  3. SQS キューは、キューメッセージを処理する AWS Lambda 関数へのトラフィックを調整します。

  4. AssignQueueNum Lambda 関数は、受信したバッチ内の各メッセージを検証し、ElastiCache for Redis のキューカウンターに増分を加算して、各リクエストを関連するキュー位置と共に ElastiCache for Redis に保存します。

  5. GetPublicKey Lambda 関数は、Secrets Manager からパブリックキー値を取得します。

  6. GenerateToken Lambda 関数は、ターゲットサイトでのトランザクションの完了が許可された有効なリクエストに対して JWT を生成します。トークンの生成を示すイベントを、待合室のカスタムイベントバスに書き込みます。このリクエストに対して以前にトークンが生成されていれば、新しいトークンは生成されません。

  7. GetQueueNumber Lambda 関数は、ElastiCache for Redis からキュー内のクライアントの位置を数値で取得して返します。

  8. GetServingNumber Lambda 関数は、ElastiCache for Redis から、待合室で現在処理中の数を取得して返します。

  9. GetWaitingNum Lambda 関数は、待合室で現在キューに入れられているものの、まだトークンが発行されていない数を返します。

  10. VPC エンドポイントは、VPC 内の Lambda 関数がソリューション内のサービスと通信することを許可します。

  11. ElastiCache for Redis クラスターは、待合室に入るすべてのリクエストを有効な Event ID で保存します。また、キューに入れられたリクエストの数、現在処理中の数、生成されたトークンの数、完了したセッションの数、中止されたセッションの数などを示すカウンターも保存されます。

  12. API Gateway のプライベート API リソースは、管理機能をサポートします。プライベート API は AWS IAM で認証されます。

  13. GetExpiredTokens Lambda 関数は、有効期限切れのトークンを持つリクエスト ID のリストを返します。

  14. AuthGenerateToken Lambda 関数は、ターゲットサイトでのトランザクションの完了が許可された有効なリクエストに対してトークンを生成します。コアスタックのデプロイ中に最初に設定されたトークンの発行者と有効期間は上書き可能です。トークンの生成を示すイベントを、待合室のカスタムイベントバスに書き込みます。このリクエストに対して以前にトークンが生成されていれば、新しいトークンは生成されません。

  15. IncrementServingCounter Lambda 関数は、ElastiCache for Redis に保存されている待合室のサービングカウンターに増分の値を加算します。

  16. GetNumActiveTokens Lambda 関数は DynamoDB にクエリを実行して、まだ有効期限内で、トランザクションの完了に使用されておらず、中止とマークされていないトークンの数を確認します。

  17. ResetState Lambda 関数は、ElastiCache for Redis に保存されているすべてのカウンターをリセットします。また、TokenTableQueuePositionEntryTimeServingCounterIssuedAt の DynamoDB テーブルを削除して再作成します。さらに、CloudFront キャッシュの無効化を実行します。

  18. UpdateSession Lambda 関数は、TokenTable DynamoDB テーブルに保存されているセッション (トークン) のステータスを更新します。セッションステータスは整数で示されます。ステータスが 1 に設定されたセッションは完了を示し、-1 は中止を示します。セッションの更新を示すイベントを、待合室のカスタムイベントバスに書き込みます。

  19. TokenTable DynamoDB テーブルには、トークンデータが保存されます。

  20. QueuePositionEntryTime DynamoDB テーブルには、キューの位置とエントリ時間のデータが保存されます。

  21. ServingCounterIssuedAt DynamoDB テーブルには、サービングカウンターの更新が保存されます。

  22. GetQueuePositionExpireTime Lambda 関数は、クライアントがキュー位置の残りの有効期限をリクエストしたときに呼び出されます。

  23. SetMaxQueuePositionExpired Lambda 関数は、ServingCounterIssuedAt テーブルの値に対応して有効期限切れになったキュー位置の最大値を設定します。コアスタックのデプロイ時に IncrSvcOnQueuePositionExpiry パラメータが true に設定されている場合は、1 分ごとに実行されます。

  24. GenerateEvents Lambda 関数は、待合室のカスタムイベントバスに待合室のさまざまなメトリクスを書き込みます。コアスタックのデプロイ時に Enable Events Generation パラメータが true に設定されている場合は、1 分ごとに実行されます。

  25. AWS Secrets Manager はトークンオペレーション用のキーやその他の機密データを保存します。

  26. Amazon EventBridge カスタムイベントバスは、トークンが生成され、TokenTable DynamoDB テーブルでセッションが更新されるたびにイベントを受け取ります。また、サービングカウンターが SetMaxQueuePositionExpired Lambda で移動したときにもイベントを受け取ります。コアスタックのデプロイ時にアクティブになっている場合は、待合室のさまざまなメトリクスも書き込まれます。

  27. Amazon CloudWatch イベントルールは、Enable Events Generation パラメータがコアスタックのデプロイ時に true に設定されている場合に作成されます。このイベントルールは、GenerateEvents Lambda 関数を 1 分ごとに起動します。

オーソライザー

このソリューションには、API Gateway の Lambda オーソライザースタックが含まれています。このスタックは、1 つの IAM ロールと 1 つの Lambda 関数で構成されています。APIGatewayAuthorizer Lambda 関数は、Virtual Waiting Room on AWS の API によって発行されたトークンの署名とリクエストを検証する API Gateway のオーソライザーです。スタックに付属する Lambda 関数を使用して、待合室で待機していたユーザーがアクセストークンを受け取るまで、クラウド API を保護することができます。オーソライザーは、トークン検証用にパブリックキーと設定をコア API から自動的に取得してキャッシュします。AWS Lambda をサポートする AWS リージョンであれば、変更することなく使用でき、インストールすることもできます。

OpenID アダプター

OpenID アダプターのスタックは、OpenID の ID プロバイダーとして機能する API Gateway と Lambda 関数をデプロイします。OpenID アダプターには OIDC 互換 API のセットが用意されており、AWS Elastic Load Balancing や WordPress などの OIDC の ID プロバイダーをサポートする既存のウェブホスティングソフトウェアで使用したり、Amazon Cognito や同様のサービスのフェデレーション ID プロバイダーとして使用したりすることもできます。このアダプターを使用すると、統合オプションが限られている市販のウェブホスティングソフトウェアを使用する場合でも、AuthN/AuthZ のフローで待合室を使用できます。このスタックでは、1 つの Amazon S3 バケットをオリジンとして、もう 1 つの Amazon S3 バケットをロギングリクエストとして使用する CloudFront ディストリビューションもインストールされます。OpenID アダプターは、サンプル待合室スタックで提供されているものと似ていますが、OpenID 認証フロー用に設計されたサンプル待合室ページを提供します。認証を受けるプロセスには、待合室でキュー内の位置を取得して、処理待ち順序がクライアントのキュー位置と同じかそれ以上になるまで待機することが含まれています。OpenID の待合室ページはターゲットサイトにリダイレクトされ、OpenID API を使用してクライアントのトークンの取得とセッションの設定を完了します。このソリューションの API エンドポイントは、正式な OpenID Connect 1.0 フロー仕様に直接 (名前に対応して) マッピングされています。詳細については、「OpenID Connect Core 1.0 Authentication」を参照してください。

AWS Virtual Waiting Room の OpenID アダプターのコンポーネント図

Virtual Waiting Room on AWS の OpenID アダプターのコンポーネント

  1. CloudFront ディストリビューションは、S3 バケットのコンテンツをユーザーに提供します。

  2. S3 バケットは、サンプル待合室のページをホストします。

  3. Amazon API Gateway の API は、OIDC ID プロバイダーの Lambda オーソライザー機能をサポートする既存のウェブホスティングソフトウェアで使用できる OIDC 互換 API のセットを提供します。

  4. APIHandler Lambda 関数は、すべての API Gateway リソースパスへのリクエストを処理します。同じモジュール内のさまざまな Python 関数が、各 API のパスにマッピングされています。例えば、API Gateway の /authorize リソースパスを指定すると、Lambda 関数内の authorize() が呼び出されます。

  5. OIDC 設定は Secrets Manager に保存されます。

インレットストラテジーのサンプル

インレットストラテジーは、ターゲットサイトでより多くのユーザーに対応するために、ソリューションのサービングカウンターをいつ前に進めるべきかを決定します。待合室のインレットストラテジーに関する概念的な情報については、「設計上の考慮事項」を参照してください。

このソリューションには、サンプルとして 2 つのインレットストラテジー (MaxSize、Periodic) が用意されています。

AWS Virtual Waiting Room のインレットストラテジーのコンポーネント図

Virtual Waiting Room on AWS のインレットストラテジーのコンポーネント

インレットストラテジーの MaxSize オプション:

  1. クライアントは、MaxSizeInlet Lambda 関数を呼び出す Amazon SNS 通知を発行して、メッセージペイロードに基づいてサービングカウンターに増分を加算します。

  2. MaxSizeInlet Lambda 関数は、サービングカウンターの増分量を決定するためのメッセージの受信を想定しています。

インレットストラテジーの Periodic オプション:

  1. CloudWatch ルールは 1 分ごとに Lambda 関数を呼び出して、サービングカウンターを一定量増やします。

  2. PeriodicInlet Lambda 関数は、指定された開始時刻から終了時刻までの間に時刻がある場合、指定された増分値をサービングカウンターに加算します。オプションで、CloudWatch アラームをチェックして、アラームが OK の状態であれば増分の加算を行い、それ以外の場合はスキップします。

サンプル待合室

サンプル待合室は、最小限の構成でエンドツーエンドの待合室ソリューションを実演するために、カスタムオーソライザーに加えて、パブリック API およびプライベート API と統合されています。S3 バケットに保存されているメインのウェブページは、CloudFront のオリジンとして使用されます。ユーザーは次の手順を実行するように指示されます。

  1. サイトに入るための待合室で列に並びます。

  2. クライアントの列内での位置情報 (順番) を取得します。

  3. 待合室の処理待ち順序を取得します。

  4. 処理待ちの順序がクライアントの位置情報と同じかそれ以上になったら、トークンセットを取得します。

  5. トークンを使用して、Lambda オーソライザーで保護された API を呼び出します。

Virtual Waiting Room のサンプルイベントサイトのコンポーネント図

Virtual Waiting Room on AWS のサンプルイベントサイトのコンポーネント

  1. S3 バケットは、待合室とコントロールパネルのサンプルコンテンツをホストします。

  2. CloudFront ディストリビューションは、S3 バケットのコンテンツをユーザーに配信します。

  3. /search/checkout などのショッピングサイトのようなリソースパスを備えた API Gateway のサンプルをデプロイします。この API はスタックによってインストールされ、トークンのオーソライザーを使用して設定されます。これは、待合室で API を保護する簡単な方法の例として意図されています。有効なトークンを提示するリクエストが Lambda に転送されますが、それ以外の場合はエラーが返されます。この API には、アタッチされた Lambda 関数からのレスポンス以外の機能はありません。