AWS Lex를 Facebook, Slack 그리고 Twilio 같이 연결서비스를 제공하는 메시지 앱 이외의 서비스에 연결하고 싶은 경우 별도의 HTTP API 서버를 구현해야합니다. 여기에서는 그 과정에 대해서 서술하겠습니다.

1. 아키텍쳐

  1. 사용자는 메시징 앱을 통해서 텍스트를 입력합니다.
  2. 메시징 앱은 텍스트내용을 HTTP API 요청에 담아 AWS API Gateway에 전달합니다.
  3. AWS API Gateway는 요청 인증을 확인하고 이를 AWS Lambda에 전달합니다.
  4. AWS Lambda는 비즈니스 로직을 수행하고 Amazon Lex의 PostText API를 호출하여 통신을 수행합니다.
  5. 위 데이터 전달 과정을 역으로 수행하여 응답 결과를 사용자에게 전달합니다.

여기서는 MakeAppointment 예제 Lex 봇을 이미 생성했다고 가정하고 진행합니다.

2. 역할 생성

AWS Lex API 를 관리하기 위한 역할과 정책을 정의합니다. 여러 서비스를 이용하는 경우 각 서비스 마다 목적에 따라서 권한을 나누어 관리하는 것이 좋습니다. 권한을 정의할 정책과 정책을 적용한 역할을 만들어봅시다.

  1. IAM Console(https://console.aws.amazon.com/iam/) 에 루트 사용자로 로그인합니다.
  2. 엑세스 관리 > 역할 부분에서 역할 만들기를 선택합니다.

  1. 엔티티 선택에서 Lambda를 선택하고 다음을 클릭합니다.

  1. 권한 추가 단계는 생략합니다.
  2. 역할 생성이후 별도의 인라인 권한을 명시할 것이기 때문입니다.
  3. 역할 이름을 명시한 후 역할 생성 버튼을 클릭합니다.
  4. IAM 콘솔 > 엑세스 관리 > 역할에서 생성했던 역할 이름을 검색합니다.
  5. 권한 추가 > 정책 연결을 클릭합니다. (인라인으로 별도의 정책을 선언해 연결 할 수도 있습니다.)

  1. 여기에서 필요한 권한을 정책으로 등록할 수 있습니다. 지금은 편의를 위해 이미 존재하는 AmazonLexFullAccess 권한을 추가하겠습니다. 권한 정책 검색에서 해당 권한을 추가하고 체크 후 정책연결을 클릭해주세요.

3. 람다 함수 생성

AWS Lex 와 통신하기 위한 람다 함수를 생성합시다. 여기에서 이전에 정의한 역할을 사용합니다.

  1. AWS Lambda Console에 접속해서 함수 생성을 클릭합니다.
  2. 함수 이름 등 기본정보를 입력합니다. 여기서는 NodeJS를 사용해보겠습니다.
  3. 기본 실행 역할 변경에서 이전에 생성했던 역할을 선택합니다.

  1. 함수 생성을 클릭합니다.

4. 람다 함수 코드 업로드

이제 람다 함수에 사용할 API 코드를 작성해보겠습니다. 이 과정은 사용자 입력과 Lex 응답을 서로 전달하는 간단한 샘플 프로젝트로 진행됩니다.

  1. 샘플 프로젝트를 클론합니다.
    1. git clone https://github.com/BEOKS/AWS-Lex-Lambda-API-Server.git
  2. 프로젝트의 패키지를 설치합니다.
    1. cd AWS-Lex-Lambda-API-Server; npm install;
  3. 프로젝트를 압축합니다.
    1. zip -r project.zip . #For Mac user
  4. 이전에 생성한 람다 함수에서 코드 > 에서 업로드 > .zip 파일을 선택해 업로드합니다.
 

5. 람다 함수 환경 변수 설정

코드를 보면 일부 파라미터가 process.env 로 정의된 것을 알 수 있습니다. 이는 환경변수를 참조한다는 뜻입니다. 따라서 이에 맞는 환경변수를 입력해야 합니다.

  1. 선택한 람다 함수에서 → 구성 → 환경변수에 진입합니다.

  1. BOT_NAME 은 연결하려는 봇의 아이디를 의미합니다. Lex Console 에서 봇을 선택하면 봇 ID를 확인할 수 있습니다.

3. BOT_ALIAS은 특정 버전을 연결하는 봇의 별칭을 의미합니다. Lex Console → 배포 → 별칭에서 특정 별칭을 생성하거나 선택해 확인할 수 있습니다.

 

4. BOT_LOCALE 은 지원 언어를 의미합니다. https://docs.aws.amazon.com/lexv2/latest/dg/how-languages.html 에서 지원하는 언어 코드를 찾아 입력할 수 있습니다. 현재는 봇을 한국어로 설정했으므로 ko_KR을 입력합니다.

6. 테스트

이제 전체적인 람다 함수에서 테스트를 해볼 수 있습니다.

  1. 람다 함수 테스트 → 테스트 이벤트에서 새로운 이벤트를 생성합니다.

  1. 실행 결과를 확인해 테스트가 잘 수행되는것을 확인할 수 있습니다.

7. API Gateway 연결

이제 람다 함수를 API Gateway 와 연결해 HTTPS 로 접근할 수 있도록 합시다.

  1. API Gateway 콘솔에서 REST API 생성을 클릭합니다.
  2. 리소스 → 작업 → 메서드 생성 → POST Method 를 생성합니다.
  3. 이전에 생성한 람다 함수와 연결합니다.
  4. 설정이 완료되면 메서드를 테스트 할 수 있습니다.

8. API 배포

API를 등록하고 테스트를 완료했다면 외부에서 접속하는 것을 허락하기 위해 배포를 진행할 수 있습니다.

  1. 리소스 → 작업 → 배포를 선택합니다.

  1. 적절한 스테이지를 설정합니다. 스테이지는 dev, test, QA, prod 등의 배포 단계를 의미합니다.)

  1. 스테이지 편집기에서 외부에서 API를 호출할 수 있는 URL을 흭득할 수 있습니다.

8. 최종 API 테스트

Postman Agent 를 이용해서 API를 아래와 같이 호출하면 응답이 잘 전달되는 것을 확인 할 수 있습니다.

 

관련 문서

  1. https://aws.amazon.com/ko/blogs/machine-learning/integrate-your-amazon-lex-bot-with-any-messaging-service/
  2. https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-lex-runtime-service/index.html
  3. https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-lex-runtime-v2/index.html
  4. https://docs.aws.amazon.com/lexv2/latest/dg/how-languages.html

+ Recent posts