들어가며
지난글 (https://beoks.tistory.com/86)에선 API를 이용해서 AWS Lex와 대화할 수 있는 기능을 구현해보았습니다. 이번에는 발화 의도(Intent)를 업로드할 수 있는 API를 개발해보려고 합니다. 지난 글과 상당히 유사한 부분이 많기 때문에 이전 글을 많이 인용할 예정입니다.
1. 역할 생성
AWS Lex API 를 관리하기 위한 역할과 정책을 정의합니다. 여러 서비스를 이용하는 경우 각 서비스 마다 목적에 따라서 권한을 나누어 관리하는 것이 좋습니다. 권한을 정의할 정책과 정책을 적용한 역할을 만들어봅시다.
- IAM Console(https://console.aws.amazon.com/iam/) 에 루트 사용자로 로그인합니다.
- 엑세스 관리 > 역할 부분에서 역할 만들기를 선택합니다.
- 엔티티 선택에서 Lambda를 선택하고 다음을 클릭합니다.
- 권한 추가 단계는 생략합니다.
- 역할 생성이후 별도의 인라인 권한을 명시할 것이기 때문입니다.
- 역할 이름을 명시한 후 역할 생성 버튼을 클릭합니다.
- IAM 콘솔 > 엑세스 관리 > 역할에서 생성했던 역할 이름을 검색합니다.
- 권한 추가 > 정책 연결을 클릭합니다. (인라인으로 별도의 정책을 선언해 연결 할 수도 있습니다.)
2. 람다 함수 생성
AWS Lex 와 통신하기 위한 람다 함수를 생성합시다. 여기에서 이전에 정의한 역할을 사용합니다.
- AWS Lambda Console에 접속해서 함수 생성을 클릭합니다.
- 함수 이름 등 기본정보를 입력합니다. 여기서는 NodeJS를 사용해보겠습니다.
- 기본 실행 역할 변경에서 이전에 생성했던 역할을 선택합니다.
3. 람다 함수 코드 업로드
이제 Lex를 다루기 위한 람다 함수 코드를 작성해보겠습니다. Lex V2 Models SDK (https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-lex-models-v2/index.html) 에서 Lex V2 를 관리하기 위한 API 를 확인할 수 있습니다.
1. npm init을 통해 새로운 NodeJS 프로젝트를 생성합니다.
2. npm install @aws-sdk/client-lex-models-v2 를 입력해 필요한 패키지를 설치합니다.
3. 이 패키지를 이용해 질문을하면 간단하게 초기 응답을 실행하는 의도를 생성하는 코드를 index.js에 작성합니다. 이 때, 의도의 이름(intentName)은 영어 또는 숫자를 사용해야만합니다. 저는 별도의 아이디를 생성하고 이를 질문과 응답과 함께 API에 전달한다고 가정하고 아래와 같이 코드를 작성했습니다. ( API 요청 형식이 궁금하다면 아래 5.테스트를 참고해주세요)
const { LexModelsV2Client, CreateIntentCommand } = require("@aws-sdk/client-lex-models-v2");
exports.handler = async (event, context, callback) => {
try {
const client = new LexModelsV2Client({ region: 'us-east-1' });
const qnAList=event
let response
for(let i=0;i<qnAList.length;i++){
const question=qnAList[i].question
const answer=qnAList[i].answer
const dataId=(qnAList[i].id).toString()
const initialResponseSetting ={
initialResponse:{
messageGroups:[
{
message:{
plainTextMessage: {
value:answer
}
}
}
]
}
}
const input = {
'botId':process.env.BOT_NAME,
'botVersion': process.env.BOT_VERSION,
'intentName': dataId,
'sampleUtterances':[{
utterance : question
}],
'initialResponseSetting':initialResponseSetting,
'localeId' : "ko_KR"
};
const command = new CreateIntentCommand(input);
response = await client.send(command);
}
callback(null,response.messages)
} catch(e) {
console.log(e);
callback(e);
}
};
4. 코드를 작성했다면, 람다에 업로드하기 위해 압축을 진행합니다.
zip -r project.zip . #For Mac user
4. 람다 함수 환경 변수 설정
코드를 보면 일부 파라미터가 process.env 로 정의된 것을 알 수 있습니다. 이는 환경변수를 참조한다는 뜻입니다. 따라서 이에 맞는 환경변수를 입력해야 합니다.
- 선택한 람다 함수에서 → 구성 → 환경변수에 진입합니다.
- BOT_NAME 은 연결하려는 봇의 아이디를 의미합니다. Lex Console 에서 봇을 선택하면 봇 ID를 확인할 수 있습니다.
3. BOT_VERSION은 봇의 특정 버전을 의미합니다. 의도를 업로드하고자 하는 봇의 버전을 선택합니다. 초안 버전의 경우 DRAFT를 입력하면 됩니다.
5. 테스트
이제 전체적인 람다 함수에서 테스트를 해볼 수 있습니다.
- 람다 함수 테스트 → 테스트 이벤트에서 새로운 이벤트를 생성합니다.실행 결과를 확인해 테스트가 잘 수행되는것을 확인할 수 있습니다.
6. API Gateway 연결
이제 람다 함수를 API Gateway 와 연결해 HTTPS 로 접근할 수 있도록 합시다.
- API Gateway 콘솔에서 REST API 생성을 클릭합니다.
- 리소스 → 작업 → 메서드 생성 → POST Method 를 생성합니다.
- 이전에 생성한 람다 함수와 연결합니다.
- 설정이 완료되면 메서드를 테스트 할 수 있습니다.
7. API 배포
API를 등록하고 테스트를 완료했다면 외부에서 접속하는 것을 허락하기 위해 배포를 진행할 수 있습니다.
- 리소스 → 작업 → 배포를 선택합니다.
- 적절한 스테이지를 설정합니다. 스테이지는 dev, test, QA, prod 등의 배포 단계를 의미합니다.)
- 스테이지 편집기에서 외부에서 API를 호출할 수 있는 URL을 흭득할 수 있습니다.