본문 바로가기

개발 기록/AWS

AWS API Gateway - WebSocket API와 HTTP API 연동하기 PART-2

반응형

지난번 PART1에 이어 PART2장은 $default와 간단한 사용자 정의 라우트 키를 통한 메세지 전송 및 응답 전송을 해본다.

 

지난번에 $default 설정을 하지 않아 Forbidden 에러가 발생하였는데 아래처럼 기본 Mock 메세지를 설정하면 발생하지 않는다. $default 라우트 키를 활용하고 싶으면 별도로 커스텀 마이징을 해도 괜찮다. 

 

1. $default 기본 설정하기

응답코드 200으로 기본 템플릿 정보를 생성한다.
더 이상 에러가 발생하지 않는다.

 

2. 사용자 설정 라우트 키를 통해 클라이언트 메세지 전송 및 서버에서 메세지를 보내기

이번에는 "클라이언트 -> 서버"로 메세지 전송하기와 "서버 -> 클라이언트"로 메세지 전송하기를 해볼 것 이다.

 

2-1 클라이언트 -> 서버 메세지 전달하기

  "새 경로 키" 입력란을 통해 sendMessage라는 경로를 신규 생성하고, 지난번과 같이 통합 요청 정보를 Mock으로 저장

  후 HTTP로 설정하여 엔드포인트 및 요청 템플릿을 작성한다.

 

* 입력 템플릿

{
    "connectionId" : "$context.connectionId", // --> websocket session id 정보
    "message" : "$input.path('$.message')" // --> 입력한 body 부의 입력 json 항목 값 중 message 파싱
}

* 테스트 하기

서버에 메세지를 전송해본다.
@RequestBody 정보를 보면 정상적으로 메세지가 넘어오는것을 확인 할 수 있다.

 

2-2 서버 -> 클라이언트 메세지 전달하기

 

* AWS IAM 사용자 정보 생성

  - AWS 메뉴 IAM 접속 -> 사용자 -> 사용자 추가

엑세스 키로 생성한다.
기존 생성된 Full Access 정책을 사용해도 되고 특정 websocket ID만 사용하도록 별도 정책을 생성해도 된다.

 

액세스 키 ID와 비밀 액세스 키를 복사한다.

 

* build.gradle에 aws-java-sdk 추가하기

implementation 'com.amazonaws:aws-java-sdk:1.11.931'

 

* 테스트 코드 작성하기

// AWS credential 정보 
BasicAWSCredentials credentials = new BasicAWSCredentials("<액세스 키 ID>", "<비밀 액세스 키>");

// WebSocket 백엔드 메세지 전송 URL 설정 정보 (* 연결 URL은 @Connections 경로는 제외)
AwsClientBuilder.EndpointConfiguration config = new AwsClientBuilder
					       .EndpointConfiguration("<연결 URL 입력>","<리전 정보 입력>");

// ApiGatewayManagementApi 객체 생성
AmazonApiGatewayManagementApi client = AmazonApiGatewayManagementApiClientBuilder.standard()
                                       .withEndpointConfiguration(config)
                                       .withCredentials(new AWSStaticCredentialsProvider(credentials)).build();

// 전송 대상 connectionId 주입
PostToConnectionRequest request = new PostToConnectionRequest();
request.setConnectionId("<WebSocket SessionID 입력>");

// 전송 대상에게 보낼 메세지 생성
Charset charset = Charset.forName("UTF-8");
CharsetEncoder encoder = charset.newEncoder();
ByteBuffer buff = null;
try {
	buff = encoder.encode(CharBuffer.wrap("{ "action" : "backEndMessage", "message" : "test" }"));
} catch (CharacterCodingException e) {
	e.printStackTrace();
}

// 메세지 전송
request.setData(buff);
PostToConnectionResult result = client.postToConnection(request);

 

테스트 성공!!
방금 전송했던 메세지를 클라이언트에서 수신 받는것을 확인 할 수 있다.

 

이처럼, 기존 http 통신을 통한 실시간 소켓 통신이 가능하기에 채팅이나 실시간 처리등을 어플리케이션에서 소켓 구현 없이 구축이 가능한 점이 장점인거 같다. 문제는 요금인데 요금은 잘 확인해보고 적합한지 사용하길 바란다.

반응형