AWS Lex를 Facebook, Slack 그리고 Twilio 같이 연결서비스를 제공하는 메시지 앱 이외의 서비스에 연결하고 싶은 경우 별도의 HTTP API 서버를 구현해야합니다. 여기에서는 그 과정에 대해서 서술하겠습니다.
1. 아키텍쳐
- 사용자는 메시징 앱을 통해서 텍스트를 입력합니다.
- 메시징 앱은 텍스트내용을 HTTP API 요청에 담아 AWS API Gateway에 전달합니다.
- AWS API Gateway는 요청 인증을 확인하고 이를 AWS Lambda에 전달합니다.
- AWS Lambda는 비즈니스 로직을 수행하고 Amazon Lex의 PostText API를 호출하여 통신을 수행합니다.
- 위 데이터 전달 과정을 역으로 수행하여 응답 결과를 사용자에게 전달합니다.
여기서는 MakeAppointment 예제 Lex 봇을 이미 생성했다고 가정하고 진행합니다.
2. 역할 생성
AWS Lex API 를 관리하기 위한 역할과 정책을 정의합니다. 여러 서비스를 이용하는 경우 각 서비스 마다 목적에 따라서 권한을 나누어 관리하는 것이 좋습니다. 권한을 정의할 정책과 정책을 적용한 역할을 만들어봅시다.
- IAM Console(https://console.aws.amazon.com/iam/) 에 루트 사용자로 로그인합니다.
- 엑세스 관리 > 역할 부분에서 역할 만들기를 선택합니다.
- 엔티티 선택에서 Lambda를 선택하고 다음을 클릭합니다.
- 권한 추가 단계는 생략합니다.
- 역할 생성이후 별도의 인라인 권한을 명시할 것이기 때문입니다.
- 역할 이름을 명시한 후 역할 생성 버튼을 클릭합니다.
- IAM 콘솔 > 엑세스 관리 > 역할에서 생성했던 역할 이름을 검색합니다.
- 권한 추가 > 정책 연결을 클릭합니다. (인라인으로 별도의 정책을 선언해 연결 할 수도 있습니다.)
-
여기에서 필요한 권한을 정책으로 등록할 수 있습니다. 지금은 편의를 위해 이미 존재하는 AmazonLexFullAccess 권한을 추가하겠습니다. 권한 정책 검색에서 해당 권한을 추가하고 체크 후 정책연결을 클릭해주세요.
3. 람다 함수 생성
AWS Lex 와 통신하기 위한 람다 함수를 생성합시다. 여기에서 이전에 정의한 역할을 사용합니다.
- AWS Lambda Console에 접속해서 함수 생성을 클릭합니다.
- 함수 이름 등 기본정보를 입력합니다. 여기서는 NodeJS를 사용해보겠습니다.
- 기본 실행 역할 변경에서 이전에 생성했던 역할을 선택합니다.
-
함수 생성을 클릭합니다.
4. 람다 함수 코드 업로드
이제 람다 함수에 사용할 API 코드를 작성해보겠습니다. 이 과정은 사용자 입력과 Lex 응답을 서로 전달하는 간단한 샘플 프로젝트로 진행됩니다.
- 샘플 프로젝트를 클론합니다.
- 프로젝트의 패키지를 설치합니다.
- cd AWS-Lex-Lambda-API-Server; npm install;
- 프로젝트를 압축합니다.
- zip -r project.zip . #For Mac user
- 이전에 생성한 람다 함수에서 코드 > 에서 업로드 > .zip 파일을 선택해 업로드합니다.
5. 람다 함수 환경 변수 설정
코드를 보면 일부 파라미터가 process.env 로 정의된 것을 알 수 있습니다. 이는 환경변수를 참조한다는 뜻입니다. 따라서 이에 맞는 환경변수를 입력해야 합니다.
- 선택한 람다 함수에서 → 구성 → 환경변수에 진입합니다.
- 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. 테스트
이제 전체적인 람다 함수에서 테스트를 해볼 수 있습니다.
- 람다 함수 테스트 → 테스트 이벤트에서 새로운 이벤트를 생성합니다.
- 실행 결과를 확인해 테스트가 잘 수행되는것을 확인할 수 있습니다.
7. API Gateway 연결
이제 람다 함수를 API Gateway 와 연결해 HTTPS 로 접근할 수 있도록 합시다.
- API Gateway 콘솔에서 REST API 생성을 클릭합니다.
- 리소스 → 작업 → 메서드 생성 → POST Method 를 생성합니다.
- 이전에 생성한 람다 함수와 연결합니다.
- 설정이 완료되면 메서드를 테스트 할 수 있습니다.
8. API 배포
API를 등록하고 테스트를 완료했다면 외부에서 접속하는 것을 허락하기 위해 배포를 진행할 수 있습니다.
- 리소스 → 작업 → 배포를 선택합니다.
- 적절한 스테이지를 설정합니다. 스테이지는 dev, test, QA, prod 등의 배포 단계를 의미합니다.)
- 스테이지 편집기에서 외부에서 API를 호출할 수 있는 URL을 흭득할 수 있습니다.
8. 최종 API 테스트
Postman Agent 를 이용해서 API를 아래와 같이 호출하면 응답이 잘 전달되는 것을 확인 할 수 있습니다.
관련 문서
- https://aws.amazon.com/ko/blogs/machine-learning/integrate-your-amazon-lex-bot-with-any-messaging-service/
- https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-lex-runtime-service/index.html
- https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-lex-runtime-v2/index.html
- https://docs.aws.amazon.com/lexv2/latest/dg/how-languages.html