Lambda 와 API Gateway를 이용하여 다국어 그룹 채팅만드는 방법

3분 분량
콘텐츠 수준: 고급
0

해당 기사에서는 Lambda 와 API Gateway를 이용하여 다국어 그룹 채팅을 개발하는 방법에 대해 안내해드립니다.

사용 사례

API Gateway, Lambda 를 이용하여 소켓 통신을 할 수 있는 어플리케이션을 개발합니다. 본 기사에서는 간단한 설명을 위하여 wscat 을 이용하여 소캣 통신을 테스트 합니다. 사용자는 그룹에 들어가서 메시지를 보낼수 있으며 그룹의 모든 사용자가 받을수 있습니다. 또한 다양한 언어를 지닌 사용자를 고려하여 번역하여 메시지를 보낼수있는 채팅을 제공합니다.

1단계: Lambda 함수에 사용할 역할 생성하기

  • IAM 페이지에서 [IAM 역할],[역할 만들기]를 클릭합니다.
  • 일반사용사례 [lambda]를 클릭한뒤 아래의 정책을 추가합니다.
    • AmazonAPIGatewayInvokeFullAccess ,TranslateFullAccess
  • 역할 세부정보에서 역할의 이름을 임의로 지정하여 IAM 역할을 생성합니다.

2단계: Lambda 함수 생성

  • [Lambda],[함수],[함수 생성] 을 클릭합니다.
  • 함수 이름에는 Lambda_Chatting 을 넣은뒤에 런타임은 최신버전의 파이썬(3.11) 으로 선택합니다.
  • [기본 실행 역할 변경],[기존 역할 사용]을 클릭하여 이전에 만들어둔 IAM권한으로 설정합니다.

Enter image description here

3단계: API Gateway 생성

  • API이름에 ChattingAPI를 입력합니다.
  • [라우팅 선택 표현식]에 request.body.action를 입력합니다. [1]
  • [미리 정의된 경로에] 경로 $connect, $disconnect, $default 를 추가합니다.
  • [통합 연결]에서 아래와 같이 이전에 만든 Lambda 함수에 매핑을 해줍니다.
  • [스테이지 추가] 기본 설정을 유지하고 [검토 및 생성]에서 [생성 및 배포]를 클릭합니다.

Enter image description here

4단계: Lambda 함수 코드

  • 만들어진 API Gateway의 API를 클릭합니다.
  • API의 스테이지를 클릭한뒤 WebSocket URL의 wss://부분을 제외한 나머지를 아래의 코드에 붙여 넣습니다.
  • 수정한 코드를 이전단계에서 만든 Lambda 함수에서 [코드]를 클릭한뒤에 편집창에서 붙여넣은뒤에 [Deploy]를 클릭하여 배포합니다.
import json
import boto3

ENDPOINT = 'https://<WSS로 시작하는 API Gateway의 엔드포인트>'

translate_client = boto3.client('translate')
apigateway_client = boto3.client('apigatewaymanagementapi', endpoint_url=ENDPOINT)

names = {}

def send_text(id, body):
    try:
        apigateway_client.post_to_connection(
            ConnectionId=id,
            Data=body
        )
    except Exception as e:
        print(e)

def translateSend(ids, body):
    source_language = body['source']
    target_language = body['target']
    message = body['message']

    response = translate_client.translate_text(Text=message, SourceLanguageCode=source_language,
                                               TargetLanguageCode=target_language)
    translated_text = response['TranslatedText']
    for i in ids:
        send_text(i, translated_text)


def lambda_handler(event, context):
    cnt=1
    if 'requestContext' not in event:
        return {}
    try:
        connection_id = event['requestContext']['connectionId']
        route_key = event['requestContext']['routeKey']
        body = json.loads(event.get('body', '{}'))
        if route_key == "$connect":
            pass
        elif route_key == "$disconnect":
            del names[connection_id]
        else:
            action = body.get("action")
            if action == "join":
                names[connection_id] = cnt
                cnt+=1
            elif action == "translateSend":
                translateSend(list(names.keys()), body)
    except Exception as e:
        print(e)
    return {}

5단계: WSCAT을 이용한 설정 및 채팅 테스트 [2]

  • https://www.npmjs.com/package/wscat에서 wscat를 다운로드합니다.
  • npm install -g wscat을 이용하여 wscat을 설치합니다.
  • 이후 아래의 명령어를 통해서 접속할수있습니다.
    • wscat -c <wss 엔드포인트>
  • 접속한뒤에는 아래의 명령어를 통해서 그룹에 들어갑니다.
    • {"action":"join"}
  • 아래의 명령어를 통해서 영어로 된 문자를 한글로 번역해서 보낼수있습니다.
    • {"action": "translateSend", "source": "en", "target": "ko", "message": "Hello world"}
    • source,target 언어를 변경하는것만으로도 언어를 달리해서 번역하여 보낼수있습니다.
  • 아래의 예시는 영어로 “Hello world”를 보냈을때 번역하여 다른 사용자들에게 보내주는 예시입니다.

Enter image description here

참고

[1] WebSocket API에 대한 라우팅 작업

https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/websocket-api-develop-routes.html

[2] wscat를 사용하여 WebSocket API에 연결하고 메시지 보내기

https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-how-to-call-websocket-api-wscat.html

1 댓글

웹소켓(gw) 구성 하고 람다에서 PostToConnection 시 아래 에러나 나네요 An error occurred (ForbiddenException) when calling the PostToConnection 해결 방안 알고 계실까요? 람다와 GW는 같은 VPC에 존재하고 있습니다.

답글을 게시함 2일 전