이번시간에는 Cloud9, Lambda, Rds, Chatgpt_API를 사용하여 기본적인 챗봇형식의 서비스 아키텍처를 구현해보겠습니다
먼저 완성된 웹 페이지는 아래와 같습니다
질의 응답 형식인 웹페이지 서비스이며 아키텍처는 아래와 같습니다
Lambda와 Chatgpt와 통신하도록 구성하였으며 해당 대화 내용들은 RDS에 저장되게 됩니다
아래의 구성들을 사용하게 됩니다
먼저 RDS 구성을 진행해보도록 하겠습니다
데이터베이스 생성 > 표준생성 > MySQL > 프리티어 를 선택합니다
그리고 DB 인스턴스 식별자를 입력합니다
DB 인스턴스 식별자의 경우 aws에서 고유해야 하므로 중복이 발생할 수 없습니다
DB에 사용되는 사용자 이름, 암호를 입력합니다
여기서 입력하는 사용자 이름, 암호는 데이터베이스에 연결 시 사용하는 username, password와 같은 역할을 하게 되며 꼭 기억할 수 있도록 합니다
퍼블릭 엑세스는 허용으로 해주시며 초기데이터베이스는 notes
로 해줍니다 (이번 프로젝트에 notes라는 데이터베이스가 존재하여 초기 생성시 이름을 작성하면 먼저 해당 이름으로 데이터베이스를 생성하여 줍니다)
이후 값들은 기본설정으로 유지하여 RDS를 생성합니다
Cloud9에서 환경생성을 통해 EC2 생성 및 연결을 진행합니다
아래와 같이 설정을 진행합니다
생성을 진행하면 Cloud9 IDE 탭을 통해 웹 형태의 IDE를 보실 수 있으며 해당 IDE를 통해 개발이 가능합니다
git clone을 통해 소스코드를 먼저 다운로드 받아줍니다
(이번 프로젝트에는 react와 node.js를 사용합니다)
git clone https://github.com/glen15/aws_foundation.git
이후 step5/server 폴더로 이동 후 서버실행을 위한 의존성 설치를 진행해줍니다
npm install
이후 .env 파일에서 아래와 같이 환경변수를 설정해줍니다
DB_HOST="**.ap-northeast-2.rds.amazonaws.com"
DB_USER="00"
DB_PW="00"
DB_NAME="notes"
LAMBDA_URL="**.lambda-url.ap-northeast-2.on.aws"
.env 파일 설정을 올바르게 한 뒤 server 실행을 하게 되면 아래와 같이 정상적으로 실행되는 것을 확인할 수 있습니다
이때 DB_HOST에는 이전에 생성한 RDS의 endpoints를 넣어주면 됩니다
이후 정상적으로 실행 되면 서버와 RDS가 연동이 된 것을 확인할 수 있습니다
sudo node server.js
/step5/client 경로로 이동합니다
해당 폴더에서 .env 파일에서 아래와 같이 백엔드 서버로의 url을 작성하여 줍니다
REACT_APP_API_URL=http://3.38.196.72
.env 설정을 마친 후 server때와 같이 클라이언트 의존성을 설치합니다
npm install
이후 빌드파일을 S3로 업로드 하기 위해 먼저 빌드를 실행합니다
npm run build
server의 경우 실행가능한 환경이지만 client는 정적 웹페이지를 보여주기 위함이므로 파일형태로 S3에 업로드 후 배포 URL에 접속하면 해당 웹페이지를 띄워주기 위함으로 빌드파일을 S3에 업로드 함
빌드한 zip 파일을 다운로드 후 압축을 풀어줍니다
S3를 생성합니다
테스트용도이므로 퍼블릭 엑세스 차단을 해제하여줍니다
이후 기본 설정값으로 버킷만들기를 진행합니다
이제는 버킷 권한 및 정책설정으로 들어갑니다
권한탭 -> 버킷정책 -> 편집 탭으로 들어갑니다
버킷의 ARN을 복사한 뒤 정책생성기에 들어가서 정책을 만들준비를 합니다
S3 버킷에서 객체를 가져오기 위함으로 Actions에서 Get Object
를 선택하며 Principal을 * 로 설정해주도록 합니다
이후 Generate Policy를 통해 정책을 생성 및 복사를 하여 아래의 버킷 정책 편집에서 정책생성을 진행합니다
S3에서 정적 웹 페이지 호스팅을 하기 위해 호스팅 허용을 진행합니다
S3 > 버킷 > 인스턴스탭으로 들어간 뒤 속성탭을 클릭합니다
이후 정적웹 사이트 호스팅 탭에서 편집에서
활성화, 인덱스 문서를 아래와 같이 작성합니다
활성화가 완료되면 이후 객체탭에서 이전에 빌드파일을 다운로드한 폴더에서 해당 폴더 내용들을 그대로 업로드를 진행합니다
여기까지 진행하게 되면 S3와 인스턴스가 연결되어 속성탭 하단 -> 정적 웹 사이트 호스팅 -> 주소를 링크로 접속하면 index.html 정적 파일을 읽어들여 웹 화면이 보여지게 됩니다
우선 여기까지 진행한 뒤 sudo node server.js
서버 실행 명령어를 통해 S3-client-server-RDS 테스트를 진행해보도록 합니다
아래와 같이 서버로그로도(이전에 세팅한) 확인할 수 있으며 질문글이 잘 생성되면 성공한 것입니다
이제 Lambda를 생성해보도록 하겠습니다
/step5/lambda 에서 폴더 내부의 index.zip 파일을 다운받습니다
Lambda > 함수생성 을 통해 Lambda 생성을 진행합니다
새로 작성 > 함수이름 입력 을 한 뒤 함수생성을 진행합니다
다운받은 index.zip 파일을 그대로(압축해제하지 않고) 업로드 합니다
Lambda의 경우 제한시간이 default로 3초로 설정이 되어있습니다 하지만 Chatgpt의 경우 응답시간이 3초가 초과되는 경우가 발생합니다 따라서 제한시간을 15분으로 설정합니다
EC2(EC2는 서버가 실행되어 있는 만큼 비용발생)와는 다르게 Lambda는 trigger 형식으로 실행되며 함수가 호출되는 만큼만 비용이 발생하게 됩니다
이때 최대 호출 가용시간은 15분으로 제한되어있습니다
이후 Chatgpt를 사용하기 위해 환경변수를 등록합니다
환경변수 > 편집
- 여기서 OPENAI_API_KEY 는 AWS로부터 제공받았습니다
이후 EC2에서 Lambda로의 연결을 위해 Lambda URL을 생성합니다
구성탭 > 함수 URL > 함수 URL 생성
None 선택후 저장합니다
이후 함수 URL을 복사한 뒤 step5/server 폴더 내부의 .env 파일에서 아래와 같이 LAMBDA_URL에 넣어줍니다
설정값이 변경되었기 때문에 서버를 재실행해줍니다
이제는 모든 시스템 구성을 마쳤습니다
웹사이트로 접속한 뒤 질문을 등록 한 뒤 AI 조언 요청 을 누르게 되면 Lambda를 통해 Chatgpt로 요청이 가게 되며 이는 Lambda 로그를 통해 아래와 같이 요청, 응답을 확인할 수 있습니다
Lambda > 모니터링 탭 > CloudWatch Logs 보기 > 로그스트림
Chatgpt, Lambda 에서 응답을 받게되면 아래와 같이 확인이 웹에서 확인 할 수 있습니다
이로써
을 하게 되었습니다
Serverless란 ?
그렇다면 Serverless의 형태 중 하나인
Lambda
는 오류를 발생할까요 ?아닙니다, 애플리케이션 내에서는 오류가 발생할 수 있지만 서버에서는 에러를 발생시키지 않습니다