솔루션 구성 요소 - AWS 기반 가상 대기실

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

솔루션 구성 요소

대기실 공개 및 비공개 API

Virtual Waiting Room on AWS 솔루션의 주요 목적은 대상 웹 사이트에 과부하가 걸릴 수 있는 신규 사용자 폭주를 방지하기 위해 통제된 방식으로 클라이언트를 위한 JSON 웹 토큰 (JWT) 생성을 제어하는 것입니다. JWT는 사이트 보호, 대기실 토큰을 받을 때까지 웹 페이지에 대한 액세스를 차단하고 API 액세스 권한 부여에도 사용할 수 있습니다.

코어 템플릿은 대부분의 가상 대기실 운영에 사용되는 공개 API 및 사설 (IAM 인증) API를 설치합니다. AWS 퍼블릭 API는 API 경로를 기반으로 하는 여러 캐싱 정책이 포함된 CloudFront 배포로 구성됩니다. DynamoDB EventBridge 테이블과 이벤트 버스가 생성됩니다. 템플릿은 두 개의 가용 영역 (AZ) 이 있는 새 VPC, 두 AZ 모두에 있는 ElastiCache Redis 클러스터 및 여러 Lambda 함수를 추가합니다. for ElastiCache Redis와 상호 작용하는 Lambda 함수는 VPC 내에 네트워크 인터페이스를 가지며 다른 모든 Lambda 함수는 기본 네트워크 연결을 가집니다. 핵심 API는 솔루션과의 상호 작용이 가장 낮은 계층입니다. 다른 Lambda 함수, Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스 및 컨테이너는 확장 기능으로 작동하고 코어 API를 호출하여 대기실을 구축하고, 유입 트래픽을 제어하고, 솔루션에서 생성된 이벤트에 대응할 수 있습니다.

또한 코어 스택은 모든 Lambda 함수 오류 및 스로틀 조건에 대한 경보뿐만 아니라 4XX 및 5XX 상태 코드에 대한 각 API Gateway 배포에 대한 경보를 생성합니다.

퍼블릭 및 프라이빗 API의 가상 대기실 구성 요소 다이어그램 AWS

AWS 퍼블릭 및 프라이빗 API 구성 요소의 가상 대기실

  1. CloudFront 배포는 클라이언트에 대한 퍼블릭 API 호출을 제공하고 적절한 경우 결과를 캐싱합니다.

  2. Amazon API Gateway 퍼블릭 API는 가상 대기실의 대기열 요청을 처리하고, 대기열 위치를 추적하고, 대상 웹 사이트에 대한 액세스를 허용하는 토큰의 검증을 지원합니다.

  3. SQS 대기열은 대기열 메시지를 처리하는 AWS Lambda 함수에 대한 트래픽을 규제합니다.

  4. AssignQueueNumLambda 함수는 수신된 일괄 처리의 각 메시지를 검증하고, Redis의 대기열 카운터를 ElastiCache 늘리고, 각 요청을 관련 대기열 위치와 함께 ElastiCache Redis에 저장합니다.

  5. GetPublicKeyLambda 함수는 Secrets Manager에서 퍼블릭 키 값을 검색합니다.

  6. GenerateTokenLambda 함수는 대상 사이트에서 트랜잭션을 완료하도록 허용된 유효한 요청에 대해 JWT를 생성합니다. 토큰이 생성되었다는 이벤트를 대기실의 사용자 지정 이벤트 버스에 기록합니다. 이 요청에 대해 이전에 토큰을 생성한 경우 새 토큰은 생성되지 않습니다.

  7. GetQueueNumberLambda 함수는 Redis용 대기열에서 클라이언트의 숫자 위치를 검색하고 반환합니다. ElastiCache

  8. GetServingNumberLambda 함수는 Redis의 대기실에서 현재 서비스 중인 번호를 검색하여 반환합니다. ElastiCache

  9. GetWaitingNumLambda 함수는 현재 대기실에 대기하고 있지만 아직 토큰이 발급되지 않은 번호를 반환합니다.

  10. VPC 엔드포인트를 사용하면 VPC의 Lambda 함수가 솔루션 내의 서비스와 통신할 수 있습니다.

  11. ElastiCache Redis의 경우 클러스터는 대기실에 들어가기 위한 모든 요청을 유효한 이벤트 ID와 함께 저장합니다. 또한 대기열에 있는 요청 수, 현재 제공 중인 요청 수, 생성된 토큰 수, 완료된 세션 수, 중단된 세션 수와 같은 여러 카운터를 저장합니다.

  12. API Gateway 프라이빗 API 리소스는 관리 기능을 지원합니다. 프라이빗 API는 AWS IAM 인증을 받았습니다.

  13. GetExpiredTokensLambda 함수는 만료된 토큰이 있는 요청 ID 목록을 반환합니다.

  14. AuthGenerateTokenLambda 함수는 대상 사이트에서 트랜잭션을 완료하도록 허용된 유효한 요청에 대한 토큰을 생성합니다. 코어 스택 배포 중에 처음 설정된 토큰의 발급자 및 유효 기간은 재정의될 수 있습니다. 토큰이 생성되었다는 이벤트를 대기실의 커스텀 이벤트 버스에 기록합니다. 이 요청에 대한 토큰이 이전에 생성된 경우 새 토큰은 생성되지 않습니다.

  15. IncrementServingCounterLambda 함수는 Redis에 저장된 ElastiCache 대기실의 서빙 카운터를 값만큼 증가시켜 줍니다.

  16. GetNumActiveTokensLambda 함수는 아직 만료되지 않았고, 트랜잭션을 완료하는 데 사용되지 않았으며, 중단된 것으로 표시되지 않은 토큰 수를 DynamoDB에 쿼리합니다.

  17. ResetStateLambda 함수는 Redis에 저장된 모든 카운터를 재설정합니다. ElastiCache 또한TokenTable,QueuePositionEntryTime, DynamoDB ServingCounterIssuedAt 테이블을 삭제하고 다시 생성합니다. 또한 캐시 무효화를 수행합니다. CloudFront

  18. UpdateSessionLambda 함수는 DynamoDB 테이블에 저장된 세션 (토큰) 의 TokenTable 상태를 업데이트합니다. 세션 상태는 정수로 표시됩니다. 상태로 설정된 세션은 1 완료됨을 나타내며 중단됨을 -1 나타냅니다. 세션이 업데이트되었다는 이벤트를 대기실의 커스텀 이벤트 버스에 기록합니다.

  19. TokenTableDynamoDB 테이블은 토큰 데이터를 저장합니다.

  20. QueuePositionEntryTimeDynamoDB 테이블은 대기열 위치 및 진입 시간 데이터를 저장합니다.

  21. ServingCounterIssuedAtDynamoDB 테이블은 서빙 카운터에 대한 업데이트를 저장합니다.

  22. GetQueuePositionExpireTimeLambda 함수는 클라이언트가 남은 대기열 위치 만료 시간을 요청할 때 호출됩니다.

  23. SetMaxQueuePositionExpiredLambda 함수는 테이블 값에 따라 만료된 최대 대기열 위치를 설정합니다. ServingCounterIssuedAt 코어 스택 배포 true 중에 IncrSvcOnQueuePositionExpiry 파라미터가 로 설정된 경우 1분마다 실행됩니다.

  24. GenerateEventsLambda 함수는 대기실의 사용자 지정 이벤트 버스에 다양한 대기실 지표를 기록합니다. 코어 스택 배포 true 중에 이벤트 생성 활성화 파라미터가 설정된 경우 1분마다 실행됩니다.

  25. AWS Secrets Manager는 토큰 작업을 위한 키와 기타 민감한 데이터를 저장합니다.

  26. Amazon EventBridge 사용자 지정 이벤트 버스는 토큰이 생성되고 TokenTable DynamoDB 테이블에서 세션이 업데이트될 때마다 이벤트를 수신합니다. 또한 SetMaxQueuePositionExpired Lambda에서 서빙 카운터가 이동할 때 이벤트를 수신합니다. 코어 스택 배포 중에 활성화되면 다양한 대기실 지표와 함께 기록됩니다.

  27. Amazon CloudWatch 이벤트 규칙은 코어 스택 배포 중에 이벤트 생성 활성화 파라미터가 true로 설정된 경우 생성됩니다. 이 이벤트 규칙은 GenerateEvents 1분마다 Lambda 함수를 시작합니다.

권한 부여자

솔루션에는 API Gateway Lambda 권한 부여자 스택이 포함되어 있습니다. 스택은 하나의 IAM 역할과 Lambda 함수로 구성됩니다. APIGatewayAuthorizerLambda 함수는 API Gateway의 권한 부여자로, API의 가상 대기실에서 발급한 토큰의 서명과 클레임을 검증할 수 있습니다. AWS 스택과 함께 제공되는 Lambda 함수는 사용자가 대기실을 통과하여 액세스 토큰을 받을 때까지 클라우드 API를 보호하는 데 사용할 수 있습니다. 권한 부여자는 토큰 검증을 위해 핵심 API에서 퍼블릭 키와 구성을 자동으로 검색하고 캐싱합니다. 수정 없이 사용할 수 있으며 지원하는 모든 AWS 지역에 설치할 수 있습니다. AWS Lambda

오픈ID 어댑터

OpenID 어댑터 스택은 OpenID ID 공급자 역할을 하는 API Gateway 및 Lambda 함수를 배포합니다. OpenID 어댑터는 OIDC 호환 API 세트를 제공합니다. 이 API는 AWS Elastic Load Balancers와 같은 OIDC ID 공급자를 지원하는 기존 웹 호스팅 소프트웨어와 함께 사용하거나 Amazon Cognito 또는 유사한 서비스의 페더레이션 ID 공급자로 사용할 수 있습니다. WordPress 이 어댑터를 통해 고객은 통합 옵션이 제한된 off-the-shelf 웹 호스팅 소프트웨어를 사용할 때 AuthN/Authz 플로우의 대기실을 사용할 수 있습니다. 또한 스택은 Amazon S3 버킷 하나를 오리진으로 사용하고 다른 S3 버킷은 요청 로깅을 위한 CloudFront 배포를 설치합니다. 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 자격 증명 공급자의 Lambda 권한 부여 기능을 지원하는 기존 웹 호스팅 소프트웨어와 함께 사용할 수 있는 OIDC 호환 API 세트를 제공합니다.

  4. APIHandlerLambda 함수는 모든 API Gateway 리소스 경로에 대한 요청을 처리합니다. 동일한 모듈 내의 다른 Python 함수가 각 API 경로에 매핑됩니다. 예를 들어, API Gateway의 /authorize 리소스 경로는 Lambda 함수 authorize() 내에서 호출됩니다.

  5. OIDC 설정은 Secrets Manager에 저장됩니다.

샘플 유입구 전략

유입구 전략은 대상 사이트에 더 많은 사용자를 수용하기 위해 솔루션의 서빙 카운터를 앞당겨야 하는 시기를 결정합니다. 대기실 유입 전략에 대한 자세한 개념 정보는 설계 고려 사항을 참조하십시오.

솔루션에서 제공하는 샘플 유입 전략에는 두 가지가 있습니다. 바로 주기율입니다. MaxSize

AWS 가상 대기실 유입 전략 구성 요소 다이어그램

AWS 유입 전략 구성 요소의 가상 대기실

최대 크기 유입구 전략 옵션:

  1. 클라이언트는 MaxSizeInlet Lambda 함수를 호출하여 메시지 페이로드를 기반으로 서비스 카운터를 늘리는 Amazon SNS 알림을 발행합니다.

  2. MaxSizeInletLambda 함수는 메시지를 수신할 것으로 예상하고, 이 함수를 사용하여 서빙 카운터를 얼마나 늘릴지 결정합니다.

주기적 입력 전략 옵션:

  1. CloudWatch 규칙은 1분마다 Lambda 함수를 호출하여 서빙 카운터를 고정된 수량만큼 늘립니다.

  2. PeriodicInletLambda 함수는 제공된 시작 시간과 종료 시간 사이에 있는 경우 지정된 크기만큼 서빙 카운터를 증가시킵니다. 선택적으로 CloudWatch 경보를 확인하고 경보가 OK 상태에 있으면 증분을 수행하고 그렇지 않으면 건너뛰게 됩니다.

샘플 대기실

샘플 대기실은 사용자 지정 권한 부여 기능 외에도 퍼블릭 및 프라이빗 API와 통합되어 최소한의 end-to-end 대기실 솔루션을 보여줍니다. 기본 웹 페이지는 S3 버킷에 저장되며 오리진으로 사용됩니다. CloudFront 사용자에게 다음 단계를 안내합니다.

  1. 대기실에서 줄을 서서 사이트에 입장하세요.

  2. 줄 서서 고객의 위치를 파악하세요.

  3. 대기실의 서빙 위치를 확인하세요.

  4. 서빙 포지션이 클라이언트의 포지션과 같거나 그 이상이 되면 토큰 세트를 받으세요.

  5. 토큰을 사용하여 Lambda 권한 부여자가 보호하는 API를 호출합니다.

가상 대기실 샘플 이벤트 사이트 구성 요소 다이어그램

AWS 샘플 이벤트 사이트 구성 요소의 가상 대기실

  1. S3 버킷은 대기실 및 제어판의 샘플 콘텐츠를 호스팅합니다.

  2. CloudFront 배포는 S3 버킷 콘텐츠를 사용자에게 제공합니다.

  3. 및 와 같은 쇼핑과 유사한 리소스 경로를 포함하는 샘플 API Gateway 배포. /search /checkout 이 API는 스택에 의해 설치되며 토큰 권한 부여자로 구성됩니다. 이는 대기실에서 API를 보호하는 간단한 방법의 예시입니다. 유효한 토큰을 제시하는 요청은 Lambda로 전달되며, 그렇지 않으면 오류가 반환됩니다. 첨부된 Lambda 함수의 응답 외에는 API에 기능이 없습니다.