해당 기사에서는 Lambda 와 API Gateway를 이용하여 다국어 그룹 채팅을 개발하는 방법에 대해 안내해드립니다.
사용 사례
API Gateway, Lambda 를 이용하여 소켓 통신을 할 수 있는 어플리케이션을 개발합니다. 본 기사에서는 간단한 설명을 위하여 wscat 을 이용하여 소캣 통신을 테스트 합니다. 사용자는 그룹에 들어가서 메시지를 보낼수 있으며 그룹의 모든 사용자가 받을수 있습니다. 또한 다양한 언어를 지닌 사용자를 고려하여 번역하여 메시지를 보낼수있는 채팅을 제공합니다.
1단계: Lambda 함수에 사용할 역할 생성하기
- IAM 페이지에서 [IAM 역할],[역할 만들기]를 클릭합니다.
- 일반사용사례 [lambda]를 클릭한뒤 아래의 정책을 추가합니다.
- AmazonAPIGatewayInvokeFullAccess ,TranslateFullAccess
- 역할 세부정보에서 역할의 이름을 임의로 지정하여 IAM 역할을 생성합니다.
2단계: Lambda 함수 생성
- [Lambda],[함수],[함수 생성] 을 클릭합니다.
- 함수 이름에는 Lambda_Chatting 을 넣은뒤에 런타임은 최신버전의 파이썬(3.11) 으로 선택합니다.
- [기본 실행 역할 변경],[기존 역할 사용]을 클릭하여 이전에 만들어둔 IAM권한으로 설정합니다.
3단계: API Gateway 생성
- API이름에 ChattingAPI를 입력합니다.
- [라우팅 선택 표현식]에 request.body.action를 입력합니다. [1]
- [미리 정의된 경로에] 경로 $connect, $disconnect, $default 를 추가합니다.
- [통합 연결]에서 아래와 같이 이전에 만든 Lambda 함수에 매핑을 해줍니다.
- [스테이지 추가] 기본 설정을 유지하고 [검토 및 생성]에서 [생성 및 배포]를 클릭합니다.
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을 설치합니다.
- 이후 아래의 명령어를 통해서 접속할수있습니다.
- 접속한뒤에는 아래의 명령어를 통해서 그룹에 들어갑니다.
- 아래의 명령어를 통해서 영어로 된 문자를 한글로 번역해서 보낼수있습니다.
- {"action": "translateSend", "source": "en", "target": "ko", "message": "Hello world"}
- source,target 언어를 변경하는것만으로도 언어를 달리해서 번역하여 보낼수있습니다.
- 아래의 예시는 영어로 “Hello world”를 보냈을때 번역하여 다른 사용자들에게 보내주는 예시입니다.
참고
[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