연결된 사용자 및 클라이언트 앱 관리: $connect 및 $disconnect 라우팅 - Amazon API Gateway

연결된 사용자 및 클라이언트 앱 관리: $connect$disconnect 라우팅

$connect 라우팅

클라이언트 앱은 WebSocket 업그레이드 요청을 전송하여 WebSocket API에 연결합니다. 요청이 성공하면 연결이 설정되는 동안 $connect 라우팅이 실행됩니다.

WebSocket 연결은 상태 저장 연결이므로 $connect 라우팅에서만 권한 부여를 구성할 수 있습니다. AuthN/AuthZ은 연결 시점에만 수행됩니다.

$connect 라우팅과 연결된 통합 실행이 완료될 때까지 업그레이드 요청은 대기 중이고 실제 연결이 설정되지 않습니다. $connect 요청이 실패하면(예: AuthN/AuthZ 실패 또는 통합 실패로 인해) 연결이 이루어지지 않습니다.

참고

$connect에서 권한 부여에 실패하면 연결이 설정되지 않고 클라이언트는 401 또는 403 응답을 받게 됩니다.

$connect에 대한 통합 설정은 선택 사항입니다. 다음의 경우 $connect 통합 설정을 고려해야 합니다.

  • 클라이언트가 Sec-WebSocket-Protocol 필드를 사용하여 서브프로토콜을 지정할 수 있도록 하고 싶습니다. 예제 코드는 WebSocket 서브프로토콜이 필요한 $connect 라우팅 설정 단원을 참조하세요.

  • 클라이언트가 연결될 때 알림을 받고 싶습니다.

  • 연결을 조절하거나 연결하는 사람을 통제하고 싶습니다.

  • 백엔드가 콜백 URL을 사용하여 클라이언트로 메시지를 다시 보내도록 하고 싶습니다.

  • 각 연결 ID 및 기타 정보를 데이터베이스(예: Amazon DynamoDB)에 저장하고 싶습니다.

$connect 라우팅에서 연결 정보 전달

프록시 및 비프록시 통합을 모두 사용하여 $connect 경로에서 데이터베이스 또는 기타 AWS 서비스 서비스로 정보를 전달할 수 있습니다.

프록시 통합을 사용하여 연결 정보 전달

이벤트의 Lambda 프록시 통합에서 연결 정보에 액세스할 수 있습니다. 다른 AWS 서비스 또는 AWS Lambda 함수를 사용하여 연결에 게시합니다.

다음 Lambda 함수는 requestContext 객체를 사용하여 연결 ID, 도메인 이름, 단계 이름 및 쿼리 문자열을 기록하는 방법을 보여줍니다.

Node.js
export const handler = async(event, context) => { const connectId = event["requestContext"]["connectionId"] const domainName = event["requestContext"]["domainName"] const stageName = event["requestContext"]["stage"] const qs = event['queryStringParameters'] console.log('Connection ID: ', connectId, 'Domain Name: ', domainName, 'Stage Name: ', stageName, 'Query Strings: ', qs ) return {"statusCode" : 200} };
Python
import json import logging logger = logging.getLogger() logger.setLevel("INFO") def lambda_handler(event, context): connectId = event["requestContext"]["connectionId"] domainName = event["requestContext"]["domainName"] stageName = event["requestContext"]["stage"] qs = event['queryStringParameters'] connectionInfo = { 'Connection ID': connectId, 'Domain Name': domainName, 'Stage Name': stageName, 'Query Strings': qs} logging.info(connectionInfo) return {"statusCode": 200}

비프록시 통합을 사용하여 연결 정보 전달

  • 비프록시 통합으로 연결 정보에 액세스할 수 있습니다. 통합 요청을 설정하고 WebSocket API 요청 템플릿을 제공합니다. 다음 Velocity Template Language(VTL) 매핑 템플릿은 통합 요청을 제공합니다. 이 요청은 다음 세부 정보를 비프록시 통합에 전송합니다.

    • 연결 ID

    • 도메인 이름

    • 단계 이름

    • 경로

    • 헤더

    • 쿼리 문자열

    이 요청은 연결 ID, 도메인 이름, 단계 이름, 경로, 헤더 및 쿼리 문자열을 비프록시 통합으로 보냅니다.

    { "connectionId": "$context.connectionId", "domain": "$context.domainName", "stage": "$context.stage", "params": "$input.params()" }

    데이터 변환 설정에 대한 자세한 내용은 WebSocket API에 대한 데이터 변환 설정 섹션을 참조하세요.

    통합 요청을 완료하려면 통합 응답에 StatusCode: 200을 설정합니다. 통합 응답 설정에 대한 자세한 내용은 API Gateway 콘솔을 사용하여 통합 응답 설정 섹션을 참조하세요.

$disconnect 라우팅

연결이 종료된 후 $disconnect 라우팅이 실행됩니다.

서버 또는 클라이언트에 의해 연결이 종료될 수 있습니다. 실행될 때 연결이 이미 종결되었기 때문에, $disconnect가 최선의 이벤트입니다. API Gateway는 통합에 $disconnect 이벤트를 전달하기 위해 최선을 다하지만 전달을 보장할 수는 없습니다.

백엔드는 @connections API를 사용하여 연결 해제를 시작할 수 있습니다. 자세한 내용은 백엔드 서비스에서 @connections 명령 사용 단원을 참조하세요.