들어가며

지난글 (https://beoks.tistory.com/86)에선 API를 이용해서 AWS Lex와 대화할 수 있는 기능을 구현해보았습니다. 이번에는 발화 의도(Intent)를 업로드할 수 있는 API를 개발해보려고 합니다. 지난 글과 상당히 유사한 부분이 많기 때문에 이전 글을 많이 인용할 예정입니다.

1. 역할 생성

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

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

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

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

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

2. 람다 함수 생성

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

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

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 로 정의된 것을 알 수 있습니다. 이는 환경변수를 참조한다는 뜻입니다. 따라서 이에 맞는 환경변수를 입력해야 합니다.

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

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

3. BOT_VERSION은 봇의 특정 버전을 의미합니다. 의도를 업로드하고자 하는 봇의 버전을 선택합니다. 초안 버전의 경우 DRAFT를 입력하면 됩니다.

5. 테스트

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

  1. 람다 함수 테스트 → 테스트 이벤트에서 새로운 이벤트를 생성합니다.실행 결과를 확인해 테스트가 잘 수행되는것을 확인할 수 있습니다.

6. API Gateway 연결

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

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

7. API 배포

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

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

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

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

스테이지에 표시된 URL을 통해 요청을 수행하면 발화 의도를 업데이트하는 API 완성입니다!

+ Recent posts