본문 바로가기
사이드 프로젝트/음악추천 챗봇 서비스

음악추천챗봇1. Serverless아키텍쳐 구성하기

by 카프리썬 2021. 6. 7.
728x90

이전에 왜 서버리스를 쓰는지 람다의 장단점까지 알아보았다.

이제 실제로 aws의 람다와 api gateway로 구성해보려고 한다. 

 

목표는 사용자가 카카오톡 챗봇 메세지를 전달하면 api gateway의 endpoint URL로 보내고,

트리거가 동작해 람다가를 수행하는 것이다. 

 

구성은 이런식이다.


그럼 AWS 서비스를 이용해서 구성해보자! 

- Lambda에서 lambda function 생성

나는 런타임으로 Python 3.8을 선택했따.

- API Gateway에서 REST API 생성

  • API 생성 : API 유형은 REST API를 선택한다.
  • 메소드생성 : 필요한 HTTP 메소드를 생성하고, 메소드를 통해 받은 request를 '람다'로 보내도록 설정한다.

일단 우리가 사용할 카카오 오픈빌더에서는 POST 메소드에 대해서만 request를 보낸다.  

그리고 카카오 오픈빌더에서는 lambda를 쓸 경우 http서버에 헤더를 권장하고 있다. 

람다가 실행할떄 http 헤어데 x-api-key를 확인해서 이 값이 등록된 key와 동일한지 확인하는 곳이다.

이떄, key가 같지 않다면 잘못된키로 들어온다면 403 forbidden 에러가 발생할 것이다. 

 

그래서 http헤데에 넣을 api key를 생성해야한다.

  • api key생성 : '메소드요청'에서 API 키 필요 true로 변경 -> API KEY 생성

이떄 받은 api 키를 기억해야한다. 나중에 메세지를 보낼때 헤더에 들어가는 값이기 때문이다.

 

  • API배포 : 이러한 변경사항을 저장하기 위해 API를 스테이지에 배포한다.

- 람다의 트리거로 API Gateway연결 

이제 람다의 트리거로 api 게이트웨이를 연결한다. 

즉, api 게이트웨이의 URL로 어떠한 요청이 들어오면 이제 람다가 동작하게 만드는 작업이다.

사실 API를 생성하면서 포인트를 람다로 지정했기 떄문에 이미 연결되어 있을 수도 있다.

하지만, 연결을 삭제하고 다시 일일이 연결해하는게 더 낫다. 

왜냐면 '보안' 부분때문이다. api KEY를 사용했기에 다시 보안부분을 'API 키'로 설정해줘야한다. 

사실 나는 람다를 생성하고, 바로 그자리에서 트리거를 API 게이트웨이로 추가하면서 API를 구성을 변경한다.

하지만 이런 방식으로 하다가 계쏙 안되는 상황이 있었다.

알고보니 원인은 트리거를 지정할 당시 배포단계 버전이 이전버전이였고, 심지어 보안부분도 설정이 되지 않았다.

그래서 만약에 나처럼 바로 람다를 생성하면서 API게이트웨이로 트리거를 추가하는 경우

API설정을 변경한 뒤에 다시 트리거를 연결해봐야한다. 

 

그리고 최종적으로 확인한 api 게이트웨이 트리거의 정보를 확인해본다.

 

 

 

렇게 되면 전체적인 flow는 이렇다.

카카오톡 메시지 request가 발생-> 챗봇에서 API Gateway에서 생성한 endpoint URL로 요청을 보냄 ->

API Gateway가 받음 -> 트리거 동작 -> 람다동작 -> 사용자한테 response 응답 

 


API Gateway와 Lambda로 API 만들기

람다와 API Gateway를 연결했으니 이제 API를 만들기 위한 큰 틀은 완료했다.

이제 어떤메소드를 어디로 받을 것이고, 어떻게 받을 것 인지를 구체적인 사항을 설정해줘야한다. 

 

어떤메소드(GET/POST 등 )로, 어디로 받을 것인가? : API Gateway

API gateway의 리소스나 메소드를 설정해줘야한다.

디폴트로 생성되는 메소드는 ANY인데 POST,GET 등 모든 메소드에 해당하는 요청을 다 받겠다는 뜻이다.

 

그리고 스테이지에 배포를 한 뒤 rquest를 보낼 엔드포인트를 찾아야한다. 

여기에서 주의해야할 점이 있다. 내가 늘 뻘짓을 하던 포인트이다.

사실 뻘짓을 막을방법은 그냥 트리거의 정보를 잘 살펴보면 된다......

 

request를 보낼 엔드포인트 스테이지 경로/리소스경로 까지 풀 URL이다. 

어쨌든 API Gatgeway를 통해 받은 최종 엔드포인트로 카카오 챗봇에서 HTTP request를 보낼 것이다. 

스테이지에 들어갔을때 보이는 ULR은 스테이지 경로까지
리소스의 경로에서 POST메소드에 해당하는 주소까지가 엔드포인트

 

받은 메세지를 어떻게 읽고, 어떻게 response할 것인가?  Lambda

위에서 설정한 API Gateway에 따라서 request가 들어오면 트리거가 동작해서 람다가 실행이 된다.

이때 메세지의 내용은 request의 body에 들어 있는데

 람다에서는 어떻게 request를 받아서 처리할 것인지에 대한 내용을 작성해주면 된다.

import json

def lambda_handler(event, context):

    # 메시지 내용은 request의 ['body']에 들어 있음
    request_body = json.loads(event['body'])
    params = request_body['action']['params']
    if 'group' in params:
        group = params['group'] # 그룹아티스트 파라미터
        result = {
        "version": "2.0",
        "template": {
            "outputs": [
                {
                    "simpleText": {
                        "text": "당신이 검색한 아티스트는 그룹-{}입니다.".format(group)
                    }
                }
            ]
        }
    }
    elif 'solo' in params:
        solo=params['solo']
        result = {
            "version": "2.0",
            "template": {
                "outputs": [
                    {
                        "simpleText": {
                            "text": "당신이 검색한 아티스트는 솔로-{}입니다.".format(solo)
                        }
                    }
                ]
            }
        }

    return {
        'statusCode':200,
        'body': json.dumps(result),
        'headers': {
            'Access-Control-Allow-Origin': '*',
        }
    }

몇가지 해당 코드를 설명하자면, 

POST메소드를 통해 response를 받기 때문에 body에 메세지가 들어있을 것이다. 

그리고 그 메세지를 일부 파싱하여 result라는 JSON형식으로 만든다. 

이 result는 결국 다시 body로 들어가는 응답메세지가 되는 것이다. 

 

이제 api 게이트웨이와 람다로 인해 request를 받을 준비가 완료되었다.

 

카카오 오픈빌더 -> API Gateway로 request로 보내기 

카카오 오픈빌더에는 '스킬서버'라는 개념이 등장한다.

스킬서버는 봇시스템에 메세지를 주고받는 서버로 보면 되는데

앞서 API게이트웨이와 람다로 구성한 것 자체가 '스킬서버'로 볼 수 있다.

 

이제 봇시스템과 메세지를 주고받게 연결해보자. 

 

카카오 오픈빌더에서 이 엔드포인트로 HTTP request를 보내보자.

카카오 챗봇을 위한 오픈빌더 설정은 아래에서 진행했다. 

2021.05.27 - Serverless 음악추천 챗봇서비스1- API 이해 | 카카오챗봇 설정하기

 

Serverless 음악추천 챗봇서비스1- API 이해 | 카카오챗봇 설정하기

카카오톡 채널생성 카카오톡 챗봇을 만들려면 2개를 만들어야한다. 1. 카카오톡 채널관리자센터에서 채널생성 2. 카카오 i오픈빌더에서 봇 생성 3. 봇을 채널에 연결 카카오채널 생성 카카오채널

pearlluck.tistory.com

 

카카오 오픈빌더에서 생성한 내 챗봇에서 -> '스킬'로 들어간다.

이제 request를 보내는 테스트를 해볼 수도 있다. 

  • URL주소 : API Gateway를 통해 받은 url주소. 즉 카카오 봇이 request를 보낼 엔드포인트 
  • 헤더값 : API KEY를 발급받았기 떄문에 헤더값에 x-api-key과 발급받은 key값 파라미터로 넣어준다. 

Request 확인

예를 들어보자. 요청할 파라미터값을 group으로 지정하고 BTS를 입력한다. 

즉, 이 상황은 카카오톡 챗봇을 통해 사용자가 BTS를 검색한 상황이다. 

  • 파라미터 값 입력 : 파라미터 key값 group , 파라미터 value BTS 또는 파라미터 key값 solo, 파라미터  value IU

그러면 JSON형식의 request 메세지를 확인할 수 있는데 이 메세지를 body에 넣어서 스킬서버에 보내는 것이다! 

BTS일떄
IU일떄

group과 name이라는 파라미터가 어디에서 나왔나?! 

앞서 카카오챗봇의 시나리오를 작성할떄, 파라미터를 지정하는 부분이 있었다. 

그때는 엔터디 그대로 파라미터명을 지정했는데, 코드의 가독성을 위해 이름을 바꾼 것이다.

  • 시나리오의 파라미터 설정에서 group 과 name으로 파라미터명을 수정했다. 
  • 그리고, 파라미터 설정 위에 '스킬선택'부분에서 위에서 저장한 스킬을 선택한다. 

 

Response 확인 

위에서 확인한 request를 바로 스킬서버로 전송한 결과를 확인할 수 있다. 

저렇게 request 메세지가 body안에 들어가 api 게이트웨이의 url로 보내지면

트리거가 동작해 람다에선 response메세지를 만든다. 그리고 그 response 메세지를 body에 싸셔 보낸 결과가 이렇다. 

response의 body에 들어가는 내용은 카카오 오픈빌더가 만든 JSON형태가 아니라 

앞서 lambda에서 내가 직접 지정한 result의 형태이다. 

 

카카오 봇 테스트

이제 api테스트까진 마쳤으니, 실제로 카카오 봇이 어떻게 대답하는지 확인해보자. 

봇 응답을 지정해야한다. '스킬데이터 사용'이라는 타입으로 지정한다.

이를 선택해서 사용하게 되면 response를 받은 형태로 카카오 챗봇의 답변을 수신받을 수 있는 것이다. 

그리고 실제 카카오톡에서 사용할 수 있는지 확인해보기 위해 '배포'를 진행한다. 

 

아, 그리고 한가지 잊은게 있다. 

배포를 하고 났는데도 실제로 카카오톡에서 서비스를 진행할 수 가 없었다.

알고보니 플러스친구랑 챗봇이 연결이 안되어 있었다..! 그래서 봇-설정-개인카카오톡채널 연결을 진행시켰다.

 

아..그런데도 왜 안되는것일까..

아무래도 스킬서버가 문제인것 같다. 파라미터를 스킬서버와 연결해제하면 봇 테스트는 된다.

아 알고보니 트리거 설정이 제대로 적용이 안되었었다... 

아니 왜이러는걸까.......계속 403 포비든이 떴따...으

결국 우선 api key를 없앴다. 

 

 

휴 일단 카카오톡 안에서 챗봇으로 연결하기는 완료되었다. 

아니 이거 그냥 환경세팅 프론트단에 불과한데 이렇게 오래걸릴일인가? 흑흑

메인은 스포티파이 api랑 연결하는건데 어쩜좋아..

 

 

 

출처

카카오 오픈빌더 개념 https://injekim97.tistory.com/177?category=935727

403 포비든 : https://aws.amazon.com/ko/premiumsupport/knowledge-center/api-gateway-vpc-connections/

api gateway 오류메시지 : https://aws.amazon.com/ko/premiumsupport/knowledge-center/api-gateway-403-error-lambda-authorizer/

 

카카오 오픈빌더 또다른 예시 https://yuda.dev/278

api gateway key 알아보기 https://digitalbourgeois.tistory.com/63

 

 

카카오오픈빌더에서 스킬서버만드는 가이드를 제공해주었다.

https://i.kakao.com/docs/skill-build#%EC%8A%A4%ED%82%AC-%ED%85%8C%EC%8A%A4%ED%8A%B8

 

오픈빌더 개요 · 카카오 i 오픈빌더 도움말

 

i.kakao.com

 

 


Lambda

람다는 이전에 serverless를 이해하면서 어느정도 파악했다.

그래서 이론적인 부분은 생략하고 바로 코드를 연결해보려고 한다. 그런데 UI가 좀 바꼈더라. 

 

일단 오늘의 목표는 카카오 챗보과 위 인프라구성의 연결이다. 

반응형

$(document).ready(function() { var $toc = $("#toc"); $toc.toc({content: ".tt_article_useless_p_margin", headings: "h2,h3,h4"}); });