자습서: WebSocket API, Lambda 및 DynamoDB를 사용하여 WebSocket 채팅 앱 생성 - Amazon API Gateway

자습서: WebSocket API, Lambda 및 DynamoDB를 사용하여 WebSocket 채팅 앱 생성

본 자습서에서는 WebSocket API를 사용하여 서버리스 채팅 애플리케이션을 생성합니다. WebSocket API를 사용하면 클라이언트 간의 양방향 통신을 지원할 수 있습니다. 클라이언트는 업데이트를 폴링하지 않고 메시지를 수신할 수 있습니다.

이 자습서는 완료되는데 약 30분이 걸립니다. 먼저, AWS CloudFormation 템플릿을 사용하여 API 요청을 처리하는 Lambda 함수와 클라이언트 ID를 저장하는 DynamoDB 테이블을 생성합니다. 그런 다음 API Gateway 콘솔을 사용하여 Lambda 함수와 통합되는 WebSocket API를 생성합니다. 마지막으로 API를 테스트하여 메시지가 송신 및 수신되는지 확인합니다.

이 자습서에서 생성하는 API의 아키텍처 개요입니다.

이 자습서를 완료하려면 AWS 계정과 콘솔 액세스 권한이 있는 AWS Identity and Access Management 사용자가 있어야 합니다. 자세한 내용은 API Gateway를 사용하도록 설정 단원을 참조하십시오.

또한 API에 연결하기 위해 wscat가 필요합니다. 자세한 내용은 wscat를 사용하여 WebSocket API에 연결하고 메시지 보내기 단원을 참조하십시오.

1단계: Lambda 함수 및 DynamoDB 테이블 생성

AWS CloudFormation용 앱 생성 템플릿을 다운로드하고 압축을 해제합니다. 이 템플릿을 사용하여 앱의 클라이언트 ID를 저장할 Amazon DynamoDB 테이블을 생성합니다. 연결된 각 클라이언트에는 테이블의 파티션 키로 사용될 고유 ID가 있습니다. 또한 이 템플릿은 DynamoDB에서 클라이언트 연결을 업데이트하고 연결된 클라이언트로의 메시지 전송을 처리하는 Lambda 함수를 생성합니다.

AWS CloudFormation 스택을 생성하려면
  1. AWS CloudFormation 콘솔(https://console.aws.amazon.com/cloudformation)을 엽니다.

  2. 스택 생성을 선택한 다음 새 리소스 사용(표준)을 선택합니다.

  3. 템플릿 지정에서 템플릿 파일 업로드를 선택합니다.

  4. 다운로드한 템플릿을 선택합니다.

  5. 다음을 선택합니다.

  6. 스택 이름websocket-api-chat-app-tutorial을 입력하고 다음을 선택합니다.

  7. 스택 옵션 구성에서 다음을 선택합니다.

  8. 기능의 경우 AWS CloudFormation이 계정에 IAM 리소스를 생성할 수 있음을 확인합니다.

  9. 제출을 선택합니다.

AWS CloudFormation은 템플릿에 지정된 리소스를 프로비저닝합니다. 리소스 프로비저닝을 완료하는 데 몇 분 정도 걸릴 수 있습니다. AWS CloudFormation 스택 상태가 CREATE_COMPLETE인 경우 다음 단계로 넘어갈 준비가 된 것입니다.

2단계: WebSocket API 생성

클라이언트 연결을 처리하고 1단계에서 생성한 Lambda 함수로 요청을 라우팅하는 WebSocket API를 생성합니다.

WebSocket API를 생성하려면
  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. API 생성을 선택합니다. WebSocket API에서 빌드(Build)를 선택합니다.

  3. API 이름에서 websocket-chat-app-tutorial을 입력합니다.

  4. 경로 선택 표현식(Route selection expression)request.body.action을 입력합니다. 경로 선택 표현식에 따라 클라이언트가 메시지를 보낼 때 API Gateway에서 호출할 경로가 결정됩니다.

  5. Next(다음)를 선택합니다.

  6. 사전 정의된 경로(Predefined routes)에서 $connect 추가(Add $connect), $disconnect 추가(Add $disconnect), $default 추가(Add $default)를 선택합니다. $connect$disconnect 경로는 클라이언트가 API에 연결하거나 API에서 연결을 끊을 때 API Gateway가 자동으로 호출하는 특수 경로입니다. API Gateway는 요청과 일치하는 다른 경로가 없을 때 $default 경로를 호출합니다.

  7. 사용자 지정 경로(Custom routes)에서 사용자 지정 경로 추가(Add custom routes)를 선택합니다. 경로 키(Route key)sendmessage를 입력합니다. 이 사용자 지정 경로는 연결된 클라이언트로 전송되는 메시지를 처리합니다.

  8. Next(다음)를 선택합니다.

  9. 각 경로 및 통합 유형(Integration type)에 대한 통합 연결(Attach integrations)에서 Lambda를 선택합니다.

    Lambda에서, 1단계에서 AWS CloudFormation을 사용하여 생성한 해당 Lambda 함수를 선택합니다. 각 함수의 이름은 경로와 일치합니다. 예를 들어 $connect 경로에서 이름이 websocket-chat-app-tutorial-ConnectHandler인 함수를 선택합니다.

  10. API Gateway가 생성하는 스테이지를 검토합니다. 기본적으로 API Gateway는 스테이지 이름 production을 생성하여 API를 해당 스테이지에 자동으로 배포합니다. Next(다음)를 선택합니다.

  11. 생성 및 배포(Create and deploy)를 선택합니다.

3단계: API 테스트

다음으로, API를 테스트하여 제대로 작동하는지 확인합니다. wscat 명령을 사용하여 API에 연결합니다.

API의 호출 URL을 가져오려면
  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. API를 선택합니다.

  3. 스테이지(Stages)를 선택한 다음 프로덕션(production)을 선택합니다.

  4. API의 WebSocket URL을 기록해 둡니다. URL은 wss://abcdef123.execute-api.us-east-2.amazonaws.com/production와 같아야 합니다.

API에 연결하려면
  1. API에 연결하려면 다음 명령을 사용합니다. API에 연결하면 API Gateway에서 $connect 경로를 호출합니다. 이 경로가 호출되면 API Gateway가 DynamoDB에 연결 ID를 저장하는 Lambda 함수를 호출합니다.

    wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
    Connected (press CTRL+C to quit)
  2. 새 터미널을 열고 다음 파라미터를 사용하여 wscat 명령을 다시 실행합니다.

    wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
    Connected (press CTRL+C to quit)

    이렇게 하면 메시지를 교환할 수 있는 연결된 두 클라이언트가 제공됩니다.

메시지를 전송하려면
  • API Gateway는 API의 경로 선택 표현식을 기반으로 호출할 경로를 결정합니다. API의 경로 선택 표현식은 $request.body.action입니다. 따라서 API Gateway는 다음 메시지가 전송될 때 sendmessage 경로를 호출합니다.

    {"action": "sendmessage", "message": "hello, everyone!"}

    호출된 경로와 연결된 Lambda 함수는 DynamoDB에서 클라이언트 ID를 수집합니다. 그런 다음 이 함수는 API Gateway Management API를 호출하고 해당 클라이언트에 메시지를 보냅니다. 연결된 모든 클라이언트는 다음과 같은 메시지를 받습니다.

    < hello, everyone!
API의 $default 경로를 호출하려면
  • API Gateway는 클라이언트가 정의된 경로와 일치하지 않는 메시지를 전송하는 경우 API의 기본 경로를 호출합니다. $default 경로와 연결된 Lambda 함수는 API Gateway Management API를 사용하여 연결에 대한 클라이언트 정보를 보냅니다.

    test
    Use the sendmessage route to send a message. Your info: {"ConnectedAt":"2022-01-25T18:50:04.673Z","Identity":{"SourceIp":"192.0.2.1","UserAgent":null},"LastActiveAt":"2022-01-25T18:50:07.642Z","connectionID":"Mg_ugfpqPHcCIVA="}
API 연결을 해제하려면
  • API 연결을 해제하려면 CTRL+C를 누릅니다. 클라이언트가 API에서 연결을 해제하면 API Gateway에서 API의 $disconnect 경로를 호출합니다. API의 $disconnect 경로에 대한 Lambda 통합이 DynamoDB에서 연결 ID를 제거합니다.

4단계: 정리

불필요한 비용을 방지하려면 이 자습서의 일부로 생성한 리소스를 삭제합니다. 다음 단계에서는 AWS CloudFormation 스택 및 WebSocket API를 삭제합니다.

WebSocket API를 삭제하려면
  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. API(APIs) 페이지에서 websocket-chat-app-tutorial API를 선택합니다. 작업(Actions)을 선택하고 삭제(Delete)를 선택한 다음 선택을 확인합니다.

AWS CloudFormation 스택을 삭제하려면
  1. AWS CloudFormation 콘솔(https://console.aws.amazon.com/cloudformation)을 엽니다.

  2. AWS CloudFormation 스택을 선택합니다.

  3. 삭제를 선택한 다음 해당 선택을 확인합니다.

다음 단계: 를 통한 자동화AWS CloudFormation

이 자습서와 관련된 모든 AWS 리소스의 생성 및 정리를 자동화할 수 있습니다. 이 API 및 모든 관련 리소스를 생성하는 AWS CloudFormation 템플릿은 ws-chat-app.yaml을 참조하세요.