본문 바로가기
AWS/Solutions

Virtual Waiting Room on AWS

by 여행을 떠나자! 2022. 8. 9.

1. 소개

- 기능: 이 솔루션은 대량 트래픽 발생 시 웹사이트로 수신되는 사용자 요청을 버퍼링 할 수 있는 기능을 제공

- 작성자: AWS

- 라이선스: Apache license 2.0

- AWS 솛루션?

  AWS 서비스, 코드 및 구성을 조합하여 바로 배포할 수 있는 솔루션 (https://aws.amazon.com/ko/solutions/)

  ‘콘텐츠 전송 및 엣지 서비스’ 분야에 소개된 Virtual Waiting Romm on AWS 솔루션 

 

2. Deployment

- 자세한 내용은 아래 가이드를 참조하기 바라며, 아래에 설치 및 테스트 내용을 간략하게 기술하였음

   https://docs.aws.amazon.com/solutions/latest/virtual-waiting-room-on-aws/automated-deployment.html

- Prerequisites

   ✓ If there are no existing APIs defined in this Region, install the aws-virtual-waiting-room-api-gateway-cw-logs-role.template.

- Launch the getting-started stack

   ✓ Install the aws-virtual-waiting-room-getting-started.template AWS CloudFormation template.

       CloudFomation template 설치 시에 입력하는 stack name는 24문자 이내로 설정해야 함. 초과 시 SNS queue 생성 도중에 queue명이 80자리를 초과하여 에러가 발생됨. (아래 설치결과 A 참조)

       총 3개의 stack (CoreModule, AuthorizerModule, SampleModule)이 설치됨

- 설치 결과

   ✓ SampleModule stack 설치 후 stack의 Outputs (위 설치결과 B 참조)의 ControlPanelURL과 WaitingRoomURL 페이지를 이용하여 테스트 하였음

 

3. Test the waiting room

A. Generate AWS keys to call the IAM secured APIs

- Create an IAM user and change a group (aws-virtual-waiting-room-CoreMod-ProtectedApiGroup-*)

   ✓ Waiting Room Private REST API(API Gateway)를 실행할 수 있는 권한을 부여

 

B. Control Panel UI

- ControlPanel 접속, 위에서 생성한 IAM User의 Access key와 Secret access key 입력

 

C. Waiting Room UI

- Waiting 단계

   ✓ 접속된 Waiting room 페이지에서 Waiting Room Public Rest API(API Gateway)의 리소스 assign_queue_num을 호출하고 Request ID를 리턴 받음

       ▷ https://d4w5*******.cloudfront.net/assign_queue_num?event_id=Sample

   ✓ 본인 순번을 얻기 위해서 Waiting Room Public REST API의 리소스 queue_num을 호출 함

       ▷ https://d4w5*******.cloudfront.net/queue_num?event_id=Sample&request_id=f2ef8fc4-d3cd-4367-a92e-a9e177c59683

   ✓ Serving Position과 Waiting Room size 정보를 얻기 위해 반복적으로 Waiting Room Public REST API의 리소스 waiting_num과 serving_num를 호출 함

       ▷ https://d4w5*******.cloudfront.net/waiting_num?event_id=Sample

       ▷ https://d4w5*******.cloudfront.net/serving_num?event_id=Sample

- Waiting 상태 변경 단계

   ✓ ‘Control Panel UI’ 페이지의 ‘Increment Serving Counter’ 항목을 1로 설정 후 반영하면 Serving Counter가 증가됨

   ✓ ‘Waiting Room UI’ 페이지에서 본인 순번이 서빙 순번과 같거나 작은 상태가 되면 waiting_num과 serving_num API 호출을 중단하고 페이지 내의 버튼을 ‘Waiting for line to advance’에서 ‘Check out now’로 변경 및 활성화되며, 클릭 시 Token 발급됨

- Token 발급 단계

   ✓ Waiting Room Public REST API(API Gateway)의 리소스 generate_token를 호출하여 토큰을 발급 받음

       ▷ https://d4w5*******.cloudfront.net/generate_token

   ✓ 발급된 토큰은 JWT(JSON Web Tokens) 형식이며, https://jwt.io/ 사이트에서 디코딩 가능

   ✓ ‘Control Panel UI’에서 Active token수와 Expired token 수를 조회할 수 있으며, DynamoD에 토큰은 저장됨

- 비즈니스 API 호출 단계

   ✓ ‘Waiting Room UI’ 페이지에서 ‘Purchase now; 버튼을 클릭하면 Access 토큰을 Request header에 추가하여 비즈니스 API를 호출 

       ▷ https://r1j8e****.execute-api.ap-northeast-2.amazonaws.com/store/checkout

   ✓ 토큰 없이 해당 API를 호출하면 인증 에러가 발생됨

   ✓ 비즈니스 API (Lambda) snippet

from chalice import Chalice, CustomAuthorizer, CORSConfig, Response

app = Chalice(app_name='core-api-authorizers-sample')

WAITING_ROOM_AUTH = CustomAuthorizer('WaitingRoomAuthorizer',
                                     header='Authorization',
                                     authorizer_uri='PLACEHOLDER')

CORS_CONFIG = CORSConfig(allow_origin='*',
                         allow_headers=['*'],
                         max_age=600,
                         expose_headers=['*'],
                         allow_credentials=True)

RESPONSE_HEADERS = {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': '*'
}


@app.route('/checkout',
           methods=['GET'],
           authorizer=WAITING_ROOM_AUTH,
           cors=CORS_CONFIG)
def checkout():
    """
    This function represents a /checkout API endpoint.
    """
    return Response(status_code=200,
                    body={"result": "Success"},
                    headers=RESPONSE_HEADERS)

 

4. Sequence diagram

- Enter Waiting Room (/assign_queue_num)

- Get Entrance Result (/queue_num)

- Get Serving Position (/serving_num)

- Get Entrance Token (/generate_token)

- Use API Gateway Authorizer (/generate_token)

 

5. Architecture

- 상세 설명

   https://aws.amazon.com/ko/solutions/implementations/aws-virtual-waiting-room/

 

6. 타사 솔루션

 

- Cloudflare Waiting Room | Cloudflare

- 넷퍼널 (https://netfunnel.io/)

 

7. 참고 사이트

- Implementation Guide

   https://docs.aws.amazon.com/solutions/latest/virtual-waiting-room-on-aws/welcome.html

- Github

   https://github.com/aws-solutions/virtual-waiting-room-on-aws

- Virtual Waiting Room on AWS Developer Guide

   https://github.com/aws-solutions/virtual-waiting-room-on-aws/blob/main/docs/developer-guide.md

'AWS > Solutions' 카테고리의 다른 글

Virtual Waiting Room on AWS - Inlet strategy  (0) 2022.08.21

댓글